zoukankan      html  css  js  c++  java
  • 输入初始单纯形表后的单纯形程序,线性规划 未写完

    虽然学了单纯形,但学得很差,终于看着书把最简单的例子给写出来了,对不起白老师啊(教我们运筹学的老师)。

    该程序执行的初试条件是自己把初试单纯形表搞出来,本程序只负责进行迭代,(偷笑)。

    唉,希望有人能得到帮助,本来做这个题是为了去解一个线性规划的题的,但感觉有点麻烦,还是先歇着吧,看以后变强了再来A这个实数幻方的题

    该题链接:http://122.207.68.93/OnlineJudge/problem.php?cid=2031&pid=9

    Problem J: Real Numbers Magic Square

    咳咳,以后再说吧

    贴代码:

    View Code
      1 //这里在找进基变量和出基变量时有时会出现死循环,尽管概率很低
      2 //可以使用勃兰特规则,该程序没有写,勃兰特规则自己百度,或参考运筹学教材,清华大学出版社出版,36页,退化那一块
      3 #include <cstdio>
      4 #define MAXN 100
      5 #define INF 0x7fffffff
      6 int ind ,outd;
      7 double a[MAXN][MAXN];
      8 double cb[MAXN],b[MAXN];
      9 int xb[MAXN],nxb[MAXN];
     10 double theta[MAXN],c[MAXN];
     11 int n,m;
     12 void init()
     13 {
     14     for(int i=1; i<=m; ++i)
     15         for(int j=1; j<=n; ++j)
     16             scanf("%lf",&a[i][j]);
     17     for(int i=1; i<=n; ++i)
     18         scanf("%lf",&c[i]);
     19     for(int i=1; i<=m; ++i)
     20         scanf("%lf%d%lf",&cb[i],&xb[i],&b[i]);
     21     for(int i=1; i<=n-m; ++i)
     22         scanf("%d",&nxb[i]);
     23 }
     24 void print()
     25 {
     26     for(int i=1; i<=m; ++i)
     27     {
     28         for(int j=1; j<=n; ++j)
     29         {
     30             printf("a[%d][%d] = %lf ",i,j,a[i][j]);
     31         }
     32         puts("");
     33     }
     34 //    for(int i=1; i<=n; ++i)
     35 //    {
     36 //        printf("c[%d] = %lf ",i,c[i]);
     37 //    }
     38 //    puts("");
     39     for(int i=1; i<=m; ++i)
     40     {
     41         printf("cb[%d] = %lf xb[%d] =%d b[%d] = %lf\n",i,cb[i],i,xb[i],i,b[i]);
     42     }
     43     for(int i=1; i<=n-m; ++i)
     44     {
     45         printf("nxb[%d] = %d\n",i,nxb[i]);
     46     }
     47 }
     48 int findInVarible()//找进基变量
     49 {
     50     double max = 0;
     51     ind = -1;
     52     for(int i=1; i<=n-m; ++i)
     53     {
     54         int j = nxb[i];
     55         double sig = c[j];
     56         for(int k =1; k<=m; ++k)
     57         {
     58             sig -= cb[k]*a[k][j];
     59         }
     60         bool flag = true;
     61         if(sig > 0)
     62         {
     63             for(int k=1; k<=m; ++k)
     64             {
     65                 if(a[k][j] > 0)
     66                 {
     67                     flag = false;
     68                     break;
     69                 }
     70             }
     71             if(flag) return -2;//出现无界解
     72             if(sig > max)
     73             {
     74                 printf("sig = %lf\n",sig);
     75                 max = sig;
     76                 ind  = i;
     77             }
     78         }
     79     }
     80     return ind;
     81 }
     82 int findOutVarible()//找出基变量
     83 {
     84     double min = INF;
     85     outd = -1;
     86     int j = nxb[ind];
     87     for(int k=1; k<=m; ++k)
     88     {
     89         if(a[k][j] > 0 && b[k]/a[k][j] < min)
     90         {
     91             min = b[k]/a[k][j] ;
     92             outd = k;
     93             printf("theta = %lf\n",min);
     94         }
     95     }
     96     return outd;
     97 }
     98 void Guass(int x,int y)//高斯变换化进基变量所在列为单位向量
     99 {
    100     double de = a[y][x];
    101     for(int j = 1; j<=n; ++j)
    102         a[y][j] = a[y][j]/de;
    103     b[y] = b[y]/de;
    104     for(int i=1; i<=m; ++i)
    105     {
    106         if(i == y) continue;
    107         de = a[i][x];
    108         for(int j=1; j<=n; ++j)
    109             a[i][j] =a[i][j]-a[y][j]*de;
    110         b[i] =b[i]-b[y]*de;
    111     }
    112 }
    113 int main()
    114 {
    115 //    freopen("in.cpp","r",stdin);
    116 //    freopen("out.cpp","w",stdout);
    117     while(~scanf("%d%d",&m,&n))
    118     {
    119         init();//建立初始单纯形表,这里为了简化,直接输入的就是已经初试化好了的单纯形表
    120         print();
    121         int ind,outd;//进基变量和出基变量的序号
    122         while(1)
    123         {
    124             ind = findInVarible();
    125             if(ind == -2 || ind == -1) break;
    126             outd = findOutVarible();
    127             printf("ind = %d outd = %d\n",nxb[ind],xb[outd]);
    128             Guass(nxb[ind],outd);
    129             int tmp = nxb[ind];
    130             nxb[ind] = xb[outd];
    131             xb[outd] = tmp;
    132             cb[outd] = c[tmp];
    133             print();
    134         }
    135         if(ind == -2) printf("No solution\n");
    136         else
    137         {
    138             double sum = 0;
    139             for(int i=1; i<=m; ++i)
    140                 sum += cb[i]*b[i];
    141             printf("sum = %lf\n",sum);//输出最后的解
    142         }
    143     }
    144     return 0;
    145 }
  • 相关阅读:
    Sql与Asp.Net数据类型对应
    EditPlus 使用技巧集萃
    VB.NET and C# Comparison
    测试后行之CodeSmith模板
    ASP.NET需要改进的地方
    LeetCode: Minimum Path Sum
    LeetCode: Merge k Sorted Lists
    LeetCode: Merge Intervals
    LeetCode: Maximum Subarray
    LeetCode: Median of Two Sorted Arrays
  • 原文地址:https://www.cnblogs.com/allh123/p/3049571.html
Copyright © 2011-2022 走看看