两阶段法C程序Word格式文档下载.doc
《两阶段法C程序Word格式文档下载.doc》由会员分享,可在线阅读,更多相关《两阶段法C程序Word格式文档下载.doc(18页珍藏版)》请在冰点文库上搜索。
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>
elseif(a[j]==-1)printf("
=%lg\n"
case3:
=0\n"
tnum_x=num_x;
i++){switch(re_st){
num_x+=1;
num_x+=2;
//化为标准形式
if(ma_mi==2)for(i=1;
=tnum_x;
i++)c*=-1;
//求最小值时,系数变相反数
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++)
if(j==tnum_x+num_addv)a[tnum_x+num_addv]=1;
elsea[j]=0;
base[num_ba]=arti[num_ar]=tnum_x+num_addv;
j++)if(j==tnum_x+num_addv-1)a[tnum_x+num_addv-1]=-1;
elseif(j==tnum_x+num_addv)a[tnum_x+num_addv]=1;
base[num_ba]=tnum_x+num_addv;
for(j=tnum_x+1;
j++)if(j==tnum_x+num_addv)a[tnum_x+num_addv]=1;
}//增加松弛变量、剩余变量、人工变量、确定基变量
//显示标准化后的方程组
\n化为标准形式后:
maxz'
="
if(i==arti[j])k=1;
if(k==1)printf("
-Mx[%d]"
elseif(c==1)printf("
voiditerative(){
inti,j,k,k_a,k_f,l;
//k_a,k_f值为0或1,记录当前下标在arti[]或base[]里的搜索结果
intbase_elem;
intbase_out,base_in;
doublesigma[MAX],temp;
doublevalue_be;
//高斯消元里保存主元素值
\n\n第%d次迭代:
stop);
c%d=%lg\t"
base,c[base]);
b%d=%lg\t"
i,b);
a[%d][%d]=%lg\t"
i,j,a[j]);
k_a=0;
for(l=1;
l<
l++)if(j==arti[l])k_a=1;
if(k_a!
=1)printf("
//求检验数sigma
sigma=c;
j++)sigma-=c[base[j]]*a[j];
j++)if(i==base[j])sigma=0;
sigma[%d]=%lg\t"
i,sigma);
l++)if(i==arti[l])k_a=1;
if(k_a!
putchar('
\n'
//检验检验数sigma是否全小于等于0
if(sigma>
0)
k=1;
if(k==0){
//sigma是全小于等于0时,检查是否为无穷多最优解
k_f=k_a=0;
if(i==arti[j])k_a=1;
if(sigma==0&
k_a!
=1){
j++)if(i==base[j])k_f=1;
if(k_f==0){status=-1;
return;
status=1;
return;
//检查是否为无界解
k_f=0;
0){
j++)if(a[j]>
0)k_f=1;
if(k_f!
=1){status=0;
//确定换入变量
j++)if(i==base[j])k=1;
if(k==0&
sigma>
0)temp=sigma-1;
}//temp赋初值
if(k==0)
temp&
0){base_in=i;
temp=sigma;
//确定换出变量
i++)if(a[base_in]>
temp=b/a[base_in]+1;
i++){if(b/a[base_in]<
=temp&
a[base_in]>
j++)if(base==arti[j]){
base_out=base;
base_elem=i;
temp=b/a[base_in];
}//人工变量优先换出
if(b/a[base_in]<
基变量:
x[%d]"
base);
换入变量:
x[%d]换出变量:
base_in,base_out);
//基变量变换,进行新方程初始化后迭代
if(base==base_out)base=base_in;
//初始化主元素行系数
value_be=a[base_elem][base_in];
b[base_elem]/=value_be;
i++)a[base_elem]/=value_be;
if(i!
=base_elem){
b-=b[base_elem]*a[base_in];
value_be=a[base_in];
j++)a[j]-=a[base_elem][j]*value_be;
stop+