运筹学解对偶单纯形法Word格式文档下载.docx
《运筹学解对偶单纯形法Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《运筹学解对偶单纯形法Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
YAXC
YX)
单纯形法解决线性规划问题的思想是:
从问题
(1)的一个基解X0开始迭代到另一个基解,在迭代过程中保持基解的可行性,同时它对应的对偶问题⑵的基解Y0二CBB-1的不可行性逐步消失,直到Y0是问题⑵的可行解时,X0就是问题
(1)的最优解了。
对偶单纯形法正是基于对称的想法,从一个基解X0开始,X0不是基可行解,但它的检验数全部非正,对应的对偶问题的基解Y0二
CBB-1是基可行解从X0迭代到另一个基解X1,在迭代过程中保持它对应的对偶问题的基解是基可行解,逐步消除原问题基解的不可行性,最终达到两者同时为可行解,也就同时是最优解了。
这就是对偶单纯形法的基本思想。
算法:
用对偶单纯形法解决生产资料分配问题的步骤:
Stepl找出一组以定基元素xOi和人工变量为基变量的正则解X0,
若X0是可行的则X0是最优解,
停止,否则转向STEP2;
Step2确定换出变量xOI,其中x0l=min{xOr;
xOr<
O};
Step3如果对所有非基变量xOj,0jX),则该问题无可行解,运算停止,
否则转向STEP4;
Step4确定换入变量xOk,其中水0k=minot[3lt;
[3lt<
0;
1<
t<
n+m;
Step5取x0l为换出变量,x0k为换入变量进行迭代,然后重复上过程直到得到最优解。
程序:
#include<
stdio.h>
#include<
math.h>
intm,n;
floatM=1000000.0;
floatA[100][100];
floatC[100];
floatb[100];
floatseta[100];
intnum[100];
floatz=0;
voidinput();
voidprint();
intduioudanchunxing1();
intduioudanchunxing2(inta);
voidduioudanchunxing3(inta,intb);
voidinput()
{printf("
请输入方程组的系数矩阵维数,m行n列:
\n"
);
scanf("
%d%d"
&
m,&
n);
inti,j;
printf("
请输入方程组的系数矩阵A(%d行%£
列):
m,n);
for(i=0;
i<
m;
i++)
for(j=0;
j<
n;
j++)
%f"
A[i][j]);
printf("
\n请输入初始基变量的数字代码num矩阵:
%d"
num[i]);
\n请输入方程组右边的值矩阵b:
seanf("
b[i]);
C:
\n请输入目标函数各个变量的系数所构成的系数阵
i<
C[i]);
}
intduioudanchunxing1()
{
inti,k;
intflag;
floatmin=0;
if(b[i]>
=0)
flag=1;
else{flag=0;
break;
if(flag==1)
return-1;
if(min>
b[i])
{min=b[i];
k=i;
returnk;
}intduioudanchunxing2(inta)
intflag=O;
floatmin;
if(A[a][j]>
else{flag=O;
\n该线性规划无最优解!
return-1;
if(A[a][j]<
0)
seta[j]=-C[j]/A[a][j];
elseseta[j]=M;
min=M;
if(min>
=seta[j])
{min=seta[j];
i=j;
num[a]=i+1;
returni;
voidduioudanchunxing3(intp,intq)
inti,j,c,l;
floattemp1,temp2,temp3;
c=q;
l=p;
temp仁A[c][l];
b[c]=b[c]/temp1;
A[c][j]=A[c][j]/temp1;
if(i!
=c)
if(A[c][l]!
temp2=A[i][l];
b[i]=b[i]-b[c]*temp2;
j<
n;
A[i][j]=A[i][j]-A[c][j]*temp2;
temp3=C[l];
C[i]=C[i]-A[c][i]*temp3;
z=z+b[c]*temp3;
voidprint()
\n
\n"
\t"
%.3f\t"
-C[i]);
%.3f"
z);
x(%d)\t"
num[i]);
A[i][j]);
%.3f\n"
b[i]);
}main()
inti,j=0;
intp,q;
input();
if(A[i][num[i]-1]<
b[i]=-b[i];
jvn;
A[i][j]=-A[i][j];
X(%d)\t"
i+1);
printf("
RHS\n"
while
(1)
q=duioudanchunxing1();
if(q==-1)
\n所得解已经是最优解!
print();
{printf("
x(%d)=%.3f\t"
num[i],b[i]);
z=%.3f"
p=duioudanchunxing2(q);
if(q==-1)break;
duioudanchunxing3(p,q);
流程图:
duioudanchunxing1();
duioudanchunxing2(inta);
duioudanchunxing3(inta,intb);
Ali][iFAE]貼也:
方:
伽於.
i=i+l
参考文献:
[1]胡运权,甘应爱.运筹学教程[M].北京:
清华大学出版社,2009.
[2]王周宏.运筹学基础[M].北京:
清华大学出版社,北京交通大学出
版社,2010.
[3]何钦铭,颜晖.C语言程序设计[M].浙江:
浙江科学技术出版社,
2003.
[4]吕凤煮.C++语言程序设计教程[M].北京:
人民邮电出版社
.2009.