单纯形算法(Simplex Method)

 

  
  
  
  
  1. #include<iostream>  
  2. #define N1 4  
  3. #define N2 6  
  4. #define INF -100000  
  5. #define MAX 100000  
  6. using namespace std;  
  7. //约束条件系数   
  8. double a[N1][N2] = {{0},{0,1,-2,1,0,0},  
  9.                         {0,0,1,-3,1,0},  
  10.                         {0,0,1,-1,0,1}};  
  11. double b[N1] = {0,2,1,2}; // 向量b   
  12.  
  13. double e[N2] = {0,0,1,-2,0,0};//检验数向量   
  14. double RHS = 0;//目标函数值    
  15. int x[N1] = {0,0,0,0}; // 存放基本可行解   
  16. // 找出初值解    
  17. void BeginOne()  
  18. {  
  19.     //进行列搜索, 得到初始解   
  20.     bool y[N2] = {0};  
  21.     //int num = 1;  
  22.     int index = 0;  
  23.     for(int j=1; j<N2; ++j){  
  24.       int cnt = 0;  
  25.      for(int i=1; i<N1; ++i)  
  26.       if(a[i][j]){  
  27.          ++cnt;  
  28.          index = i;  
  29.        }  
  30.       if(cnt==1&&y[j]==0){  
  31.         x[index] = j;      
  32.         y[j] = 1;  
  33.       }  
  34.     }  
  35.     cout<<"得到初始基本可行解为:"<<endl;  
  36.     for(int i=1; i<N1; ++i)  
  37.         cout<<"x("<<x[i]<<")"<<" = "<<b[i]/a[i][x[i]]<<endl;  
  38. }  
  39. void GetFirstForm()  
  40. {  
  41.      double tmp = 0;  
  42.      for(int j=1; j<N1; ++j)  
  43.          if(e[x[j]]!=0){  
  44.          for(int i=1; i<N2; ++i){  
  45.               tmp = e[x[j]];  
  46.              e[i] -=   tmp*a[j][i];  
  47.             }  
  48.          RHS -= tmp*b[j];          
  49.      }  
  50. }  
  51. int CheckVector()  
  52. {  
  53.     bool IsNegative = 1;   
  54.     bool IsEnd = 1;  
  55.     for(int i=1; i<N2; ++i)  
  56.        if(e[i]>0){  
  57.          IsNegative = 0;  
  58.          for(int j=1; j<N1; ++j)  
  59.            if(a[j][i]>0)  
  60.              IsEnd = 0;  
  61.          if(IsEnd){  
  62.            cout<<"此LP问题无界!"<<endl;  
  63.            return 0;  
  64.          }  
  65.        }  
  66.    if(IsNegative){  
  67.       cout<<"迭代得到一个最优解:RHS = "<<RHS<<endl;  
  68.       for(int i=1; i<N1; ++i)  
  69.         cout<<"x("<<x[i]<<")"<<" = "<<b[i]/a[i][x[i]]<<endl;  
  70.        return 0;  
  71.    }  
  72.    return 1;  
  73. }  
  74. int MaxEj()  
  75. {  
  76.     double max = INF;  
  77.     int index = 0;  
  78.     for(int i=1; i<N2; ++i)  
  79.       if(max<e[i]){  
  80.         max = e[i];  
  81.         index = i;  
  82.       }     
  83.       return index;  
  84. }  
  85. int main()  
  86. {  
  87.     BeginOne();  
  88.     //得到第一张单纯行表  
  89.     GetFirstForm();  
  90.     cout<<"The First Form Of Simplex Method:"<<endl;  
  91.     cout<<"Vec  ";  
  92.     for(int i=1; i<N2; ++i)  
  93.       cout<<e[i]<<" ";  
  94.       cout<<RHS<<endl;  
  95.     for(int i=1; i<N1; ++i){  
  96.       cout<<"x("<<x[i]<<") ";  
  97.       for(int j=1; j<N2; ++j)  
  98.         cout<<a[i][j]<<" ";  
  99.       cout<<b[i]<<endl;  
  100.     }  
  101.     /*循环得出最优解*/ 
  102.     while(CheckVector()){  
  103.       int ej = MaxEj();  
  104.       double min = MAX;  
  105.       int Xiout = 0;  
  106.       //找到最小的b(i)/a(i)(ej)  
  107.       for(int i=1; i<N1; ++i)  
  108.         if(a[i][ej]>0&&min>b[i]/a[i][ej]){  
  109.            min = b[i]/a[i][ej];  
  110.            Xiout = i;  
  111.         }  
  112.         x[Xiout] = ej;  
  113.         for(int i=1; i<N2; ++i)  
  114.           if(ej!=i){ /*ej=Xiout Error Failed*/ 
  115.            a[Xiout][i] = a[Xiout][i]/a[Xiout][ej];  
  116.            }  
  117.         /*Error will be found*/ 
  118.         b[Xiout]/=a[Xiout][ej];  
  119.         a[Xiout][ej] = 1;  
  120.         //化检验数向量  
  121.         double tmp = e[ej];  
  122.         for(int i=1; i<N2; ++i)  
  123.            e[i] -= tmp*a[Xiout][i];  
  124.         RHS -= tmp*b[Xiout];  
  125.         for(int i=1; i<N1; ++i){  
  126.           if(i!=Xiout){  
  127.            tmp = a[i][ej];  
  128.           for(int j=1; j<N2; ++j)  
  129.             a[i][j] -= tmp*a[Xiout][j];  
  130.           b[i] -= tmp*b[Xiout];  
  131.           }  
  132.         }  
  133.     }  
  134.     system("pause");  
  135.     return 0;  
  136. }  

你可能感兴趣的:(职场,method,simple,休闲)