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

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

课程设计程序代码课程设计名称运筹课程设计专业信息管理与信息系统班级140505班学生姓名孙玉玲王凤禹王美玲指导教师王亚君2016年7月15日1#includestdio.h#includestdlib.h#defineMAX100#defineSTP100intstop=1;//迭代记数变量intstatus;//iterative迭代返回值:1唯一最优,0无界解,-1无穷多最优解-2迭代超过限制次数intstep=1;//目前阶段doublea[MAX][MAX],b[MAX],c[MAX],temp_c[MAX],max=0;//方程组相关系数intnum_x;//变量个数intnum_st;//约束方程数intnum_ar=0;//人工变量个数intarti[MAX];//人工变量下标intbase[MAX];//基变量下标intma_mi;//1为求最大值,2为求最小值voidcreate();//建立方程组voiditerative();//单纯型法迭代voidoutput();//输出结果voidbanner();//打印程序标题voidexchange(doublec[MAX],doubletemp_c[MAX]);//交换两阶段价值系数voidshow();//输出方程组voidmain(){inti,j,k;banner();create();//保存原价值系数,转换为第一阶段价值系数for(i=1;i=num_x;i++){k=0;for(j=1;j=num_ar;j++)if(i==arti[j])k=1;if(k==1)temp_c[i]=-1;elsetemp_c[i]=0;}exchange(c,temp_c);printf(\n\n第一阶段问题为:\n\n);show();step++;2printf(\n\n按回车开始第一阶段迭代);getchar();getchar();iterative();if(status==-2){puts(迭代超过限制次数强行终止!\n);puts(\n按回车结束);getchar();exit(0);}output();if(max!=0){puts(\n\n原问题无可行解。\n);puts(\n按回车结束);getchar();exit(0);}//转换为第二阶段价值系数exchange(c,temp_c);//把人工变量列全设为0for(i=1;i=num_ar;i++){c[arti[i]]=0;for(j=1;j=num_st;j++)a[j][arti[i]]=0;}puts(\n\n第二阶段问题为:\n\n);show();puts(\n\n按回车开始第二阶段迭代);getchar();iterative();switch(status){case1:output();puts(\n\n原问题有唯一最优解。\n);puts(\n按回车结束);getchar();exit(0);3case0:puts(\n\n原问题为无界解。\n);puts(\n按回车结束);getchar();exit(0);case-1:output();puts(\n\n原问题有无穷多最优解。\n);puts(\n按回车结束);getchar();exit(0);case-2:puts(迭代超过限制次数强行终止!\n);puts(\n按回车结束);getchar();exit(0);}//switch}voidbanner(){printf(\t\t****************************************\n);printf(\t\t两阶段法解LP问题\n);printf(\t\t****************************************\n);printf(\n);}voidshow(){//对方程组以自然的格式输出,系数为零的x不显示//为1的不显示系数1,-1系数只显示负号inti,j,k;switch(step){case1:printf(minz=);printf(x[%d],arti[1]);for(i=2;i=num_ar;i++)printf(+x[%d],arti[i]);break;case2:4printf(maxz=);printf(%lgx[%d],c[1],1);for(i=2;i=num_x;i++){if(c[i]==1)printf(+x[%d],i);elseif(c[i]==-1)printf(-x[%d],i);elseif(c[i]=0)printf(+%lgx[%d],c[i],i);elseprintf(%lgx[%d],c[i],i);}break;}printf(\nst:\n);for(i=1;i=num_st;i++){k=0;for(j=1;j=num_x;j++){if(a[i][j]!=0){if(a[i][j]==1&&k!=0)printf(+x[%d],j);elseif(a[i][j]==1&&k==0)printf(x[%d],j);elseif(a[i][j]==-1)printf(-x[%d],j);elseif(a[i][j]=0&&k!=0)printf(+%lgx[%d],a[i][j],j);elseif(a[i][j]=0&&k==0)printf(%lgx[%d],a[i][j],j);elseprintf(%lgx[%d],a[i][j],j);k=1;}}printf(==%lg\n,b[i]);}printf(x[1]-x[%d]=0,num_x);}voidexchange(doublec[MAX],doubletemp_c[MAX]){inti;doubletemp[MAX];for(i=1;i=num_x;i++){temp[i]=temp_c[i];temp_c[i]=c[i];c[i]=temp[i];}5}voidcreate(){//输入方程组系数,每个方程输完后回显确认inti,j,k,re_st[MAX],tnum_x,num_addv=0,num_ba=0;charconfirm;while(2){printf(请选择:1、求最大值,2、求最小值:(1/2));scanf(%d,&ma_mi);if(ma_mi!=1&&ma_mi!=2)printf(输入错误,重新选择。);elsebreak;}while(1){printf(指定变量个数:);scanf(%d,&num_x);printf(输入价值系数c1-c%d:\n,num_x);for(i=1;i=num_x;i++){printf(c%d=,i);scanf(%lf,&c[i]);}if(ma_mi==1)printf(maxz=);elseprintf(minz=);printf(%lgx[%d],c[1],1);for(i=2;i=num_x;i++){if(c[i]=0)printf(+%lgx[%d],c[i],i);elseprintf(%lgx[%d],c[i],i);}printf(\n正确吗?:(y/n));getchar();confirm=getchar();if(confirm=='y')break;elseif(confirm=='n')continue;}printf(输入约束方程组个数:);scanf(%d,&num_st);6for(i=1;i=num_st;i++){printf(st.%d:\n,i);while(1){printf(请选择:1、==,2、=,3、=:(1/2/3));scanf(%d,&re_st[i]);if(re_st[i]!=1&&re_st[i]!=2&&re_st[i]!=3)printf(输入错误,请重新选择。);elsebreak;}printf(输入技术系数:\n);for(j=1;j=num_x;j++){printf(a%d=,j);scanf(%lf,&a[i][j]);}printf(输入资源拥有量:\nb%d=,i);scanf(%lf,&b[i]);printf(st.%i:\n,i);printf(%lgx[%d],a[i][1],1);for(j=2;j=num_x;j++){if(a[i][j]=0)printf(+%lgx[%d],a[i][j],j);elseprintf(%lgx[%d],a[i][j],j);}switch(re_st[i]){case1:printf(==%lg,b[i]);break;case2:printf(=%lg,b[i]);break;case3:printf(=%lg,b[i]);break;}while(1){printf(\n正确吗?(y/n));getchar();confirm=getchar();if(confirm=='y')break;elseif(confirm=='n'){i-=1;break;}}}//显示输入的方程组7printf(\n原问题为:\n\n);if(ma_mi==1)printf(maxz=);elseprintf(minz=);printf(%lgx[%d],c[1],1);for(i=2;i=num_x;i++){if(c[i]==1)printf(+x[%d],i);elseif(c[i]==-1)printf(-x[%d],i);elseif(c[i]=0)printf(+%lgx[%d],c[i],i);elseprintf(%lgx[%d],c[i],i);}printf(\nst:\n);for(i=1;i=num_st;i++){k=0;for(j=1;j=num_x;j++){if(a[i][j]!=0){if(a[i][j]==1&&k!=0)printf(+x[%d],j);elseif(a[i][j]==1&&k==0)printf(x[%d],j);elseif(a[i][j]==-1)printf(-x[%d],j);elseif(a[i][j]=0&&k!=0)printf(+%lgx[%d],a[i][j],j);elseif(a[i][j]=0&&k==0)printf(%lgx[%d],a[i][j],j);elseprintf(%lgx[%d],a[i][j],j);k=1;}}switch(re_st[i]){case1:printf(==%lg\n,b[i]);break;case2:printf(=%lg\n,b[i]);break;case3:printf(=%lg\n,b[i]);break;}}printf(x[1]~x[%d]=0\n,num_x);8tnum_x=num_x;for(i=1;i=num_st;i++){switch(re_st[i]){case1:case3:num_x+=1;break;case2:num_x+=2;break;}}//化为标准形式if(ma_mi==2)for(i=1;i=tnum_x;i++)c[i]*=-1;//求最小值时,系数变相反数for(i=1;i=num_st;i++){switch(re_st[i]){case1:num_addv++;num_ba++;num_ar++;c[tnum_x+num_addv]=0;base[num_ba]=arti[num_ar]=tnum_x+num_addv;for(j=tnum_x+1;j=num_x;j++)if(j==tnum_x+num_addv)a[i][tnum_x+num_addv]=1;elsea[i][j]=0;break;case2:num_addv++;c[tnum_x+num_addv]=0;num_addv++;num_ba++;num_ar++

1 / 15
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功