用c语言编写单纯形法的程序怎么写

用c语言编写单纯形法的程序怎么写,第1张

用c语言编写单纯形法的程序怎么写

#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]

}

}

童鞋,你的代码不全

initialTableau()

outsimplextableau()

standardize

utconstraint

outobj

以上这五个函数你只声明但是没有定义。所以麻烦你把全部的代码都贴上来。

其次,int checkoptimal(int &ii,int &jj)这种函数参数,叫做引用,是C++的语法,C语言中这样写是错误的,建议改为int checkoptimal(int *ii,int *jj),当然函数体里相应引用的地方也需要改一下。

希望对你有帮助,期待采纳,欢迎追问

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)


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11082854.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-13
下一篇 2023-05-13

发表评论

登录后才能评论

评论列表(0条)

保存