通用对偶单纯形法的C语言程序.doc
《通用对偶单纯形法的C语言程序.doc》由会员分享,可在线阅读,更多相关《通用对偶单纯形法的C语言程序.doc(9页珍藏版)》请在冰豆网上搜索。
#include
#include
#defineMAX_N100
#defineM1000000.0;
intm,n;
floatA[MAX_N][MAX_N],C[MAX_N],b[MAX_N],seta[MAX_N],CZ[MAX_N];
intnum[MAX_N];
intGetOutCow()//求换出基
{
inti,k;
intflag;
floatmin=0;
for(i=0;i {
if(b[i]>=0)
flag=1;
else
{
flag=0;
break;
}
}
if(flag==1)
return-1;
for(i=0;i {
if(b[i]<0&&min>b[i])
{
min=b[i];
k=i;
}
}
returnk;
}
intGetInCow(intp)//求换入基
{
inti,j;
intflag=0;
floatmin;
for(j=0;j {
if(A[p][j]>=0)
flag=1;
else
{
flag=0;
break;
}
}
if(flag==1)
{
printf("\n原线性规划问题无可行解!
\n");
return-1;
}
for(j=0;j {
if(A[p][j]<0)
seta[j]=CZ[j]/A[p][j];
else
seta[j]=M;
}
min=M;
for(j=0;j {
if(min>=seta[j])
{
min=seta[j];
i=j;
}
}
num[p]=i+1;
returni;
}
voidchange(intp,intq)//计算新的单纯形表
{
inti,j;
floattemp1,temp2,temp3;
temp1=A[p][q];
for(i=0;i {
if(i!
=p)
{
if(A[i][q]!
=0)
{
temp2=A[i][q]/temp1;
for(j=0;j A[i][j]=A[i][j]-A[p][j]*temp2;
b[i]=b[i]-b[p]*temp2;
}
}
}
temp3=CZ[q]/temp1;
for(i=0;i CZ[i]=CZ[i]-A[p][i]*temp3;
for(j=0;j A[p][j]=A[p][j]/temp1;
b[p]=b[p]/temp1;
}
voidprint1()
{
inti;
printf("\n---------------------------------------------------------------\n");
printf("\t");
for(i=1;i<=n;i++)
printf("X(%d)\t",i);
printf("RHS\n");
printf("-----------------------------------------------------------------\n");
printf("\t");
for(i=0;i {
printf("%.3f\t",-C[i]);
}
printf("\n---------------------------------------------------------------\n");
}
voidprint2()
{
inti,j;
printf("\n---------------------------------------------------------------\n");
for(i=0;i {
printf("X(%d)\t",num[i]);
for(j=0;j printf("%.3f\t",A[i][j]);
printf("%.3f\n",b[i]);
}
printf("\n---------------------------------------------------------------\n");
printf("cj-zj\t");
for(i=0;i printf("%.3f\t",CZ[i]);
printf("\n---------------------------------------------------------------\n");
}
voidInput()
{
inti,j;
printf("请输入约束条件的个数:
\n");
scanf("%d",&m);
printf("请输入变量的个数:
\n");
scanf("%d",&n);
printf("请输入方程组的系数矩阵A(%d行%d列):
\n",m,n);
for(i=0;i {
for(j=0;j {
scanf("%f",&A[i][j]);
}
}
printf("\n请输入初始基变量的数字代码num矩阵:
\n");
for(i=0;i scanf("%d",&num[i]);
printf("\n请输入方程组右边的值矩阵b:
\n");
for(i=0;i scanf("%f",&b[i]);
printf("\n请输入目标函数各个变量的系数阵C:
\n");
for(i=0;i scanf("%f",&C[i]);
}
voidmain()
{
inti,j;
intp,q;
floatz=0;
Input();
for(i=0;i {
if(A[i][num[i]-1]<=0)
{
b[i]=-b[i];
for(j=0;j A[i][j]=-A[i][j];
}
}
for(i=0;i {
CZ[i]=-C[i];
}
print1();
print2();
while
(1)
{
p=GetOutCow();
if(p==-1)
{
printf("\n所得解已经是最优解!
\n");
for(i=0;i z+=b[i]*C[num[i]-1];
for(i=0;i printf("X(%d)=%.3f\t",num[i],b[i]);
printf("z=%.3f\n",z);
break;
}
q=GetInCow(p);
if(q==-1)
break;
change(p,q);
print2();
}
}
if(flag==1)
return-1;
for(i=0;i {
if(b[i]<0&&min>b[i])
{
min=b[i];
k=i;
}
}
returnk;
}
intGetInCow(intp)//求换入基
{
inti,j;
intflag=0;
floatmin;
for(j=0;j {
if(A[p][j]>=0)
flag=1;
else
{
flag=0;
break;
}
}
if(flag==1)
{
printf("\n原线性规划问题无可行解!
\n");
return-1;
}
for(j=0;j {
if(A[p][j]<0)
seta[j]=CZ[j]/A[p][j];
else
seta[j]=M;
}
min=M;
for(j=0;j {
if(min>=seta[j])
{
min=seta[j];
i=j;
}
}
num[p]=i+1;
returni;
}
voidchange(intp,intq)//计算新的单纯形表
{
inti,j;
floattemp1,temp2,temp3;
temp1=A[p][q];
for(i=0;i {
if(i!
=p)
{
if(A[i][q]!
=0)
{
temp2=A[i][q]/temp1;
for(j=0;j A[i][j]=A[i][j]-A[p][j]*temp2;
b[i]=b[i]-b[p]*temp2;
}
}
}
temp3=CZ[q]/temp1;
for(i=0;i CZ[i]=CZ[i]-A[p][i]*temp3;
for(j=0;j A[p][j]=A[p][j]/temp1;
b[p]=b[p]/temp1;
}
voidprint1()
{
inti;
printf("\n---------------------------------------------------------------\n");
printf("\t");
for(i=1;i<=n;i++)
printf("X(%d)\t",i);
printf("RHS\n");
printf("-----------------------------------------------------------------\n");
printf("\t");
for(i=0;i {
printf("%.3f\t",-C[i]);
}
printf("\n---------------------------------------------------------------\n");
}
voidprint2()
{
inti,j;
printf("\n---------------------------------------------------------------\n");
for(i=0;i {
printf("X(%d)\t",num[i]);
for(j=0;j printf("%.3f\t",A[i][j]);
printf("%.3f\n",b[i]);
}
printf("\n---------------------------------------------------------------\n");
printf("cj-z