运筹学两阶段法C语言程序代码docWord下载.docx
- 文档编号:14263094
- 上传时间:2022-10-21
- 格式:DOCX
- 页数:17
- 大小:28.60KB
运筹学两阶段法C语言程序代码docWord下载.docx
《运筹学两阶段法C语言程序代码docWord下载.docx》由会员分享,可在线阅读,更多相关《运筹学两阶段法C语言程序代码docWord下载.docx(17页珍藏版)》请在冰豆网上搜索。
//变量个数
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++;
\n\n按回车开始第一阶段迭代"
getchar();
iterative();
if(status==-2){
puts("
迭代超过限制次数强行终止!
\n"
\n按回车结束"
getchar();
exit(0);
output();
if(max!
=0){
\n\n原问题无可行解。
//转换为第二阶段价值系数
//把人工变量列全设为0
c[arti[i]]=0;
=num_st;
j++)a[j][arti[i]]=0;
puts("
\n\n第二阶段问题为:
\n\n按回车开始第二阶段迭代"
switch(status)
{
case1:
output();
\n\n原问题有唯一最优解。
case0:
\n\n原问题为无界解。
case-1:
\n\n原问题有无穷多最优解。
case-2:
}//switch
voidbanner(){
\t\t****************************************\n"
\t\t两阶段法解LP问题\n"
voidshow(){
//对方程组以自然的格式输出,系数为零的x不显示
//为1的不显示系数1,-1系数只显示负号
switch(step){
printf("
minz="
x[%d]"
arti[1]);
for(i=2;
i++)printf("
+x[%d]"
arti[i]);
break;
case2:
maxz="
%lgx[%d]"
c[1],1);
for(i=2;
if(c[i]==1)printf("
i);
elseif(c[i]==-1)printf("
-x[%d]"
elseif(c[i]>
=0)printf("
+%lgx[%d]"
c[i],i);
elseprintf("
%lgx[%d]"
break;
\nst:
j++){
if(a[i][j]!
if(a[i][j]==1&
&
k!
j);
elseif(a[i][j]==1&
k==0)printf("
x[%d]"
elseif(a[i][j]==-1)printf("
elseif(a[i][j]>
=0&
a[i][j],j);
k=1;
}
==%lg\n"
b[i]);
x[1]-x[%d]>
=0"
num_x);
voidexchange(doublec[MAX],doubletemp_c[MAX])
inti;
doubletemp[MAX];
temp[i]=temp_c[i];
temp_c[i]=c[i];
c[i]=temp[i];
voidcreate(){
//输入方程组系数,每个方程输完后回显确认
inti,j,k,re_st[MAX],tnum_x,num_addv=0,num_ba=0;
charconfirm;
while
(2){
请选择:
1、求最大值,2、求最小值:
(1/2)"
scanf("
%d"
&
ma_mi);
if(ma_mi!
=1&
ma_mi!
=2)printf("
输入错误,重新选择。
"
elsebreak;
while
(1){
指定变量个数:
num_x);
输入价值系数c1-c%d:
for(i=1;
i++){
c%d="
%lf"
c[i]);
if(ma_mi==1)printf("
if(c[i]>
\n正确吗?
:
(y/n)"
confirm=getchar();
if(confirm=='
y'
)break;
elseif(confirm=='
n'
)continue;
输入约束方程组个数:
scanf("
num_st);
st.%d:
while
(1){
1、==,2、>
=,3、<
=:
(1/2/3)"
re_st[i]);
if(re_st[i]!
re_st[i]!
=2&
=3)printf("
输入错误,请重新选择。
输入技术系数:
a%d="
a[i][j]);
输入资源拥有量:
\nb%d="
b[i]);
st.%i:
a[i][1],1);
for(j=2;
j++){
if(a[i][j]>
switch(re_st[i]){
case1:
==%lg"
case2:
>
=%lg"
case3:
<
confirm=getchar();
if(confirm=='
elseif(confirm=='
){i-=1;
//显示输入的方程组
\n原问题为:
if(ma_mi==1)printf("
elseprintf("
+%lgx[%d
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 运筹学 阶段 语言 程序代码 doc