单纯形法
来源:互联网 发布: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
- 单纯形法
- 单纯形法
- 单纯形法
- 单纯形法 学习
- 单纯形法
- 单纯形法
- ##单纯形法##
- 单纯形法
- 线性规划--单纯形法
- 单纯形法简介
- 单纯形法
- 单纯形法
- 单纯形法(1)
- 单纯形法(2)
- 单纯形法 -- 求解线性规划
- 单纯形法简易使用方法
- 线性规划的单纯形法
- 线性规划与单纯形法
- java transient关键字
- Mysql Innodb体系结构
- MySQL索引统计信息更新相关的参数
- nodejs 后台服务启动
- Linux下C语言获取所有网卡MAC地址的代码
- 单纯形法
- Aizu
- 解决failed to push some refs to
- opengl(1)
- HDU
- nc 使用方法
- hihocode 1505 : 小Hi和小Ho的礼物
- git入门笔记
- 四位顶级AI大牛纵论:深度学习和大数据结合的红利还能持续多久?