单纯形法解线性规划的模拟实现.docx
- 文档编号:29194055
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:15
- 大小:18.10KB
单纯形法解线性规划的模拟实现.docx
《单纯形法解线性规划的模拟实现.docx》由会员分享,可在线阅读,更多相关《单纯形法解线性规划的模拟实现.docx(15页珍藏版)》请在冰豆网上搜索。
单纯形法解线性规划的模拟实现
运筹学
单纯形法解线性规划的模拟实现
一.
单纯形法介绍
单纯形法是求解线性规划问题的通用方法。
它的理论根据是:
线性规划问题的可行域是n维向量空间Rn中的多面凸集,其最优值如果存在必在该凸集的某顶点处达到。
顶点所对应的可行解称为基本可行解。
单纯形法的基本思想是:
先找出一个基本可行解,对它进行鉴别,看是否是最优解;若不是,则按照一定法则转换到另一改进的基本可行解,再鉴别;若仍不是,则再转换,按此重复进行。
因基本可行解的个数有限,故经有限次转换必能得出问题的最优解。
如果问题无最优解也可用此法判别。
根据单纯形法的原理,在线性规划问题中,决策变量(控制变量)x1,x2,…xn的值称为一个解,满足所有的约束条件的解称为可行解。
使目标函数达到最大值(或最小值)的可行解称为最优解。
这样,一个最优解能在整个由约束条件所确定的可行区域内使目标函数达到最大值(或最小值)。
求解线性规划问题的目的就是要找出最优解。
最优解可能出现下列情况之一:
①存在着一个最优解;②存在着无穷多个最优解;③不存在最优解,这只在两种情况下发生,即没有可行解或各项约束条件不阻止目标函数的值无限增大(或向负的方向无限增大)。
用单纯形法求解线性规划问题所需的迭代次数主要取决于约束条件的个数。
现在一般的线性规划问题都是应用单纯形法标准软件在计算机上求解,对于具有106个决策变量和104个约束条件的线性规划问题已能在计算机上解得。
二.单纯形法的编程思路
单纯形法的一般解题步骤可归纳如下:
①把线性规划问题的约束方程组表达成典范型方程组,找出基本可行解作为初始基本可行解。
②若基本可行解不存在,即约束条件有矛盾,则问题无解。
③若基本可行解存在,从初始基本可行解作为起点,根据最优性条件和可行性条件,引入非基变量取代某一基变量,找出目标函数值更优的另一基本可行解。
④按步骤3进行迭代,直到对应检验数满足最优性条件(这时目标函数值不能再改善),即得到问题的最优解。
⑤若迭代过程中发现问题的目标函数值无界,则终止迭代。
按此解题步骤可以通过C++程序进行编程。
三.单纯形法的程序代码
#include
#include
#include
floatmatrix[100][100],x[100];/*记录总方程的数组,解的数组*/
inta[100];/*记录基础,非基础的解的情况,0:
非基础,1:
基础*/
intm,n,s,type;/*方程变量,约束数,求最大最小值的类型,0:
最小1:
最大*/
intindexe,indexl,indexg;/*剩余变量,松弛变量,人工变量*/
voidJckxj()
{
inti,j;
for(i=0;i for(j=0;j if(matrix[i][j]==1&&a[j]==1) { x[j]=matrix[i][s]; j=s; } for(i=0;i if(a[i]==0)x[i]=0; } intRj() { inti; for(i=0;i if(fabs(matrix[n][i])>=0.000001) if(matrix[n][i]<0)return0; return1; } intMin() { inti,temp=0; floatmin=matrix[n][0]; for(i=1;i if(min>matrix[n][i]) { min=matrix[n][i]; temp=i; } returntemp; } voidJustArtificial() { inti; for(i=m+indexe+indexl;i if(fabs(x[i])>=0.000001) { printf("无解"); return; } } intCheck(intin) { inti; floatmax1=-1; for(i=0;i if(fabs(matrix[i][in])>=0.000001&&max1 max1=matrix[i][s]/matrix[i][in]; if(max1<0) return1; return0; } intSearchOut(int*temp,intin) { inti; floatmin=10000; for(i=0;i if(fabs(matrix[i][in])>=0.000001&&(matrix[i][s]/matrix[i][in]>=0)&&min>matrix[i][s]/matrix[i][in]) { min=matrix[i][s]/matrix[i][in]; *temp=i; } for(i=0;i if(a[i]==1&&matrix[*temp][i]==1)returni; } voidMto(intin,inttemp) { inti; for(i=0;i<=s;i++) if(i! =in) matrix[temp][i]=matrix[temp][i]/matrix[temp][in]; matrix[temp][in]=1; } voidBe(inttemp,intin) { inti,j; floatc; for(i=0;i<=n;i++) { c=matrix[i][in]/matrix[temp][in]; if(i! =temp) for(j=0;j<=s;j++) matrix[i][j]=matrix[i][j]-matrix[temp][j]*c; } } voidAchange(intin,intout) { inttemp=a[in]; a[in]=a[out]; a[out]=temp; } voidPrint() { inti,j,k,temp=0; for(i=0;i { for(k=temp;k if(a[k]==1) { printf("X%d",k); temp=k+1; k=s; } for(j=0;j<=s;j++) printf("%8.2f",matrix[i][j]); printf("\n"); } printf("Rj"); for(j=0;j<=s;j++) printf("%8.2f",matrix[n][j]); printf("\n"); } voidInitPrint() { inti; cout<<"\n\n==================单纯形法求解结果如下====================\n"< printf("X"); for(i=0;i printf("\ta%d",i); printf("\tb\n\n"); } voidResult() { inti; printf("("); for(i=0;i printf("%8.2f",x[i]); printf(")"); if(type==1) printf("Zmax=%f\n\n",matrix[n][s]); elseprintf("Zmin=%f\n\n",matrix[n][s]); } voidPrintResult() { if(type==0)printf("\nTheMinimal: %f\n",-matrix[n][s]); elseprintf("\nTheMaximum: %f\n",matrix[n][s]); cout<<"\n==========================================================\n"< } voidMerge(floatnget[][100],floatnlet[][100],floatnet[][100],floatb[]) { inti,j; for(i=0;i { for(j=m;j if(nget[i][j-m]! =-1)matrix[i][j]=0; elsematrix[i][j]=-1; for(j=m+indexe;j if(nlet[i][j-m-indexe]! =1)matrix[i][j]=0; elsematrix[i][j]=1; for(j=m+indexe+indexl;j if(net[i][j-m-indexe-indexl]! =1)matrix[i][j]=0; elsematrix[i][j]=1; matrix[i][s]=b[i]; } for(i=m;i matrix[n][i]=0; for(i=m+indexe+indexl;i matrix[n][i]=100; matrix[n][s]=0; } voidProcessA() { inti; for(i=0;i a[i]=0; for(i=m+indexe;i a[i]=1; } voidInput(floatb[],intcode[]) { inti=0,j=0; cout<<"请输入方程变量个数: ";/*输入方程变量和约束数*/ cin>>m; cout<<"请输入方程的约束条件个数: "; cin>>n; cout< cout<<"请输入约束条件方程的系数、右边的值并选择等式类型(0: <=1: =2: >=n)"< for(i=0;i { for(j=0;j cin>>matrix[i][j];/*输入方程*/ cin>>b[i]>>code[i]; } cout<<"请输入目标函数Z中的系数: ";/*输入z*/ for(i=0;i cin>>matrix[n][i]; cout<<"请选择求解类型(0: Min1: Max)";/*输入求最大值还是最小值*/ do { cin>>type; if(type! =0&&type! =1)printf("输入错误! "); }while(type! =0&&type! =1); if(type==1) for(i=0;i matrix[n][i]=-matrix[n][i]; cout<<"\n所需变量已经输入结束,正在计算结果....\n"< } voidXartificial() { inti,j,k; if(indexg! =0) { for(i=m+indexe+indexl;i { for(j=0;j if(matrix[j][i]==1) { for(k=0;k<=s;k++) matrix[n][k]=matrix[n][k]-matrix[j][k]*100; j=n; } } } } voidProcess(floatc[][100],introw,intvol) { inti; for(i=0;i if(i! =row)c[i][vol]=0; } voidSstart(floatb[],intcode[]) { inti; floatnget[100][100],nlet[100][100],net[100][100];/*剩余变量数组,松弛变量数组,人工变量数组*/ indexe=indexl=indexg=0; for(i=0;i { if(code[i]==0) { nlet[i][indexl++]=1; Process(nlet,i,indexl-1); } if(code[i]==1) { net[i][indexg++]=1; Process(net,i,indexg-1); } if(code[i]==2) { net[i][indexg++]=1; nget[i][indexe++]=-1; Process(net,i,indexg-1); Process(nget,i,indexe-1); } } s=indexe+indexl+indexg+m; Merge(nget,nlet,net,b);/*合并*/ ProcessA();/*初始化a[]*/ InitPrint();/*初始化打印*/ Xartificial();/*消去人工变量*/ } voidSimplix()/*单纯型算法*/ { intin,out,temp=0; while (1) { Jckxj();/*基础可行解*/ Print();/*打印*/ Result();/*打印结果*/ if(! Rj())in=Min();/*求换入基*/ else { if(indexg! =0)JustArtificial();/*判断人工变量*/ PrintResult();/*打印最后结果*/ return; } if(Check(in))/*判断无界情况*/ { printf("该问题无界! "); return; } out=SearchOut(&temp,in);/*求换出基*/ Mto(in,temp);/*主元化1*/ Be(temp,in);/*初等变换*/ Achange(in,out);/*改变a[]的值*/ } } voidmain() { intcode[100];/*输入符号标记*/ floatb[100];/*方程右值*/ cout<<"==================单纯形法 Input(b,code);/*初始化*/ Sstart(b,code);/*化标准型*/ Simplix();/*单纯型算法*/ } 四.程序运行结果 以课本31页例1-12为题目 程序运行结果如下: ==================单纯形法 请输入方程变量个数: 3 请输入方程的约束条件个数: 2 请输入约束条件方程的系数、右边的值并选择等式类型(0: <=1: =2: >=n) 11130 14790 请输入目标函数Z中的系数: 233 请选择求解类型(0: Min1: Max)1 所需变量已经输入结束,正在计算结果.... ==================单纯形法求解结果如下==================== Xa0a1a2a3a4b X31.001.001.001.000.003.00 X41.004.007.000.001.009.00 Rj-2.00-3.00-3.000.000.000.00 (0.000.000.003.009.00)Zmax=0.000000 X10.750.00-0.751.00-0.250.75 X30.251.001.750.000.252.25 Rj-1.250.002.250.000.756.75 (0.002.250.000.750.00)Zmax=6.750000 X01.000.00-1.001.33-0.331.00 X10.001.002.00-0.330.332.00 Rj0.000.001.001.670.338.00 (1.002.000.000.000.00)Zmax=8.000000 TheMaximum: 8.000000 ========================================================== Pressanykeytocontinue
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单纯 形法解 线性规划 模拟 实现
![提示](https://static.bdocx.com/images/bang_tan.gif)