对偶单纯形法C语言实现.doc
- 文档编号:1701762
- 上传时间:2022-10-23
- 格式:DOC
- 页数:7
- 大小:42.50KB
对偶单纯形法C语言实现.doc
《对偶单纯形法C语言实现.doc》由会员分享,可在线阅读,更多相关《对偶单纯形法C语言实现.doc(7页珍藏版)》请在冰豆网上搜索。
程序源代码:
#include
#include
#defineMAX_N100
#defineM1000000.0;
intm,n;
doubleA[MAX_N][MAX_N],C[MAX_N],b[MAX_N],seta[MAX_N],CZ[MAX_N];
intnum[MAX_N];
intGetOutCow()//求换出基
{
inti,k;
intflag;
doublemin=0;
for(i=0;i { if(b[i]>=0) flag=1; else { flag=0; break; } } if(flag==1) return-1; for(i=0;i { if(b[i]<0&&min>b[i]) { min=b[i]; k=i; } } returnk; } intGetInCow(intp)//求换入基 { inti,j; intflag=0; doublemin; for(j=0;j { if(A[p][j]>=0) flag=1; else { flag=0; break; } } if(flag==1) { printf("\n原线性规划问题无可行解! \n"); return-1; } for(j=0;j { if(A[p][j]<0) seta[j]=CZ[j]/A[p][j]; else seta[j]=M; } min=M; for(j=0;j { if(min>=seta[j]) { min=seta[j]; i=j; } } num[p]=i+1; returni; } voidchange(intp,intq)//计算新的单纯形表 { inti,j; doubletemp1,temp2,temp3; temp1=A[p][q]; for(i=0;i { if(i! =p) { if(A[i][q]! =0) { temp2=A[i][q]/temp1; for(j=0;j A[i][j]=A[i][j]-A[p][j]*temp2; b[i]=b[i]-b[p]*temp2; } } } temp3=CZ[q]/temp1; for(i=0;i CZ[i]=CZ[i]-A[p][i]*temp3; for(j=0;j A[p][j]=A[p][j]/temp1; b[p]=b[p]/temp1; } voidprint1() { inti; printf("\n--------------------------------------------------------------------------\n"); printf("\t"); for(i=1;i<=n;i++) printf("X(%d)\t",i); printf("RHS\n"); printf("--------------------------------------------------------------------------\n"); printf("\t"); for(i=0;i { printf("%.3lf\t",-C[i]); } printf("\n--------------------------------------------------------------------------\n"); } voidprint2() { inti,j; printf("\n--------------------------------------------------------------------------\n"); for(i=0;i { printf("x(%d)\t",num[i]); for(j=0;j printf("%.3lf\t",A[i][j]); printf("%.3lf\n",b[i]); } printf("--------------------------------------------------------------------------\n"); printf("cj-zj\t"); for(i=0;i printf("%.3lf\t",CZ[i]); printf("\n--------------------------------------------------------------------------\n"); } voidInput() { inti,j; printf("请输入约束条件的个数: \n"); scanf("%d",&m); printf("请输入变量的个数: \n"); scanf("%d",&n); printf("请输入方程组的系数矩阵A(%d行%d列): \n",m,n); for(i=0;i { for(j=0;j { scanf("%lf",&A[i][j]); } } printf("\n请输入初始基变量的数字代码num矩阵: \n"); for(i=0;i scanf("%d",&num[i]); printf("\n请输入方程组右边的值矩阵b: \n"); for(i=0;i scanf("%lf",&b[i]); printf("\n请输入目标函数各个变量的系数所构成的系数阵C: \n"); for(i=0;i scanf("%lf",&C[i]); } voidmain() { inti,j; intp,q; doublez=0; Input(); for(i=0;i { b[i]=-b[i]; for(j=0;j A[i][j]=-A[i][j]; } for(i=0;i { CZ[i]=-C[i]; } print1(); print2(); while (1) { p=GetOutCow(b); if(p==-1) { printf("\n所得解已经是最优解! \n"); for(i=0;i z+=b[i]*C[num[i]-1]; for(i=0;i printf("x(%d)=%.3lf\t",i+1,b[i]); printf("z=%.3lf\n",z); break; } q=GetInCow(p); if(q==-1) break; change(p,q); print2(); } } 运行实例 先将其化为标准型 运行结果: 请输入约束条件的个数: 2 请输入变量的个数: 5 请输入方程组的系数矩阵A(2行5列): 311-10 -1410-1 请输入初始基变量的数字代码num矩阵: 45 请输入方程组右边的值矩阵b: 12 请输入目标函数各个变量的系数所构成的系数阵C: 11100 -------------------------------------------------------------------------- X (1)X (2)X(3)X(4)X(5)RHS -------------------------------------------------------------------------- -1.000-1.000-1.0000.0000.000 -------------------------------------------------------------------------- -------------------------------------------------------------------------- x(4)-3.000-1.000-1.0001.0000.000-1.000 x(5)1.000-4.000-1.0000.0001.000-2.000 -------------------------------------------------------------------------- cj-zj-1.000-1.000-1.0000.0000.000 -------------------------------------------------------------------------- -------------------------------------------------------------------------- x(4)-3.2500.000-0.7501.000-0.250-0.500 x (2)-0.2501.0000.2500.000-0.2500.500 -------------------------------------------------------------------------- cj-zj-1.2500.000-0.7500.000-0.250 -------------------------------------------------------------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 对偶 单纯 语言 实现