运筹学——解对偶单纯形法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目:对偶单纯形法解线性规划问题
小组成员:
摘要:
运筹学是辅助人们进行科学管理的一种数学方法.而对偶单纯形法是线性规划中重要的数学方法,在简化运算,解决实际问题中具有重要的应用。它是解决研究线性约束条件下线性目标函数的极值问题的数学理论和方法,广泛应用于军事作战、经济分析、经营管理和工程技术等方面。为合理地利用有限的人力、物力、财力等资源作出的最优决策,提供科学的依据。在经济管理、交通运输、工农业生产等经济活动中,提高经济效果是人们不可缺少的要求。
关键词:对偶单纯形法线性规划最优解
正文:
单纯形法和对偶单纯形法的基本思想:
给出一个线性规划问题:
Max z = CX
AX≤b
X≥0
其对偶问题是:
Min w = Yb
YA≥C
Y≥0
单纯形法解决线性规划问题的思想是:
从问题(1)的一个基解X0开始迭代到另一个基解,在迭代过程中保持基解的可行性,同时它对应的对偶问题(2)的基解Y0= CBB-1的
不可行性逐步消失,直到Y0是问题(2)的可行解时,X0就是问题(1)的最优解了。
对偶单纯形法正是基于对称的想法,从一个基解X0开始,X0不是基可行解,但它的检验数全部非正,对应的对偶问题的基解Y0= CBB-1是基可行解;从X0迭代到另一个基解X1,在迭代过程中保持它对应的对偶问题的基解是基可行解,逐步消除原问题基解的不可行性,最终达到两者同时为可行解,也就同时是最优解了。这就是对偶单纯形法的基本思想。
算法:
用对偶单纯形法解决生产资料分配问题的步骤:
Step1 找出一组以定基元素x0i和人工变量为基变量的正则解X0,若X0是可行的,则X0是最优解,
停止,否则转向STEP2;
Step2 确定换出变量x0l,其中x0l=min{x0r;x0r<0};
Step3 如果对所有非基变量x0j,βlj≥0,则该问题无可行解,运算停止,否则转向STEP4;
Step4 确定换入变量x0k,其中σkβlk=minσtβlt;βlt<0;1≤t≤n+m ; Step5 取x0l为换出变量,x0k为换入变量进行迭代,然后重复上过程直到得到最优解。
程序:
#include
#include
int m,n;
float M=1000000.0;
float A[100][100];
float C[100];
float b[100];
float seta[100];
int num[100];
float z=0;
void input();
void print();
int duioudanchunxing1();
int duioudanchunxing2(int a);
void duioudanchunxing3(int a,int b);
void input()
{printf("请输入方程组的系数矩阵维数,m行n列:\n"); scanf("%d%d",&m,&n);
int i,j;
printf("请输入方程组的系数矩阵A(%d行%d列):\n",m,n); for(i=0;i for(j=0;j scanf("%f",&A[i][j]); printf("\n请输入初始基变量的数字代码num矩阵:\n"); for(i=0;i scanf("%d",&num[i]); printf("\n请输入方程组右边的值矩阵b:\n"); for(i=0;i scanf("%f",&b[i]); printf("\n请输入目标函数各个变量的系数所构成的系数阵C:\n"); for(i=0;i scanf("%f",&C[i]); } int duioudanchunxing1() { int i,k; int flag; float min=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(min>b[i]) {min=b[i];k=i;} } return k; } int duioudanchunxing2(int a) { int i,j; int flag=0; float min; for(j=0;j if(A[a][j]>=0) flag=1; else {flag=0;break;} if(flag==1) {printf("\n该线性规划无最优解!\n"); return -1;} for(j=0;j { if(A[a][j]<0) seta[j]=-C[j]/A[a][j]; else seta[j]=M; } min=M; for(j=0;j { if(min>=seta[j]) {min=seta[j];i=j;} } num[a]=i+1; return i; } void duioudanchunxing3(int p,int q) { int i,j,c,l; float temp1,temp2,temp3; c=q; l=p;