单纯形法

来源:互联网 发布:1.5斤麒麟鞭弹簧垫数据 编辑:程序博客网 时间:2024/05/29 13:37

原博客:
http://blog.csdn.net/zhoubin1992/article/details/46916429

计算步骤:
http://www.doc88.com/p-7495430586060.html
http://www.docin.com/p-1260942683.html

根据自己的理解加上了注释

/*----------------------------------- 单纯形法求解线性规划问题(C++实现代码)----------------------------------- Author:牧之丶  Date:2014年Email:bzhou84@163.com **********************************/ #include<iostream> #include<math.h> using namespace std;#define INF 10000        // 全局变量大值// 核心矩阵表 // 第0行为目标函数// 后n行为约束不等式,0列为不等式右边的常数项,1~m列为系数,m+1~m+n列为基// 第n+1行为非基变量对应的检验数float juzhen[11][31];  int m = 0;             // m:结构向量的个数int n = 0;             // n:约束不等式个数int t = 0;             // t:目标函数类型:-1代表求求最小值,1代表求最大值     // 输入接口函数                     void input() {       int i,j;     cout << "----------单纯形法的参 数 输 入-----------" << endl;     cout << "请按提示输入下列参数:" << endl << endl;     cout << "  结构向量数m:  " << "   m=  ";     cin >> m;     cout << endl << "  约束不等式数n:" << "   n=  ";     cin >> n;     //初始化矩阵,所有元素均为0    for (i=0; i<=n+1; i++)     {        for (j=0; j<=m+n+n; j++)              juzhen[i][j] = 0;          }    //读入约束条件     cout << endl << "  约束方程矩阵的系数及不等式方向(1代表<=,-1代表>=):" << endl << endl <<"          ";     for (i=1; i<=m; i++)         cout << "   x" << i;     cout << "  不等式方向 " << " 常数项" << endl;     for(i=1; i<=n; i++)      {          cout << "    不等式" << i << "  ";         for (j=1; j<=m+2; j++)              cin >> juzhen[i][j];     }     for(i=1; i<=n; i++)     {          juzhen[i][0] = juzhen[i][m+2];         juzhen[i][m+2] = 0;     }     //读入目标条件     cout << endl << endl << " 目标函数的系数及类型(求最小值:1;求最大值:-1):" << endl << endl <<"                ";     for(i=1; i<=m; i++)     {        cout << "x" << i << "   ";     }    cout << "类型" << endl << "  ";     cout << "  目标函数:   ";     for(i=1; i<=m; i++)     {        cin >> juzhen[0][i];   // 目标函数系数    }    cin >> t;                  // 目标函数类型    // 目标函数调整     if(t == -1)      {        for(i=1; i<=m; i++)              juzhen[0][i] = (-1) * juzhen[0][i];     }    // 初始基调整    for(i=1; i<=n; i++)     {          juzhen[i][m+i] = juzhen[i][m+1];   // 根据不等式方向调整        if(i != 1)             juzhen[i][m+1] = 0;          } } //算法函数 void comput() {     int i, j, flag, temp1, temp2, h, k=0, temp3[10];     float a, b[11], temp;    float C_b[11];      // 基/非基变量在目标函数中的系数向量    float X[11];        // 最优解    float f = 0;        // 最优结果    float aa, d, c;     //初始化     for(i=1; i<=n; i++)      {        temp3[i]=0;     }    for(i=0; i<11; i++)     {            C_b[i] = 0;         X[i] = 0;     }     // 对基变量处理    for(i=1; i<=n; i++)     {         if(juzhen[i][m+i] == -1)              {             juzhen[i][m+n+i] = 1;                 juzhen[0][m+n+i] = INF;   // 在目标函数中的系数            temp3[i] = m+n+i;                 }         else          {            temp3[i] = m+i;         }    }     for(i=1; i<=n; i++)     {        C_b[i] = juzhen[0][temp3[i]];  // 在目标函数中的系数    }    //循环求解目标函数的最小值    do    {            // 求非基变量的检验数        for(i=1; i<=m+n+n; i++)         {               a = 0;             for(j=1; j<=n; j++)             {                a += juzhen[j][i] * C_b[j];     // 系数列 * 基变量在目标函数中的系数向量            }            juzhen[n+1][i] = juzhen[0][i] - a;  // 非基变量的检验数        }         int flag = 1;        for(i=1; i<=m+n+n; i++)         {             if(juzhen[n+1][i] < 0)               {                   flag = -1;                 break;             }         }         // 对于求最小值        // 如果非基变量检验数均 > 0        if(flag == 1)          {                 // 是否存在最优解            temp1 = 1;            for(i=1; i<=n; i++)             {                  if(temp3[i] > m+n)  // 这里不明白 !!!                {                      temp1 = -1;                     break;                 }             }             //输出结果             cout << endl << endl;             cout << "----------结 果 输 出-----------"<<endl<<endl;             // 对于求最小值            // 如果所有非基变量检验数均 > 0            // 且不存在无最优解的情况            // 那么该基可行解为最优解            if(temp1 == 1)             {                  cout << " 此线性规划的最优解存在!" << endl << endl << "  最优解为:" << endl << endl << "     ";                 for(i=1; i<=n; i++)                 {                    X[temp3[i]] = juzhen[i][0];                 }                for(i=1; i<=m; i++)                 {                    f += t * juzhen[0][i] * X[i];                 }                for(i=1; i<=m; i++)                  {                     cout << "x" << i << " = " << X[i];                     if(i != m)                         cout<<", ";                 }                 cout << " ;" << endl << endl << "     最优目标函数值f= " << f << endl << endl;                 return ;             }             // 如果存在无最优解情况            else              {                    cout << " 此线性规划无解" << endl << endl;                 return ;             }         }         // 对于求最小值        // 如果存在检验数 <= 0        // 那么该基可行解不是最优解        // 继续寻找另一个基可行解        if(flag == -1)         {                // 挑选检验数最小的为进基变量            temp = INF;             for(i=1; i <= m+n+n; i++)             {                if(juzhen[n+1][i] < temp)                     {                     temp = juzhen[n+1][i];                     h = i;                                     }             }            for(i=1; i<=n; i++)             {                  if(juzhen[i][h] <= 0)                     temp2 = 1;                 else                 {                      temp2 = -1;                     break;                 }                                    }         }         if(temp2 == 1)           {              cout << "此线性规划无约束";             return;         }         if(temp2 == -1)          {                // 挑选出基变量            c = INF;             for(i=1; i<=n; i++)             {                 if(juzhen[i][h] != 0)                      b[i] = juzhen[i][0] / juzhen [i][h];                 if(juzhen[i][h] == 0)                      b[i] = INF;                 if(b[i] < 0)                         b[i] = INF;                 if(b[i] < c)                  {                     c = b[i];                     k = i;                 }             }             temp3[k] = h;             C_b[k] = juzhen[0][h];             d = juzhen[k][h];   // 主元            // 希望基变量对应的系数列向量矩阵为单位矩阵            // 在主元所在的约束不等式中,希望其系数为1            for(i=0; i<=m+n+n; i++)                 juzhen[k][i] = juzhen[k][i] / d;             // 改变别的约束不等式系数            for(i=1; i<=n; i++)             {                 if(i == k)                      continue;                 aa = juzhen[i][h];                 for(j=0; j<=m+n+n; j++)                     juzhen[i][j] = juzhen[i][j] - aa * juzhen[k][j];              }         }         }while(1);     return; }int main(){       cout<<"-------------------单纯形算法程序----------------------"<<endl<<endl;     input();     comput();    system("pause");    return 0;}
0 0
原创粉丝点击