单纯形法c语言.docx
- 文档编号:11771033
- 上传时间:2023-04-01
- 格式:DOCX
- 页数:17
- 大小:16.63KB
单纯形法c语言.docx
《单纯形法c语言.docx》由会员分享,可在线阅读,更多相关《单纯形法c语言.docx(17页珍藏版)》请在冰豆网上搜索。
单纯形法c语言
#include
#include
#defineN100
#defineM10000
floatarray[N][N];
floatb[N];
floatc[N];
floatrj[N];
floatb_x[N];
intxb[N];
intin_basic,out_basic;
introw,line;
intflag=0;
FILE*in;
voidprint(FILE*write,floatarra[][N],intx_b[N],intro,intlin,intin,intout)
{
inti,j;
fprintf(write,"");
for(i=0;i fprintf(write,"x%d",i+1); fprintf(write,"b\n\n"); for(i=0;i { if(i fprintf(write,"x%d",x_b[i]); else fprintf(write,"rj"); for(j=0;j if(i==out&&j==in) fprintf(write,"%6.2f*",arra[i][j]); else fprintf(write,"%7.2f",arra[i][j]); fprintf(write,"\n"); } for(i=0;i<80;i++) fprintf(write,"-"); fprintf(write,"\n"); } voidarray_conv(floatarra[][N],intro,intlin,intin,intout) { inti,j; floattemp; temp=arra[out][in]; for(i=0;i arra[out][i]/=temp; for(i=0;i { if(i! =out) { temp=arra[i][in]; for(j=0;j arra[i][j]-=temp*arra[out][j]; } } } intb_to_x(floatarra[][N],float*bx,int*xB,intro,intlin,intin) { inti,j,k=0; floatmin; for(i=0;i if(arra[i][in]>-1e-5) { bx[i]=arra[i][lin-1]/arra[i][in]; k=1; } else bx[i]=M; if(k==0)returnM; min=bx[0]; j=0; for(i=1;i { if(bx[i] { 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) { inti,j; floatmin; min=arra[ro-1][0]; j=0; for(i=1;i if(arra[ro-1][i] { min=arra[ro-1][i]; j=i; } if(min>-1e-5) returnM; else returnj; } voidsmj() { inti,j; floatxx[N]; for(i=0;i array[i][line]=b[i]; for(i=0;i array[row][i]=c[i]; array[row][line]=0; for(i=0;i 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! =M) 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问题无解! \n"); break; } } if(out_basic! =M) { j=0; for(i=0;i if(array[row][i]>1e-5) j++; if(j fprintf(in,"\nLP问题有无穷最优解,其中之一如下: \n"); fprintf(in,"\nf*=%f\n",-array[row][line]); fprintf(in,"x*=("); for(i=0;i xx[i]=0; for(i=0;i xx[xb[i]-1]=array[i][line]; for(i=0;i fprintf(in,"%6.2f",xx[i]); fprintf(in,")T\n"); } } voidconv() { inti,j; floatxx[N]; floattemp[N]; for(i=0;i array[row][i]=c[i]; for(i=0;i array[i][line]=array[i][line+row+flag]; array[row][line]=0; for(i=0;i temp[i]=array[row][xb[i]-1]; for(i=0;i for(j=0;j array[row][i]-=temp[j]*array[j][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! =M) 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,"找不到出基变量,LP问题无解! "); break; } } if(out_basic! =M) { j=0; for(i=0;i if(array[row][i]>1e-5) j++; if(j fprintf(in,"\nLP问题有无穷最优解,其中之一如下: \n"); fprintf(in,"\nf*=%f\n",-array[row][line]); fprintf(in,"x*=("); for(i=0;i xx[i]=0; for(i=0;i xx[xb[i]-1]=array[i][line]; for(i=0;i fprintf(in,"%6.2f",xx[i]); fprintf(in,")T\n"); } } voidconve() { inti,j=0,k; while(j! =1) { j=0; k=0; for(i=0;i if(xb[i]>line) { j++; k=i; } if(j! =0) { out_basic=k; for(i=0;i { for(k=0;k if(xb[k]==(i+1)) break; if(k==row) { in_basic=i; break; } } xb[out_basic]=in_basic+1; 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;i xb[i]=xb[i+1]; for(i=0;i for(j=k;j array[j][i]=array[j+1][i]; li--; k=N+1; for(i=0;i if(xb[i]>line) { k=i; break; } j=0; if(k! =N+1) { for(i=0;i if(array[k][i]>1e-5||array[k][i]<-1e5) break; if(i { k=N+1; j=1; } } } for(i=0;i array[li][i]=array[row][i]; flag=row-li; row=li; if(j==0) conv(); else conve(); } void_smj() { inti,j,k; floattemp; fprintf(in,"\n建立辅助LPminw="); for(i=0;i fprintf(in,"x%d+",line+1+i); fprintf(in,"x%d\n\n",line+row); for(i=0;i for(j=line;j if(i==j-line) array[i][j]=1; else array[i][j]=0; for(i=0;i array[i][line+row]=b[i]; for(i=0;i c[i+line]=0; for(i=0;i array[row][i]=0; for(i=0;i { temp=0; for(k=0;k temp+=array[k][i]; array[row][i]=-temp; } temp=0; for(i=0;i temp+=array[i][line+row]; array[row][line+row]=-temp; for(i=0;i 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); while(in_basic! =M) { if(in_basic! =M) xb[out_basic]=in_basic+1; 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(out_basic==M) { fprintf(in,"找不到出基变量,LP问题无解! "); break; } } if((array[row][line+row]>1e-5)||(array[row][line+row]<-1e-5)) fprintf(in,"因为: f*=%5.2f! =0\n原LP问题没有最优解! ",-array[row][line+row]); else { fprintf(in,"LP问题进入第二阶段。 \n\n"); j=0; k=0; for(i=0;i if(xb[i]>line) { j++; k=i; break; } if(j==0) conv(); else { for(i=0;i if(array[k][i]>1e-5||array[k][i]<-1e-5) break; if(i conve(); else linezecon(k); } } } main() { inti,j; chard='a'; charname[50]="d: \\dcxf\\"; printf("\n************单纯形法求解程序**************\n\n"); printf("请输入矩阵A的行数: "); scanf("%d",&row); printf("\n"); printf("请输入矩阵A的列数: "); scanf("%d",&line); printf("\n"); printf("请输入向量c'="); for(i=0;i scanf("%f",&c[i]); printf("\n"); printf("请输入向量b'="); for(i=0;i scanf("%f",&b[i]); printf("\n"); printf("请输入矩阵A为: \n\n"); for(i=0;i for(j=0;j scanf("%f",&array[i][j]); i=0; while(name[i]! ='\0')i++; printf("\n请输入输出文件名: "); scanf("%s",name+i); i=0; while(name[i]! ='\0')i++; name[i++]='.'; name[i++]='t'; name[i++]='x'; name[i++]='t'; name[i]='\0'; if((i=access("d: \\dcxf",0))==-1) system("mkdird: \\dcxf"); if((in=fopen(name,"w"))==NULL) { printf("\n\n文件打不开! \n"); exit(0); } fprintf(in,"\n\n---------------输入的数据如下-------------------\n\n"); fprintf(in,"A=\n"); for(i=0;i { fprintf(in,""); for(j=0;j fprintf(in,"%6.2f",array[i][j]); fprintf(in,"\n"); } fprintf(in,"\n\n\tc'=("); for(i=0;i fprintf(in,"%6.2f",c[i]); fprintf(in,")\n"); fprintf(in,"\n\tb'=("); for(i=0;i fprintf(in,"%6.2f",b[i]); fprintf(in,")\n"); fprintf(in,"\n---------------具体步骤如下-------------------\n\n"); printf("\n是否是典范式LP? [y/n]"); while(d! ='y'&&d! ='n') scanf("%c",&d); if(d=='y') smj(); else _smj(); fprintf(in,"\n----------------------END----------------------------\n"); fclose(in); printf("\n\tWaiting...\n"); system(name); printf("\n--------------Ok! ----------------\n"); printf("\n\n*********结束**********\n\n"); }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单纯 语言