ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:28.53KB ,
资源ID:28347510      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28347510.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(运筹学两阶段法C语言程序代码.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

运筹学两阶段法C语言程序代码.docx

1、运筹学两阶段法C语言程序代码课 程 设 计 程 序 代 码 课程设计名称 运筹课程设计 专 业 信息管理与信息系统 班 级 140505班 学 生 姓 名 孙玉玲 王凤禹 王美玲 指 导 教 师 王亚君 2016年7月15日#include #include #define MAX 100#define STP 100int stop=1; /迭代记数变量int status; /iterative迭代返回值:1唯一最优,0无界解,-1无穷多最优解 -2迭代超过限制次数int step=1; /目前阶段double aMAXMAX,bMAX,cMAX,temp_cMAX,max=0; /方程组

2、相关系数int num_x; /变量个数 int num_st; /约束方程数int num_ar=0; /人工变量个数int artiMAX; /人工变量下标int baseMAX; /基变量下标int ma_mi; /1为求最大值,2为求最小值void create(); /建立方程组void iterative(); /单纯型法迭代void output(); /输出结果void banner(); /打印程序标题void exchange(double cMAX,double temp_cMAX); /交换两阶段价值系数void show(); /输出方程组void main() in

3、t i,j,k;banner();create();/保存原价值系数,转换为第一阶段价值系数for(i=1;i=num_x;i+) k=0; for(j=1;j=num_ar;j+) if(i=artij) k=1; if(k=1) temp_ci=-1; else temp_ci=0;exchange(c,temp_c);printf(nn第一阶段问题为:nn);show();step+;printf(nn按回车开始第一阶段迭代);getchar(); getchar();iterative();if(status=-2) puts(迭代超过限制次数强行终止!n); puts(n按回车结束)

4、; getchar(); exit(0);output();if(max!=0) puts(nn原问题无可行解。n); puts(n按回车结束); getchar(); exit(0);/转换为第二阶段价值系数exchange(c,temp_c);/把人工变量列全设为0for(i=1;i=num_ar;i+) cartii=0; for(j=1;j=num_st;j+) ajartii=0;puts(nn第二阶段问题为:nn);show();puts(nn按回车开始第二阶段迭代);getchar(); iterative();switch(status) case 1: output(); p

5、uts(nn原问题有唯一最优解。n); puts(n按回车结束); getchar(); exit(0);case 0: puts(nn原问题为无界解。n); puts(n按回车结束); getchar(); exit(0);case -1: output(); puts(nn原问题有无穷多最优解。n); puts(n按回车结束); getchar(); exit(0);case -2: puts(迭代超过限制次数强行终止!n); puts(n按回车结束); getchar(); exit(0);/switchvoid banner() printf(tt*n);printf(tt 两阶段法解

6、LP问题n);printf(tt*n);printf(n);void show() /对方程组以自然的格式输出,系数为零的x不显示/为1的不显示系数1,-1系数只显示负号int i,j,k;switch(step) case 1: printf(min z= ); printf(x%d,arti1); for(i=2;i=num_ar;i+) printf( + x%d,artii); break;case 2:printf(max z= );printf(%lg x%d,c1,1);for(i=2;i=0) printf( +%lg x%d,ci,i); else printf( %lg x

7、%d,ci,i);break;printf(nst:n);for(i=1;i=num_st;i+) k=0; for(j=1;j=0&k!=0) printf( +%lg x%d,aij,j); else if(aij=0&k=0) printf( %lg x%d,aij,j); else printf( %lg x%d,aij,j); k=1; printf( = %lgn,bi); printf( x1x%d=0,num_x);void exchange(double cMAX,double temp_cMAX) int i;double tempMAX;for(i=1;i=num_x;i

8、+) tempi=temp_ci; temp_ci=ci; ci=tempi;void create() /输入方程组系数,每个方程输完后回显确认int i,j,k,re_stMAX,tnum_x,num_addv=0,num_ba=0;char confirm;while(2) printf(请选择:1、求最大值,2、求最小值:(1/2); scanf(%d,&ma_mi); if(ma_mi!=1&ma_mi!=2) printf(输入错误,重新选择。); else break;while(1) printf(指定变量个数:); scanf(%d,&num_x); printf(输入价值系

9、数c1-c%d:n,num_x); for(i=1;i=num_x;i+) printf(c%d=,i); scanf(%lf,&ci); if(ma_mi=1) printf(max z= ); else printf(min z= ); printf(%lg x%d,c1,1); for(i=2;i=0) printf( +%lg x%d,ci,i); else printf( %lg x%d,ci,i); printf(n正确吗?:(y/n);getchar();confirm=getchar();if (confirm=y) break;else if(confirm=n) conti

10、nue;printf(输入约束方程组个数:);scanf(%d,&num_st);for(i=1;i=,3、= :(1/2/3); scanf(%d,&re_sti); if(re_sti!=1&re_sti!=2&re_sti!=3) printf(输入错误,请重新选择。); else break; printf(输入技术系数:n); for(j=1;j=num_x;j+) printf(a%d=,j); scanf(%lf,&aij); printf(输入资源拥有量:nb%d=,i); scanf(%lf,&bi); printf(st.%i:n,i); printf(%lg x%d,ai

11、1,1); for(j=2;j=0) printf( +%lg x%d,aij,j); else printf( %lg x%d,aij,j); switch(re_sti) case 1: printf( = %lg,bi); break; case 2: printf( = %lg,bi); break; case 3: printf( = %lg,bi); break; while(1) printf(n正确吗?(y/n); getchar(); confirm=getchar(); if (confirm=y) break; else if(confirm=n) i-=1; break

12、; /显示输入的方程组printf(n原问题为:nn);if(ma_mi=1) printf(max z= );else printf(min z= );printf(%lg x%d,c1,1);for(i=2;i=0) printf( +%lg x%d,ci,i); else printf( %lg x%d,ci,i);printf(nst:n);for(i=1;i=num_st;i+) k=0; for(j=1;j=0&k!=0) printf( +%lg x%d,aij,j); else if(aij=0&k=0) printf( %lg x%d,aij,j); else printf(

13、 %lg x%d,aij,j); k=1; switch(re_sti) case 1: printf( = %lgn,bi); break; case 2: printf( = %lgn,bi); break; case 3: printf( =0n,num_x);tnum_x=num_x;for(i=1;i=num_st;i+) switch(re_sti) case 1: case 3: num_x+=1; break; case 2: num_x+=2; break; /化为标准形式if(ma_mi=2) for(i=1;i=tnum_x;i+) ci*=-1; /求最小值时,系数变相

14、反数for(i=1;i=num_st;i+) switch(re_sti) case 1: num_addv+; num_ba+; num_ar+; ctnum_x+num_addv=0; basenum_ba=artinum_ar=tnum_x+num_addv; for(j=tnum_x+1;j=num_x;j+) if(j=tnum_x+num_addv) aitnum_x+num_addv=1; else aij=0; break; case 2: num_addv+; ctnum_x+num_addv=0; num_addv+; num_ba+; num_ar+; ctnum_x+n

15、um_addv=0; basenum_ba=artinum_ar=tnum_x+num_addv; for(j=tnum_x+1;j=num_x;j+) if(j=tnum_x+num_addv-1) aitnum_x+num_addv-1=-1; else if(j=tnum_x+num_addv) aitnum_x+num_addv=1; else aij=0; break; case 3: num_addv+; num_ba+; ctnum_x+num_addv=0; basenum_ba=tnum_x+num_addv; for(j=tnum_x+1;j=num_x;j+) if(j=

16、tnum_x+num_addv) aitnum_x+num_addv=1; else aij=0; break; /switch/增加松弛变量、剩余变量、人工变量、确定基变量/显示标准化后的方程组printf(n化为标准形式后:nn);if(ma_mi=1) printf(max z= );else printf(max z= );printf(%lg x%d,c1,1);for(i=2;i=num_x;i+) k=0; for(j=1;j=0) printf( +%lg x%d,ci,i); else printf( %lg x%d,ci,i);printf(nst:n);for(i=1;i

17、=num_st;i+) k=0; for(j=1;j=0&k!=0) printf( +%lg x%d,aij,j); else if(aij=0&k=0) printf( %lg x%d,aij,j); else printf( %lg x%d,aij,j); k=1; printf( = %lgn,bi); printf( x1x%d=0,num_x);void iterative() int i,j,k,k_a,k_f,l; /k_a,k_f值为0或1,记录当前下标在arti或base里的搜索结果int base_elem;int base_out,base_in;double sigm

18、aMAX,temp;double value_be; /高斯消元里保存主元素值printf(nn第%d次迭代:nn,stop); for(i=1;i=num_st;i+) printf(c%d=%lgt,basei,cbasei); printf(b%d=%lgt,i,bi); switch(step) case 1: for(j=1;j=num_x;j+) printf(a%d%d=%lgt,i,j,aij); printf(n); break; case 2: for(j=1;j=num_x;j+) k_a=0; for(l=1;l=num_ar;l+) if(j=artil)k_a=1;

19、 if(k_a!=1) printf(a%d%d=%lgt,i,j,aij); printf(n); break; /求检验数sigmafor(i=1;i=num_x;i+) sigmai=ci; for(j=1;j=num_st;j+) sigmai-=cbasej*aji; for(j=1;j=num_st;j+) if(i=basej) sigmai=0; switch(step) case 1: printf(sigma%d=%lgt,i,sigmai); break; case 2: k_a=0; for(l=1;l=num_ar;l+) if(i=artil) k_a=1; if(

20、k_a!=1) printf(sigma%d=%lgt,i,sigmai); break; putchar(n);/检验检验数sigma是否全小于等于0k=0;for(i=1;i0) k=1;if(k=0) /sigma是全小于等于0时,检查是否为无穷多最优解 for(i=1;i=num_x;i+) k_f=k_a=0; for(j=1;j=num_ar;j+) if(i=artij) k_a=1; if(sigmai=0&k_a!=1) for(j=1;j=num_st;j+) if(i=basej) k_f=1; if(k_f=0) status=-1; return; status=1;

21、 return;/检查是否为无界解for(i=1;i0) for(j=1;j0) k_f=1; if(k_f!=1) status=0; return; /确定换入变量for(i=1;i=num_x;i+) k=0; for(j=1;j0) temp=sigmai-1;/temp赋初值for(i=1;i=num_x;i+) k=0; for(j=1;jtemp&sigmai0) base_in=i; temp=sigmai; /确定换出变量for(i=1;i0) temp=bi/aibase_in+1; break; /temp赋初值for(i=1;i=num_st;i+) if(bi/aibase_in0) for(j=1;j=num_ar;j+) if(basei=artij) base_out=basei; base_elem=i; temp=bi/aibase_in; break; /人工变量优先换出 if(bi/aibase_in0) base_out=basei; base_elem=i; temp=bi/aibase_in; printf( 基变量:);for(i=1;i=num_st;i+) printf(x%d ,basei);printf(换入变量:x%d 换出变量:x%d,base_in,base_out);/基变量变换,

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1