单纯形法c语言Word格式.docx
《单纯形法c语言Word格式.docx》由会员分享,可在线阅读,更多相关《单纯形法c语言Word格式.docx(17页珍藏版)》请在冰点文库上搜索。
![单纯形法c语言Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/2b85f687-8f0a-402e-80f0-be1e52eceb7c/2b85f687-8f0a-402e-80f0-be1e52eceb7c1.gif)
ro-1)
fprintf(write,"
x_b[i]);
else
rj"
for(j=0;
j<
lin;
j++)
if(i==out&
&
j==in)
fprintf(write,"
%6.2f*"
arra[i][j]);
else
%7.2f"
\n"
}
80;
-"
}
voidarray_conv(floatarra[][N],intro,intlin,intin,intout)
floattemp;
temp=arra[out][in];
arra[out][i]/=temp;
if(i!
=out)
{
temp=arra[i][in];
for(j=0;
arra[i][j]-=temp*arra[out][j];
}
intb_to_x(floatarra[][N],float*bx,int*xB,intro,intlin,intin)
inti,j,k=0;
floatmin;
ro-1;
if(arra[i][in]>
-1e-5)
bx[i]=arra[i][lin-1]/arra[i][in];
k=1;
bx[i]=M;
if(k==0)returnM;
min=bx[0];
j=0;
for(i=1;
if(bx[i]<
min)
min=bx[i];
j=i;
elseif((bx[i]-min)>
-1e-5&
(bx[i]-min)<
1e-5)
if(xB[i]>
xB[j])
j=i;
returnj;
intc_in(floatarra[][N],intro,intlin)
min=arra[ro-1][0];
if(arra[ro-1][i]<
min=arra[ro-1][i];
if(min>
returnM;
else
returnj;
voidsmj()
floatxx[N];
row;
array[i][line]=b[i];
line;
array[row][i]=c[i];
array[row][line]=0;
xb[row-1-i]=line-i;
in_basic=c_in(array,row+1,line+1);
out_basic=b_to_x(array,b_x,xb,row+1,line+1,in_basic);
print(in,array,xb,row+1,line+1,in_basic,out_basic);
while(in_basic!
=M)
if(in_basic!
xb[out_basic]=in_basic+1;
array_conv(array,row+1,line+1,in_basic,out_basic);
in_basic=c_in(array,row+1,line+1);
out_basic=b_to_x(array,b_x,xb,row+1,line+1,in_basic);
print(in,array,xb,row+1,line+1,in_basic,out_basic);
if(out_basic==M)
fprintf(in,"
\n找不到出基变量,LP问题无解!
break;
if(out_basic!
j=0;
for(i=0;
if(array[row][i]>
j++;
if(j<
line-row)
\nLP问题有无穷最优解,其中之一如下:
fprintf(in,"
\nf*=%f\n"
-array[row][line]);
x*=("
xx[i]=0;
xx[xb[i]-1]=array[i][line];
%6.2f"
xx[i]);
)T\n"
voidconv()
floattemp[N];
array[i][line]=array[i][line+row+flag];
temp[i]=array[row][xb[i]-1];
line+1;
array[row][i]-=temp[j]*array[j][i];
//
找不到出基变量,LP问题无解!
"
\nLP问题有无穷最优解,其中之一如下:
x*=("
voidconve()
inti,j=0,k;
while(j!
=1)
k=0;
if(xb[i]>
line)
{
k=i;
}
if(j!
=0)
out_basic=k;
for(i=0;
for(k=0;
k<
k++)
if(xb[k]==(i+1))
break;
if(k==row)
{
in_basic=i;
break;
}
array_conv(array,row+1,line+row+1,in_basic,out_basic);
print(in,array,xb,row+1,line+row+1,in_basic,out_basic);
if(j==0)
j=1;
conv();
voidlinezecon(intzl)
inti,j,k,li;
li=row;
k=zl;
while(k!
=N+1)
for(i=k;
li-1;
xb[i]=xb[i+1];
line+row+1;
for(j=k;
array[j][i]=array[j+1][i];
li--;
k=N+1;
li;
break;
if(k!
if(array[k][i]>
1e-5||array[k][i]<
-1e5)
if(i<
k=N+1;
j=1;
array[li][i]=array[row][i];
flag=row-li;
row=li;
if(j==0)
conv();
conve();
void_smj()
inti,j,k;
fprintf(in,"
\n建立辅助LPminw="
row-1;
x%d+"
line+1+i);
x%d\n\n"
line+row);
for(j=line;
line+row;
if(i==j-line)
array[i][j]=1;
array[i][j]=0;
array[i][line+row]=b[i];
c[i+line]=0;
array[row][i]=0;
temp=0;
for(k=0;
temp+=array[k][i];
array[row][i]=-temp;
temp=0;
temp+=array[i][line+row];
array[row][line+row]=-temp;
xb[i]=line+i+1;
in_basic=c_in(array,row+1,line+row+1);
out_basic=b_to_x(array,b_x,xb,row+1,line+row+1,in_basic);
print(in,array,xb,row+1,line+row+1,in_basic,out_basic);
array_conv(array,row+1,line+row+1,in_basic,out_basic);
in_basic=c_in(array,row+1,line+row+1);
out_basic=b_to_x(array,b_x,xb,row+1,line+row+1,in_basic);
print(in,array,xb,row+1,line+row+1,in_basic,out_basic);
if((array[row][line+row]>
1e-5)||(array[row][line+row]<
-1e-5))
因为:
f*=%5.2f!
=0\n原LP问题没有最优解!
-array[row][line+row]);
LP问题进入第二阶段。
\n\n"
conv();
conve();
linezecon(k);
main()
chard='
a'
;
charname[50]="
d:
\\dcxf\\"
printf("
\n************单纯形法求解程序**************\n\n"
请输入矩阵A的行数:
scanf("
%d"
&
row);
请输入矩阵A的列数:
line);
请输入向量c'
="
scanf("
%f"
c[i]);
请输入向量b'
b[i]);
请输入矩阵A为:
scanf("
array[i][j]);
i=0;
while(name[i]!
='
\0'
)i++;
\n请输入输出文件名:
%s"
name+i);
name[i++]='
.'
t'
x'
name[i]='
if((i=access("
\\dcxf"
0))==-1)
system("
mkdird:
if((in=fopen(name,"
w"
))==NULL)
printf("
\n\n文件打不开!
exit(0);
\n\n---------------输入的数据如下-------------------\n\n"
A=\n"
array[i][j]);
\n"
\n\n\tc'
=("
c[i]);
)\n"
\n\tb'
b[i]);
\n---------------具体步骤如下-------------------\n\n"
\n是否是典范式LP?
[y/n]"
while(d!
y'
d!
n'
)
%c"
d);
if(d=='
smj();
_smj();
\n----------------------END----------------------------\n"
fclose(in);
\n\tWaiting...\n"
system(name);
\n--------------Ok!
----------------\n"
\n\n*********结束**********\n\n"