#include<stdio.h>
#include<math.h>
intm //记录约束条件方程组的个数
intn //记录未知量的个数
floatM=1000000.0
floatA[100][100] //用于记录方程组的数目和系数
floatC[100] //用于存储目标函数中各个变量的系数
floatb[100] //用于存储常约束条件中的常数
floatCB[100]//用于存储基变量的系数
floatseta[100] //存放出基与入基的变化情况
floatcn[100] //存储检验数矩阵
floatx[100]
intnum[100] //用于存放出基与进基变量的情况
floatZ=0 //记录目标函数值
voidshuru()
voidprint()
intmincz()
intfind_line(int a)
voidexchange(int a,int b)
intmain()
{
int i,j=0
int p,q,temp //q:换入,拦含桐p:换出
shuru()
printf("\n--------------------------------------------------------------------------\n")
printf(" \tCB\tXB\tb\t")
for(i=0i<ni++)
printf(" X(%d)\t",i+1)
for(i=0i<ni++)
x[i]=0
printf("\n")
while(1) {
q=mincz()
if(q==-1) {
print()
printf("\n所得解已经是最优解!\n")
printf("\n最优解为:\n")
for(j=0j<mj++) {
temp=num[j]-1
x[temp]=b[j]
}
for(i=0i<ni++) {
printf("x%d=%.2f",i+1,x[i])
Z=Z+x[i]*C[i]
}
printf("Z=%.2f",Z)
break
}
print()
p=find_line(q)
printf("\np=%d,q=%d",p,q)
if(q==-1) break
exchange(p,q)
}
return 0
}
intmincz()
{
int i,k=0
int flag=0//检验数标记
float min=0
for(i=0i<ni++)
if(cn[i]>=0)
flag=1
else {
flag=0
break
}
if(flag==1)
return -1
//进行到此处,说明存在<0的检验数
//找到最小的检验数,作为换入变量
for(i=0i<ni++) {
if(min>cn[i]) {
min=cn[i]
k=i
}
}
return k
}
intfind_line(int a)
{
int i,k,j
int flag=0
float min
k=a
for(i=0i<mi++)
if(A[i][k]<=0)
flag=1
else {
flag=0
break
}
if(flag==1) {
printf("\n该线性规划无最优解!\n")
return -1
}
for(i=0i<mi++) {
if(A[i][k]>0)
seta[i]=b[i]/A[i][k]
else seta[i]=M
}
min=M
for(i=0i<mi++) {
if(min>=seta[i]) {
min=seta[i]
j=i
}
}
num[j]=k+1
CB[j]=C[k]
return j
}
voidexchange(int p,int q)
{
int i,j,c,l
float temp1,temp2,temp3
c=p//行号,换出
l=q//列号,换入
temp1=A[c][l] //A[c][l]主元
b[c]=b[c]/temp1
for(j=0j<nj++)
A[c][j]=A[c][j]/temp1 //主元化为1
for(i=0i<mi++) {
if(i!=c)
if(A[i][l]!=0) {
temp2=A[i][l]
b[i]=b[i]-b[c]*temp2
//主元所在列,其余元素化为0
for(j=0j<nj++)
A[i][j]=A[i][j]-A[c][j]*temp2
}
}
temp3=cn[l]
for(i=0i<ni++)
cn[i]=cn[i]-A[c][i]*temp3
}
voidprint()
{
int i,j=0
printf("\n--------------------------------------------------------------------------\n")
for(i=0i<mi++) {
printf("%8.2f\tX(%d) %8.2f",CB[i],num[i],b[i])
for(j=0j<nj++)
printf("%8.2f ",A[i][j])
printf("\n")
}
printf("\n--------------------------------------------------------------------------\n")
printf("\t\t\t")
for(i=0i<ni++)
printf(" %8.2f",cn[i])
printf("\n--------------------------------------------------------------------------\n")
}
voidshuru()
{
int i,j//循环变量
int k
printf("请输入线性规划问题的约束条件个数M:")
scanf("%d",&m)
printf("请输入线性规划问题的决策变量个数N:")
scanf("%d",&n)
printf("\n请输入方程组的系数矩阵A(%d行%d列):\n",m,n)
for(i=0i<mi++)
for(j=0j<nj++)
scanf("%f",&A[i][j])
printf("\n请输入初始基变量的数字代码矩阵:\n")
for(i=0i<mi++)
scanf("%d",&num[i])
printf("\n请输入方程组右边的值矩阵b:\n")
for(i=0i<mi++)
scanf("%f",&b[i])
printf("\n请输入目标函数各个变量的系数所构成的系数阵C:\n")
for(i=0i<ni++)
scanf("%f",&C[i])
for(i=0i<ni++)
cn[i]=-C[i]
for(i=0i<mi++) {
k=num[i]-1
CB[i]=C[k]
}
}
function x=linliu(c,A,b)[n1,n2]=size(A)
A=[A,eye(n1)]c=[-c,zeros(1,n1)]
x1=[zeros(1,n2),b']lk=[n2+1:n1+n2]
fp=fopen('f:\liu.m','wt')
fprintf(fp,'初始单纯形表:\n')
while(1)
x=x1(1:n2)
s1=[lk',b,A]
c
x1
fprintf(fp,' 基b')
for j=1:n2+n1
fprintf(fp,' x%d ',j)
end
fprintf(fp,'\n')
for i=1:n1
fprintf(fp,'%4.1f %4.1f',lk(i),b(i))
for j=1:n2+n1
fprintf(fp,'%4.1f ',A(i,j))
end
fprintf(fp,'\基让n')
end
fprintf(fp,' ')
for i=1:n1+n2
fprintf(fp,'%4.1f ',c(i))
end
fprintf(fp,'\n解为:\n')
for i=1:n2+n1
fprintf(fp,'x(%d)=%3.2f,',i,x1(i))
end
cc=[]ci=[]
for i=1:n1+n2
if c(i)<0
cc=[cc,c(i)]
ci=[ci,i]
end
end
nc=length(cc)
if nc==0
fprintf('达到最优解')
fprintf(fp,'\n达到最优解')
break
end
cliu=cc(1)
cl=ci(1)
for j=1:nc
if abs(cc(j))>abs(cliu)
cliu=cc(j)
cl=j
end
end
cc1=[]ci1=[]
for i=1:n1
if A(i,cl)>0
cc1=[cc1,A(i,cl)]
ci1=[ci1,i]
end
end
nc1=length(cc1)
if nc1==0
fprintf('无有界最优解')
fprintf(fp,'无有界最优解')
break
end
cliu=b(ci1(1))/cc1(1)
cl1=ci1(1)
for j=1:nc1
if b(ci1(j))/cc1(j)<cliu
cliu=b(ci1(j))/cc1(j)
cl1=ci1(j)
end
end
fprintf(fp,'\nx(%d)入基,x(%d)出基\n',cl,lk(cl1))
fprintf('\滑键nx(%d)入基,x(%d)出基\n',cl,lk(cl1))
b(cl1)=b(cl1)/A(cl1,cl)
A(cl1,:)=A(cl1,:)/A(cl1,cl)
for k=1:n1
if k~=cl1
b(k)=b(k)-b(cl1)*A(k,cl)
A(k,:)=A(k,:)-A(cl1,:).*A(k,cl)
end
end
c=c-c(cl).*A(cl1,:)
x1(lk(cl1))=0
lk(cl1)=cl
for kk=1:n1
x1(lk(kk))=b(kk)
end
x=x1(1:n2)
end
fclose(fp)
检验:p31页 运筹学 清华搏让局版
format rat
c=[2 3]A=[1 24 00 4]b=[81612]
x=linliu(c,A,b)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)