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