使用C语言实现单纯形法求解线性规划问题
单纯形法C实现
![单纯形法C实现](https://img.taocdn.com/s3/m/18234504de80d4d8d15a4f7f.png)
#include<stdio.h>#define M 5#define N 7float Max(float a[],int n);int k,l;void main(){ float a[M][N];//{{0,2,3,0,0,0,0},{12,2,2,1,0,0,0},{8,1,2,0,1,0,0},{16,4,0,0,0,1, 0},{12,0,4,0,0,0,1}};//初始化单纯形表float cb[M],X[N],z[N],cj[N];//z[M]为检验数准备,jj[M],cj[N]是检验数int jj[M],i,j;int s,p,t=0;float maxcj,Z=0.0;printf("请输入一个%d行%d列的初始单纯形表用于求解%d个约束条件%d个变量的线性规划的原问题!",M,N,M-1,N-1);printf("\n"); printf("请输入初始单纯形表的第1行元素即变量的价值系数(第一个元素应默认为0.0)!");printf("\n");for(j=0;j<N;j++)scanf("%f",&a[0][j]);for(i=1;i<M;i++){printf("请输入初始单纯形表的第%d行元素即限定条件与系数矩阵!",i+1);printf("\n");for(j=0;j<N;j++)scanf("%f",&a[i][j]);}//初始化单纯形表*/for(i=1;i<N;i++) //最优解矩阵的初始化X[i]=0.0;for(j=1;j<N;j++){ s=0;p=0;for(i=1;i<M;i++){if(a[i][j]==1){s++;p=i;}}if(s==1)jj[p]=j;} //确定初始基变量,并标识基变量位置//jj[1]=3;jj[2]=4;jj[3]=5;jj[4]=6;//确定初始基变量,并标识基变量位置for(i=1;i<M;i++) cb[i]=a[0][jj[i]]; //基变量的价值系数for(j=0;j<N;j++)X[j]=0.0;for(i=1;i<M;i++)X[jj[i]]=a[i][0];for(j=1;j<N;j++){ z[j]=0.0;for(i=1;i<M;i++)z[j]+=cb[i]*a[i][j]; }//为寻找出基变量的检验数做准备for(j=1;j<N;j++){ cj[j]=0.0;cj[j]=a[0][j]-z[j];}// 检验数maxcj=Max(cj,N);printf("*********************************\n"); printf("输入的单纯形表如下:\n");for(i=0;i<M;i++){ for(j=0;j<N;j++)printf("%6.2f",a[i][j]);printf("\n");} //输出初始化单纯形表//for(i=1;i<M;i++)//printf("%6.2f",cb[i]);printf("\n");//输出基变量的价值系数//for(i=1;i<N;i++)//printf("%6.2f",X[i]);printf("\n");//输出一个基本可行解矩阵//for(j=1;j<N;j++)//printf("%6.2f",cj[j]);printf("\n");// 输出检验数printf("*********************************\n");while(maxcj>0){float R,alk;R=1000.0;for(i=1;i<M;i++)if(a[i][k]>0){ if(R>a[i][0]/a[i][k]){ R=a[i][0]/a[i][k];l=i;}else if(R==a[i][0]/a[i][k])if(jj[l]<jj[i])l=i;else;}if(R==1000.0){ printf("此问题无解!");t=1;break;}jj[l]=k;alk=a[l][k];for(j=0;j<N;j++)a[l][j]=a[l][j]/alk;for(i=1;i<M;i++)if(i!=l)for(j=0;j<N;j++)if(j!=k)a[i][j]=a[i][j]-a[l][j]/a[l][k]*a[i][k]; for(i=1;i<M;i++)if(i!=l)a[i][k]=0.0;for(i=1;i<M;i++)cb[i]=a[0][jj[i]]; //基变量的价值系数for(j=0;j<N;j++)X[j]=0.0;for(i=1;i<M;i++)X[jj[i]]=a[i][0];for(j=1;j<N;j++){ z[j]=0.0;for(i=1;i<M;i++)z[j]+=cb[i]*a[i][j]; }//为寻找出基变量的检验数做准备for(j=1;j<N;j++){ cj[j]=0.0;cj[j]=a[0][j]-z[j];} // 检验数maxcj=Max(cj,N);}if(t!=1){for(j=0;j<N;j++)Z+=a[0][j]*X[j];for(i=0;i<M;i++){ for(j=0;j<N;j++)printf("%6.2f",a[i][j]);printf("\n");}//输出初始化单纯形表//for(i=1;i<M;i++)//printf("%6.2f",cb[i]);printf("\n");//输出基变量的价值系数printf("满足最优解时,X的取值如下:");printf("\n");for(i=1;i<N;i++)printf("X[%d]=%6.2f,",i,X[i]);printf("\n");//输出一个基本可行解矩阵//for(j=1;j<N;j++)//printf("%6.1f",z[j]);printf("\n");//for(j=1;j<N;j++)//printf("%6.2f",cj[j]);printf("\n");// 输出检验数printf("最优解为Z=%6.2f",Z);printf("\n");}}float Max(float a[],int n){int i,maxjj;float maxaj;maxaj=a[1];maxjj=1;for(i=2;i<n;i++)if(maxaj<a[i]){ maxaj=a[i]; maxjj=i;} k=maxjj;return (maxaj);}。
单纯形法C语言程序
![单纯形法C语言程序](https://img.taocdn.com/s3/m/367ada317f1922791788e84f.png)
单纯形法C语言程序实验:编制《线性规划》计算程序一、实验目的:(1)使学生在程序设计方面得到进一步的训练;,掌握Matlab (C或VB)语言进行程序设计中一些常用方法。
(2)使学生对线性规划的单纯形法有更深的理解.二、实验用仪器设备、器材或软件环境计算机, Matlab R2009a三、算法步骤、计算框图、计算程序等本实验主要编写如下线性规划问题的计算程序:mincxAx,b ,s.t.,x,0,b,0,其中初始可行基为松弛变量对应的列组成.对于一般标准线性规划问题:mincxAx,b ,s.t.,x,0,b,0,,(求解上述一般标准线性规划的单纯形算法(修正)步骤如下:对于一般的标准形式线性规划问题(求极小问题),首先给定一个初始基本可行解。
设初始基为B,然后执行如下步骤:,1Bxb,xBb,令计算目标函数值xfcx,,0,BNBBB(1).解,求得,,1以b(1,2,...,)imBbi,记的第个分量i,1wBC,wCB,BB(2).计算单纯形乘子w, ,得到,对于非基变量,计算判别,1,1,Ac,数,可直接计算令 ,,,,,zccBpciiiBii,cBB,R为非基变量集合 ,,max{}k,,iR,,0k若判别数 ,则得到一个最优基本可行解,运算结束;否则,转到下一步,1yy,0Byp,yBp,kkkkkk(3).解,得到;若,即的每个分量均非正数,则停止计算,问题不存在有限最优解,否则,进行步骤(4).确定下标r,使bbtr,,min,0且y,,x为离基变量,tkyyrktkB:0,tyrtkxp为进基变量,用p替换得到新的基矩阵,B,还回步骤(1)kBkr;12,、计算框图为:开始初始可行基B,1 令x,Bb,x,0,f,cxBNBB1 ,,计算单纯性乘子w,cB,计算判别数,wp,c,j,R(非基变量)Bjjj令,,max{,,j,R}kj是,,0?k否得到最优解,1 解方程By,p,得到y,Bp,kkkk是y,0? k否不存在有限最优解确定下标r,使得,,bbir,min|,0 y,,ikyyrkik,,x为退基变量,x进基变量,以Bkrp代替p,得到新的基矩阵BkBr3: 3(计算程序(Matlab)A=input('A=');b=input('b=');c=input('c=');format rat %可以让结果用分数输出[m,n]=size(A);E=1:m;E=E';F=n-m+1:n;F=F';D=[E,F]; %创建一个一一映射,为了结果能够标准输出 X=zeros(1,n); %初始化Xif(n<m) %判断是否为标准型fprintf('不符合要求需引入松弛变量')flag=0;elseflag=1;B=A(:,n-m+1:n); %找基矩阵cB=c(n-m+1:n); %基矩阵对应目标值的cwhile flagw=cB/B; %计算单纯形乘子,cB/B=cB*inv(B),用cB/B的目的是,为了提高运行速度。
单纯形法C++实现
![单纯形法C++实现](https://img.taocdn.com/s3/m/c7e32de79f3143323968011ca300a6c30c22f1f2.png)
单纯形法C++实现使⽤单纯型法来求解线性规划,输⼊单纯型法的松弛形式,是⼀个⼤矩阵,第⼀⾏为⽬标函数的系数,且最后⼀个数字为当前轴值下的 z 值。
下⾯每⼀⾏代表⼀个约束,数字代表系数每⾏最后⼀个数字代表 b 值。
算法和使⽤单纯性表求解线性规划相同。
对于线性规划问题:Max x1 + 14* x2 + 6*x3s . t . x1 + x2 + x3 <= 4 x1<= 2 x3 <= 3 3*x2 + x3 <= 6 x1,x2,x3 >= 0我们可以得到其松弛形式:Max x1 + 14*x2 + 6*x3s.t. x1 + x2 + x3 + x4 = 4 x1 + x5 = 2 x3 + x6 = 3 3*x2 + x3 + x7 = 6 x1 , x2 , x3 , x4 , x5 , x6 , x7 ≥ 0我们可以构造单纯性表,其中最后⼀⾏打星的列为轴值。
单纯性表x1x2x3x4x5x6x7bc1=1c2=14c3=6c4=0c5=0c6=0c7=0-z=011110004100010020010010303100016****在单纯性表中,我们发现⾮轴值的x上的系数⼤于零,因此可以通过增加这些个x的值,来使⽬标函数增加。
我们可以贪⼼的选择最⼤的c,再上⾯的例⼦中我们选择c2作为新的轴,加⼊轴集合中,那么谁该出轴呢?其实我们由于每个x都⼤于零,对于x2它的增加是有所限制的,如果x2过⼤,由于其他的限制条件,就会使得其他的x⼩于零,于是我们应该让x2⼀直增⼤,直到有⼀个其他的x刚好等于0为⽌,那么这个x就被换出轴。
我们可以发现,对于约束⽅程1,即第⼀⾏约束,x2最⼤可以为4(4/1),对于约束⽅程4,x2最⼤可以为3(6/3),因此x2最⼤只能为他们之间最⼩的那个,这样才能保证每个x都⼤于零。
因此使⽤第4⾏,来对各⾏进⾏⾼斯⾏变换,使得⼆列第四⾏中的每个x都变成零,也包括c2。
单纯形法C语言程序.
![单纯形法C语言程序.](https://img.taocdn.com/s3/m/8230b59ab9d528ea81c7799c.png)
实验:编制《线性规划》计算程序一、实验目的:(1)使学生在程序设计方面得到进一步的训练,掌握Matlab (C 或VB)语言进行程序设计中一些常用方法。
(2)使学生对线性规划的单纯形法有更深的理解.二、实验用仪器设备、器材或软件环境计算机, Matlab R2009a三、算法步骤、计算框图、计算程序等本实验主要编写如下线性规划问题的计算程序:⎩⎨⎧≥≥≤0,0..min b x b Ax t s cx其中初始可行基为松弛变量对应的列组成.对于一般标准线性规划问题:⎩⎨⎧≥≥=0,0..min b x b Ax t s cx1.求解上述一般标准线性规划的单纯形算法(修正)步骤如下:对于一般的标准形式线性规划问题(求极小问题),首先给定一个初始基本可行解。
设初始基为B,然后执行如下步骤:(1).解B Bx b =,求得1B x B b -=,0,N B B x f c x ==令计算目标函数值 1(1,2,...,)i m B b i -=i 以b 记的第个分量(2).计算单纯形乘子w, B wB C =,得到1B w C B -=,对于非基变量,计算判别数1i i i B i i z c c B p c σ-=-=-,可直接计算σ=1B A c c B --令 max{}k i R σσ∈=,R 为非基变量集合若判别数0k σ≤ ,则得到一个最优基本可行解,运算结束;否则,转到下一步(3).解k k By p =,得到1k k y B p -=;若0k y ≤,即k y 的每个分量均非正数, 则停止计算,问题不存在有限最优解,否则,进行步骤(4).确定下标r,使 {}:0min ,0t rrk tk tk b b tk y y t y y >=>且r B x 为离基变量,,r k B x p k 为进基变量,用p 替换得到新的基矩阵B,还回步骤(1);2、计算框图为:最优解3.计算程序(Matlab):A=input('A=');b=input('b=');c=input('c=');format rat%可以让结果用分数输出[m,n]=size(A);E=1:m;E=E';F=n-m+1:n;F=F';D=[E,F]; %创建一个一一映射,为了结果能够标准输出X=zeros(1,n); %初始化Xif(n<m) %判断是否为标准型fprintf('不符合要求需引入松弛变量')flag=0;elseflag=1;B=A(:,n-m+1:n); %找基矩阵cB=c(n-m+1:n); %基矩阵对应目标值的cwhile flagw=cB/B; %计算单纯形乘子,cB/B=cB*inv(B),用cB/B的目的是,为了提高运行速度。
单纯形法例程
![单纯形法例程](https://img.taocdn.com/s3/m/912ae046561252d380eb6eea.png)
单纯形法例程该程序是用单纯形法求解线性规划的C语言程序。
运行该程序时可根据提示按行输入线性规划的相关系数,程序输出线性规划的最优解所含基变量及其取值和最优解对应的目标函数值。
1. 说明:(1)当线性规划的变量数n大于40或约束方程数m大于20时(例如n=140,m=100),只要修改程序中行:double, q,p1,A[21][41], ,A0[21][41],b[21], b0[21],x[41],c[41] ,c0[41];int n, i,j,k , m, p,J[41], J0[41],s[21];中的41(为141)20(为101)既可。
(2)该程序仅适应于目标函数取最小且已知一个基解的标准形式的线性规划。
(3)程序中所用标识符和算法7.1基本相同。
2. 单纯形法例程源代码#include <stdio.h>#include <math.h>void main(){float q,p1,A[21][41],A0[21][41],b[21],b0[21],x,c[41],c0[41];int n, i,j,k , m, p,J[41], J0[41],s[21];printf("请输入方程组的行数m(<=20)列数n(<=40)");scanf("%d,%d",&m,&n);for(i=1;i<=m;i++){printf("请输入系数矩阵A的第%d行:\n",i);for(j=1;j<=n;j++)scanf("%f",&A[i][j]);}printf("请输入右端向量b:");for(i=1;i<=m;i++)scanf("%f",&b[i]);printf("请输入目标函数中个变量的系数向量c:");for(j=1;j<=n;j++)scanf("%f",&c[j]);printf("请输入初始基变量标志(是基变量输1不是输0):");for(j=1;j<=n;j++)scanf("%d",&J[j]);for(j=1;j<=n;j++)J0[j]=1-J[j];printf("请输入各行上基变量的下标数:");for(i=1;i<=m;i++)scanf("%d",&s[i]);d1: for(i=1;i<=m;i++)for(j=1;j<=n;j++)A0[i][j]=(-1)*c[s[i]]*A[i][j]*J0[j];for(j=1;j<=n;j++){p1=0;for(i=1;i<=m;i++)p1=p1+A0[i][j];c0[j]=p1+c[j]*J0[j];}d2: q=c0[1];p=1;for(j=2;j<=n;j++)if (c0[j]<q){q=c0[j];p=j;}if (q>=0){q=0;printf("最优解基变量及其取值分别为:\n"); for(i=1;i<=m;i++){printf("x[%d]=%f\n",s[i],b[i]);q=q+c[s[i]]*b[i];}printf("最优解的目标函数值为:%f\n", q); return;}else{for(i=1;i<=m;i++){if (A[i,p]==0)b0[i]=-1;else if ((b[i]==0)&&(A[i,p]<0))b0[i]=-1;else if ((b[i]==0)&&(A[i,p]>0)){c0[p]=1;goto d2;}elseb0[i]=b[i]/A[i][p];}q=b0[1];for(i=2;i<=m;i++)if (b0[i]>q)q=b0[i];if (q<0){printf("线性规划无最优解\n"); return;}else{for(i=1;i<=m;i++)if ((b0[i]>0)&&(b0[i]<=q)) {q=b0[i];k=i;}J[p]=1;J[s[k]]=0;J0[p]=0;J0[s[k]]=1;s[k]=p;x=A[k][p];for(j=1;j<=n;j++)A[k][j]=A[k][j]/x;b[k]=b[k]/x;for(i=k-1;i>=1;i--){x=A[i][p];for(j=1;j<=n;j++)A[i][j]=A[i][j]-A[k][j]*x;b[i]=b[i]-b[k]*x;}for(i=k+1;i<=m;i++){x=A[i][p];for(j=1;j<=n;j++)A[i][j]=A[i][j]-A[k][j]*x;b[i]=b[i]-b[k]*x;}}}goto d1;}。
用c语言实现单纯形法的编程
![用c语言实现单纯形法的编程](https://img.taocdn.com/s3/m/54daea4cbe23482fb4da4c1d.png)
用c语言实现单纯形法的编程#include "stdio.h"#include "math.h"#include <iostream>int M,N;float c[100],a[100][100],b[100],CZ[100],Dn[100],th[100],x[100];int Fn[100];int K,L,ths;float zy;int shuru();void findmm();void chang();main(){float max_Z,sum=0,s=0;int i,j,r=0;if(!shuru()) { printf("ERROR!!!\n");return 0;}while(r<N){ r=0;for(j=0;j<N;j++){if(Dn[j]>0){findmm();if(ths==M) {goto loop;}else chang();}else r++;}}loop:if(ths==M){printf("\n此线性规划没有有限最优解!!!\n");printf("\n此线性规划最终迭代结果为:");printf("\n Cj ");for(j=0;j<N;j++)printf("%.3f ",c[j]);printf("\n");printf("Cb Xb b ");for(j=0;j<N;j++)printf(" x%d ",j+1);printf(" th ");for(i=0;i<M;i++){ printf("\n%.1f ",CZ[i]);printf("x%d ",Fn[i]+1);printf("%.3f ",b[i]);for(j=0;j<N;j++){ printf(" %.3f ",a[i][j]);}printf(" %.3f ",th[i]);printf("\n");}printf(" Dn ");for(j=0;j<N;j++)printf(" %.3f ",Dn[j]);printf("\n");printf("\n此时的解为:");sum=0;for(i=0;i<M;i++){ sum+=CZ[i]*b[i];printf("\nx%d=%.3f",Fn[i]+1,b[i]);}max_Z=sum;printf("\n此时目标函数的值为:Z= %.3f\n",max_Z);}else{printf("\n此线性规划最终迭代结果为:");printf("\n Cj ");for(j=0;j<N;j++)printf("%.3f ",c[j]);printf("\n");printf("Cb Xb b ");for(j=0;j<N;j++)printf(" x%d ",j+1);printf(" th ");for(i=0;i<M;i++){ printf("\n%.1f ",CZ[i]);printf("x%d ",Fn[i]+1);printf("%.3f ",b[i]);for(j=0;j<N;j++){ printf(" %.3f ",a[i][j]);}printf(" %.3f ",th[i]);printf("\n");}printf(" Dn ");for(j=0;j<N;j++)printf(" %.3f ",Dn[j]);printf("\n");printf("\n故,目标函数的基解为:");sum=0;for(i=0;i<M;i++){ sum+=CZ[i]*b[i];printf("\nx%d=%.3f",Fn[i]+1,b[i]);}max_Z=sum;printf("\n目标函数的值为:max_Z= %.3f\n",max_Z);}system("pause");return 1;}int shuru(){ int i,j;float sum=0;printf("请输入线性规划问题的约束条件个数M:");scanf("%d",&M);printf("请输入线性规划问题的决策变量个数N:");scanf("%d",&N);printf("请输入目标函数的系数:");for(i=0;i<N;i++)scanf("%f",&c[i]);printf("请输入线性规划问题的约束矩阵:\n");for(i=0;i<M;i++){ for(j=0;j<N;j++)scanf("%f",&a[i][j]);scanf("%f",&b[i]);}printf("请输入线性规划问题的初始基:\n");for(j=0;j<N;j++)scanf("%f",&x[j]);for(i=j=0;j<N;j++){if(x[j]!=0){ Fn[i]=j;CZ[i]=c[j];i++;}}for(j=0;j<N;j++){ sum=0;for(i=0;i<M;i++)sum+=CZ[i]*a[i][j];Dn[j]=c[j]-sum;}return 1;}void findmm(){ int i;int max,min;max=0;K=max;for(i=1;i<N;i++)if(Dn[i]>Dn[K]) max=i;K=max;for(i=0;i<M;i++){if(a[i][K]!=0) {th[i]=b[i]/a[i][K];min=i;} else th[i]=-1;}ths=0;for(i=0;i<M;i++)if(th[i]<0) ths=ths+1;for(i=0;i<M;i++)if((th[i]>0)&&(th[i]<th[min])) min=i;L=min;zy=a[L][K];Fn[L]=K;CZ[L]=c[K];}void chang(){ int i,j;float t;for(j=0;j<N;j++)a[L][j]=a[L][j]/zy;b[L]=b[L]/zy;for(i=0;i<M;i++){if(i==L) continue;t=a[i][K];b[i]=b[L]*(-t)+b[i];for(j=0;j<N;j++)a[i][j]=a[L][j]*(-t)+a[i][j];}t=Dn[K];for(j=0;j<N;j++)Dn[j]=(-t)*a[L][j]+Dn[j];K=0;for(i=1;i<N;i++)if(Dn[i]>Dn[K]) K=i;for(i=0;i<M;i++){if(a[i][K]!=0) {th[i]=b[i]/a[i][K];}else th[i]=-1;}}#include "stdio.h"#include "math.h"#include <iostream>int M,N;float c[100],a[100][100],b[100],CZ[100],Dn[100],th[100],x[100]; int Fn[100];int K,L,ths;float zy;int shuru();void findmm();void chang();main(){float max_Z,sum=0,s=0;int i,j,r=0;if(!shuru()) { printf("ERROR!!!\n");return 0;}while(r<N){ r=0;for(j=0;j<N;j++){if(Dn[j]>0){findmm();if(ths==M) {goto loop;} else chang();}else r++;}}loop:if(ths==M){printf("\n此线性规划没有有限最优解!!!\n");printf("\n此线性规划最终迭代结果为:");printf("\n Cj ");for(j=0;j<N;j++)printf("%.3f ",c[j]);printf("\n");printf("Cb Xb b ");for(j=0;j<N;j++)printf(" x%d ",j+1);printf(" th ");for(i=0;i<M;i++){ printf("\n%.1f ",CZ[i]);printf("x%d ",Fn[i]+1);printf("%.3f ",b[i]);for(j=0;j<N;j++){ printf(" %.3f ",a[i][j]);}printf(" %.3f ",th[i]);printf("\n");}printf(" Dn ");for(j=0;j<N;j++)printf(" %.3f ",Dn[j]);printf("\n");printf("\n此时的解为:");sum=0;for(i=0;i<M;i++){ sum+=CZ[i]*b[i];printf("\nx%d=%.3f",Fn[i]+1,b[i]);}max_Z=sum;printf("\n此时目标函数的值为:Z= %.3f\n",max_Z); }else{printf("\n此线性规划最终迭代结果为:");printf("\n Cj ");for(j=0;j<N;j++)printf("%.3f ",c[j]);printf("\n");printf("Cb Xb b ");for(j=0;j<N;j++)printf(" x%d ",j+1);printf(" th ");for(i=0;i<M;i++){ printf("\n%.1f ",CZ[i]);printf("x%d ",Fn[i]+1);printf("%.3f ",b[i]);for(j=0;j<N;j++){ printf(" %.3f ",a[i][j]);}printf(" %.3f ",th[i]);printf("\n");}printf(" Dn ");for(j=0;j<N;j++)printf(" %.3f ",Dn[j]);printf("\n");printf("\n故,目标函数的基解为:");sum=0;for(i=0;i<M;i++){ sum+=CZ[i]*b[i];printf("\nx%d=%.3f",Fn[i]+1,b[i]);}max_Z=sum;printf("\n目标函数的值为:max_Z= %.3f\n",max_Z);}system("pause");return 1;}int shuru(){ int i,j;float sum=0;printf("请输入线性规划问题的约束条件个数M:"); scanf("%d",&M);printf("请输入线性规划问题的决策变量个数N:"); scanf("%d",&N);printf("请输入目标函数的系数:");for(i=0;i<N;i++)scanf("%f",&c[i]);printf("请输入线性规划问题的约束矩阵:\n");for(i=0;i<M;i++){ for(j=0;j<N;j++)scanf("%f",&a[i][j]);scanf("%f",&b[i]);}printf("请输入线性规划问题的初始基:\n");for(j=0;j<N;j++)scanf("%f",&x[j]);for(i=j=0;j<N;j++){if(x[j]!=0){ Fn[i]=j;CZ[i]=c[j];i++;}}for(j=0;j<N;j++){ sum=0;for(i=0;i<M;i++)sum+=CZ[i]*a[i][j];Dn[j]=c[j]-sum;}return 1;}void findmm(){ int i;int max,min;max=0;K=max;for(i=1;i<N;i++)if(Dn[i]>Dn[K]) max=i;K=max;for(i=0;i<M;i++){if(a[i][K]!=0) {th[i]=b[i]/a[i][K];min=i;} else th[i]=-1;}ths=0;for(i=0;i<M;i++)if(th[i]<0) ths=ths+1;for(i=0;i<M;i++)if((th[i]>0)&&(th[i]<th[min])) min=i; L=min;zy=a[L][K];Fn[L]=K;CZ[L]=c[K];}void chang(){ int i,j;float t;for(j=0;j<N;j++)a[L][j]=a[L][j]/zy;b[L]=b[L]/zy;for(i=0;i<M;i++){if(i==L) continue;t=a[i][K];b[i]=b[L]*(-t)+b[i];for(j=0;j<N;j++)a[i][j]=a[L][j]*(-t)+a[i][j];}t=Dn[K];for(j=0;j<N;j++)Dn[j]=(-t)*a[L][j]+Dn[j];K=0;for(i=1;i<N;i++)if(Dn[i]>Dn[K]) K=i;for(i=0;i<M;i++){if(a[i][K]!=0) {th[i]=b[i]/a[i][K];} else th[i]=-1;}}/view/579bf98b79563c1ec5da71a4.html /view/560260a8647d27284a73510c.html /view/da495b9b76eeaeaad1f330f9.html//在Visual C++控制台程序中编译执行#include<iostream.h>#include<math.h>#define M 10000//全局变量float kernel[11][31];//核心矩阵表int m=0,n=0,t=0;//m:结构向量的个数//n:约束不等式个数//t:目标函数类型:-1代表求求最小值,1代表求最大值//输入接口函数void input(){//读入所求问题的基本条件cout<<"----------参数输入-----------"<<endl;cout<<"请按提示输入下列参数:"<<endl<<endl;cout<<" 结构向量数m: "<<" m= ";cin>>m;cout<<endl<<" 约束不等式数n:"<<" n= ";cin>>n;int i,j;//初始化核心向量for (i=0;i<=n+1;i++)for (j=0;j<=m+n+n;j++)kernel [i][j]=0;//读入约束条件cout<<endl<<" 约束方程矩阵的系数及不等式方向(1代表<=,-1代表>=):"<<endl<<endl<<" ";for (i=1;i<=m;i++)cout<<" x"<<i;cout<<" 不等式方向 "<<" 常数项"<<endl;for (i=1;i<=n;i++){cout<<" 不等式"<<i<<" ";for (j=1;j<=m+2;j++)cin>>kernel [i][j];}for (i=1;i<=n;i++){kernel [i][0]=kernel [i][m+2];kernel [i][m+2]=0;}//读入目标条件cout<<endl<<endl<<" 目标函数的系数及类型(求最小值:1;求最大值:-1):"<<endl<<endl<<" ";for(i=1;i<=m;i++)cout<<"x"<<i<<" ";cout<<"类型"<<endl<<" ";cout<<" 目标函数: ";for (i=1;i<=m;i++)cin>>kernel [0][i];cin>>t;//矩阵调整if(t==-1)for(i=1;i<=m;i++)kernel [0][i]=(-1)*kernel [0][i];for(i=1;i<=n;i++){kernel [i][m+i]=kernel [i][m+1];if(i!=1)kernel [i][m+1]=0;}}//算法函数void comput(){int i,j,flag,temp1,temp2,h,k=0,temp3[10];float a,b[11],temp,temp4[11],temp5[11],f=0,aa,d,c; //初始化for(i=1;i<=n;i++)temp3[i]=0;for(i=0;i<11;i++){ temp4[i]=0;temp5[i]=0;}for(i=1;i<=n;i++){if(kernel [i][m+i]==-1){kernel [i][m+n+i]=1;kernel [0][m+n+i]=M;temp3[i]=m+n+i;}elsetemp3[i]=m+i;}for(i=1;i<=n;i++)temp4[i]=kernel [0][temp3[i]];//循环求解do{for(i=1;i<=m+n+n;i++){a=0;for(j=1;j<=n;j++)a+=kernel [j][i]*temp4[j];kernel [n+1][i]=kernel [0][i]-a; }for(i=1;i<=m+n+n;i++){if(kernel [n+1][i]>=0) flag=1; else{flag=-1;break;}}if(flag==1){ for(i=1;i<=n;i++){if(temp3[i]<=m+n) temp1=1; else{temp1=-1; break;}}//输出结果cout<<endl<<endl;cout<<"----------结果输出-----------"<<endl<<endl;if(temp1==1){cout<<" 此线性规划的最优解存在!"<<endl<<endl<<" 最优解为:"<<endl<<endl<<" ";for(i=1;i<=n;i++)temp5[temp3[i]]=kernel [i][0];for(i=1;i<=m;i++)f+=t*kernel [0][i]*temp5[i];for(i=1;i<=m;i++){cout<<"x"<<i<<" = "<<temp5[i];if(i!=m)cout<<", ";}cout<<" ;"<<endl<<endl<<" 最优目标函数值f= "<<f<<endl<<endl;return ;}else{cout<<" 此线性规划无解"<<endl<<endl; return ;}}if(flag==-1){temp=100000;for(i=1;i<=m+n+n;i++)if(kernel [n+1][i]<temp){temp=kernel [n+1][i];h=i;}for(i=1;i<=n;i++){if(kernel [i][h]<=0) temp2=1;else {temp2=-1;break;}}}if(temp2==1){cout<<"此线性规划无约束";return ;}if(temp2==-1){c=100000;for(i=1;i<=n;i++){if(kernel [i][h]!=0) b[i]=kernel [i][0]/kernel [i][h]; if(kernel [i][h]==0) b[i]=100000;if(b[i]<0) b[i]=100000;if(b[i]<c){c=b[i];k=i;}}temp3[k]=h;temp4[k]=kernel [0][h];d=kernel [k][h];for(i=0;i<=m+n+n;i++)kernel [k][i]=kernel [k][i]/d;for(i=1;i<=n;i++){ if(i==k)continue;aa=kernel [i][h];for(j=0;j<=m+n+n;j++)kernel [i][j]=kernel [i][j]-aa*kernel [k][j];}}}while(1);return ;}//主函数void main(){ cout<<"-------------------单纯形算法程序----------------------"<<endl<<endl; input();comput();}#include<stdio.h>#include<math.h>#define m 3 /*定义约束条件方程组的个数*/#define n 5 /*定义未知量的个数*/float M=1000000.0;float A[m][n]; /*用于记录方程组的数目和系数;*/float C[n]; /*用于存储目标函数中各个变量的系数*/ float b[m]; /*用于存储常约束条件中的常数*/float CB[m]; /*用于存储基变量的系数*/float seta[m]; /*存放出基与入基的变化情况*/float delta[n]; /*存储检验数矩阵*/float x[n];int num[m]; /*用于存放出基与进基变量的情况*/ float ZB=0; /*记录目标函数值*/void input();void print();int danchunxing1();int danchunxing2(int a);void danchunxing3(int a,int b);int danchunxing1(){int i,k=0;int flag=0;float min=0;for(i=0;i<n;i++)if(delta[i]>=0)flag=1;else {flag=0;break;}if(flag==1)return -1;for(i=0;i<n;i++){if(min>delta[i]){min=delta[i];k=i;}return k;}int danchunxing2(int a){int i,k,j;int flag=0;float min;k=a;for(i=0;i<m;i++)if(A[i][k]<=0)flag=1;else {flag=0;break;}if(flag==1){printf("\n该线性规划无最优解!\n"); return -1;} for(i=0;i<m;i++){if(A[i][k]>0)seta[i]=b[i]/A[i][k];else seta[i]=M;}min=M;for(i=0;i<m;i++){if(min>=seta[i]){min=seta[i];j=i;}}num[j]=k+1;CB[j]=C[k];return j;}void danchunxing3(int p,int q){int i,j,c,l;float temp1,temp2,temp3;c=p;/*行号*/l=q;/*列号*/ temp1=A[c][l];b[c]=b[c]/temp1;for(j=0;j<n;j++)A[c][j]=A[c][j]/temp1;for(i=0;i<m;i++){if(i!=c)if(A[i][l]!=0){temp2=A[i][l];b[i]=b[i]-b[c]*temp2;for(j=0;j<n;j++)A[i][j]=A[i][j]-A[c][j]*temp2;}}temp3=delta[l];for(i=0;i<n;i++)delta[i]=delta[i]-A[c][i]*temp3;}void print(){int i,j=0;printf("\n--------------------------------------------------------------------------\n"); for(i=0;i<m;i++){printf("%8.2f\tX(%d) %8.2f ",CB[i],num[i],b[i]);for(j=0;j<n;j++)printf("%8.2f ",A[i][j]);printf("\n");}printf("\n--------------------------------------------------------------------------\n"); printf("\t\t\t");for(i=0;i<n;i++)printf(" %8.2f",delta[i]);printf("\n--------------------------------------------------------------------------\n"); }void input(){int i,j; /*循环变量*/int k;printf("请输入方程组的系数矩阵A(%d行%d列):\n",m,n);for(i=0;i<m;i++)for(j=0;j<n;j++)scanf("%f",&A[i][j]);printf("\n请输入初始基变量的数字代码num矩阵:\n");for(i=0;i<m;i++)scanf("%d",&num[i]);printf("\n请输入方程组右边的值矩阵b:\n");for(i=0;i<m;i++)scanf("%f",&b[i]);printf("\n请输入目标函数各个变量的系数所构成的系数阵C:\n");for(i=0;i<n;i++)scanf("%f",&C[i]);for(i=0;i<n;i++)delta[i]=C[i];for(i=0;i<m;i++){k=num[i]-1;CB[i]=C[k];}}void main(){int i,j=0;int p,q,temp;input();printf("\n--------------------------------------------------------------------------\n"); printf(" \tCB\tXB\tb\t");for(i=0;i<n;i++)printf(" X(%d)\t",i+1);for(i=0;i<n;i++)x[i]=0;printf("\n");while(1){q=danchunxing1();if(q==-1){print();printf("\n所得解已经是最优解!\n");printf("\n最优解为:\n");for(j=0;j<m;j++){temp=num[j]-1;x[temp]=b[j];}for(i=0;i<n;i++){printf("x%d=%.2f ",i+1,x[i]);ZB=ZB-x[i]*C[i];}printf("ZB=%.2f",ZB);break;}print();p=danchunxing2(q);printf("\np=%d,q=%d",p,q);if(q==-1) break;danchunxing3(p,q);}}。
单纯形法c语言
![单纯形法c语言](https://img.taocdn.com/s3/m/e4e2416cbc64783e0912a21614791711cc7979d4.png)
单纯形法c语言单纯形法(Simplex Algorithm)是一种用于线性规划问题的常用算法。
它的目标是找到线性规划问题的最优解,即满足约束条件下的最大或最小目标函数值。
单纯形法的思想相对简单,但是在实现时需要注意一些细节。
单纯形法的基本原理是通过不断地在可行解空间中移动,逐步逼近最优解。
它通过迭代的方式,每次找到一个更优的可行解,直到找到最优解为止。
这个过程是通过转动问题的一个角点,使其向邻近的角点移动,直到达到最优解。
单纯形法的核心是构造单纯形表(Simplex Tableau)。
单纯形表是一个矩阵,由目标函数和约束条件组成。
表中的每一行代表一个约束条件,而列则代表决策变量。
单纯形表中的元素表示某个变量在约束条件下的系数。
单纯形法的步骤如下:1.将线性规划问题转化为标准形式。
标准形式要求目标函数为最小化形式,约束条件为等式形式,并且决策变量为非负数。
2.构造初始单纯形表。
将约束条件和目标函数转化为单纯形表的形式,并填写初始值。
3.检查单纯形表是否为最优解。
如果表中的目标函数系数均为负数,则可以确定该解为最优解,算法结束。
否则,找到目标函数系数中的最小值所在的列。
4.选择合适的基变量。
在所选列中,找到使约束条件保持满足的最优值所在的行,并将其称为主元行。
将主元行与所选列进行交换,使得目标函数系数中的最小值所在的位置变为主元。
5.进行主元行的消元操作。
通过将主元行除以主元元素,使主元元素变为1,并将其他行的元素都变为0,同时更新单纯形表的其他值。
6.重复第3步到第5步,直到找到最优解或者确定无界问题或者无可行解。
在实现单纯形法的过程中,需要注意以下几点:1.单纯形表的数据结构。
单纯形表可以使用矩阵或数组表示,同时需要记录变量的基变量和非基变量,以及目标函数的最优值。
2.主元行的选取。
可以使用不同的策略选择主元行,例如选取最小比值法或者随机选择法。
3.主元行的消元操作。
消元操作时,需要将主元行的其他元素变为0。
用C语言解决线性规划问题(用单纯形法解)
![用C语言解决线性规划问题(用单纯形法解)](https://img.taocdn.com/s3/m/51cab98a84868762caaed5b3.png)
用C语言解决线性规划问题(用单纯形法解)#include<stdio.h>#include<math.h>#include<iostream.h>#define BORDER -0.00001#define M 100int main(){int k; //初始变量的个数int m; //约束条件的个数;cout<<"输入初始变量的个数"<<endl;cin>>k;cout <<"输入约束条件的个数"<<endl;cin>>m;cout<<"输入约束条件的种类"<<endl;cout<<"0 means <="<<endl;cout<<"1 means >="<<endl;cout<<"2 means ="<<endl;int NGET=0;int NLET=0;int NET =0;int I =0;//人工变量;int *code=new int[m]; //the array of the >= <= =;for(int i=0;i<m;i++){cin>>code[i];if(code[i]==0)NGET++;if(code[i]==1)NLET++;I++ ;if(code[i]==2)NET++;I++ ;}int n; //变量总和;n=k+2*NLET+NGET+NET;float *Index=new float[n+1]; //目标函数的系数;float *c=new float[n+1];int NTYPE;for(i=0;i<n+1;i++)Index[i]=0.0;//为语法要求定初值;cout<<"输入目标函数的系数"<<endl;for(i=0;i<k;i++)cin>>Index[i];for(i=k+NGET+NLET;i<n;i++)//人工变量所在的列;Index[i]=-M; //the initionalization of indexes of manul variable;cout<<"输入所求函数的类型是求最大还是最小"<<endl;cout<<"0 means min"<<endl;cout<<"1 means max"<<endl;cin>>NTYPE;if(NTYPE) //the initionalization of the c[i];{for(i=0;i<n+1;i++)c[i]=-Index[i];//一般情况下只要将目标函数系数的相反数输入;}if(!NTYPE){for(i=0;i<n+1;i++)if(i<k+NGET+NLET)c[i]=Index[i];else c[i]=-Index[i];}delete []Index;float **a=new float*[m+1]; //the array of all the variable to compute;for(i=0;i<m+1;i++)a[i]=new float[n+1];int INDEXG=k;int INDEXL=k+NGET;int INDEXE=k+NGET+NLET;int *ARTV=new int[I]; //保存人工变量;for(i=0;i<m;i++) //the analization of the code[](<= >= = );{if(code[i]==0){a[i][INDEXL]=1.0;INDEXL++;}if(code[i]==1){a[i][INDEXE]=1.0;INDEXE++;a[i][INDEXG]=-1.0;INDEXG++;ARTV[I]=i;I++;}if(code[i]==2){a[i][INDEXE]=1.0;INDEXE++;ARTV[I]=i;I++;}}if( (INDEXG!=k+NLET) || (INDEXL!=k+NGET+NLET) || (INDEXE!=n) )//excption {return -1;}cout<<"输入约束表达式左边的系数"<<endl;for(i=0;i<m;i++)for(int j=0;j<k;j++)cin>>a[i][j];float *b=new float[m];cout<<"输入约束表达式右边的值" <<endl;for(i=0;i<m;i++)cin>>b[i];for(i=0;i<m;i++)a[i][n]=b[i];float *temp=new float[n+1];if(I){for(i=0;i<I;i++)for(int j=0;j<n+1;j++){temp[j]=-a[ARTV[i]][j];c[j]+=M*temp[j];}}for(i=0;i<n+1;i++)a[m][i]=c[i];for(i=0;i<m+1;i++){for(int j=0;j<n+1;j++)cout<<a[i][j]<<" ";cout<<endl;}int flag=0;float temp1;float temp2;int K,J;int index;for(i=0;i<n;i++)if(a[m][i]<0)flag=1; //检验系数;while(flag) //Using a[][] to compute the result; {temp1=0;for(i=0;i<n;i++){if(temp1>a[m][i]){temp1=a[m][i];K=i;}}temp2=M;for(i=0;i<m;i++){if(a[i][K]>0&&(a[i][n]/a[i][K])<temp2){temp2=a[i][n]/a[i][K];J=i;}}if(temp2==M){cout<<"无解!"<<endl;return -1;}float temp3=a[J][K];for(i=0;i<n+1;i++){a[J][i]=a[J][i]/temp3;}for(i=0;i<m+1;i++){if(i!=J){float temp4=a[i][K];for(int j=0;j<n+1;j++){a[i][j]=a[i][j]- a[J][j]*temp4;}}cout<<endl;}flag=0;for(i=0;i<n+1;i++){if(a[m][i]<BORDER)flag=1;}cout<<"**************************************"<<endl;for(i=0;i<m+1;i++){for(int j=0;j<n+1;j++)cout<<a[i][j]<<" ";cout<<endl;}cout<<"***************************************"<<endl;getchar();}if(NTYPE)cout<<"The answer is :"<<a[m][n];if(!NTYPE)cout<<"The answer is :"<<-a[m][n];getchar();return 0;}。
单纯形法求解线性规划的步骤
![单纯形法求解线性规划的步骤](https://img.taocdn.com/s3/m/eba1ca2a1a37f111f0855b64.png)
单纯形法求解线性规划的步骤1>初始化将给定的线性规划问题化成标准形式,并建立一个初始表格,它最右边的单元格都是非负的(否则无解),接下来的m列组成一个m*m的单元矩阵(目标行的单元格则不必满足这一条件),这m列确定了初始的基本可行解的基本变量,而表格中行用基本变量来表示2>最优化测试如果目标行的所有单元格都是非负的(除了最右列中代表目标函数值的那个单元格),就可以停止了,该表格代表了一个最优解,它的基本变量的值在最右列中,而剩下的非基本变量都为03>确定输入变量从目标行的前n个单元格中选择一个负的单元格(选择绝对值最大的那个)该单元格所在的列确定的输入变量及主元列4>确定分离变量对于主元列的每个正单元格,求出θ比率(如果主元格的单元格为负或为0,说明该问题是无解的,算法终止),找出θ比率最小的列,改行确定了分离变量和主元行5>建立下一张表格将主元行的所有单元格除以主元得到新的主元行,包括主元行在内的每一行,要减去改行主元列单元格和新主元行的成绩(除主元行为1外,这一步将主元列的所有单元格变成0).把主元列的变量名进行代换,得到新的单纯形表,返回第一步为求简单在本程序中,需要自己建立标准矩阵(比如加入松弛变量等工作需要用户自己完成),程序的输入有两种方式:1:指定行和列,由用户自行输入每一个元素SimpleMatrix(introw=0,int col=0);2:直接在主程序中初始化一个二维数组,然后利用构造函数SimpleMatrix(introw,int col,double **M) 来初始化和处理(本程序所用的实例用的是这种方法)程序中主要的函数以及说明~SimpleMatrix();销毁动态分配的数组.用于很难预先估计矩阵的行和列,所以在程序中才了动态的内存分配.需要重载析构函数bool Is_objectLine_All_Positive();其中row2为主元所在的行,col为主元所在的列,row1为要处理的行void PrintAnswer();数不合法"<<endl;}SimpleMatrix::SimpleMatrix(int row,int col){init(row,col);for(int i=0;i<rowLen;i++)cout<<"请输入矩阵中第"<<i+1<<"行的系数"<<endl; for(int j=0;j<colLen;j++)cin>>data[i][j];}?}SimpleMatrix::SimpleMatrix(int row,int col,double **M) {rowLen=row;colLen=col;init(row,col);for (int i=0;i<row;i++)for(int j=0;j<col;j++){data[i][j]=*((double*)M+col*i+j); ;}}SimpleMatrix::~SimpleMatrix(){if(colLen*rowLen != 0 ){for(int i=rowLen-1;i>=0;i--){if (data[i]!=NULL)delete[] data[i];}if (data!=NULL)delete[] data;}?}bool SimpleMatrix::Is_objectLine_All_Positive(){for(int i=0;i<colLen-1;i++)if(data[rowLen-1][i]<0)return false;return true;}bool SimpleMatrix::Is_MainCol_All_Negative(int col) {for(int i=0;i<rowLen;i++)if(data[i][col]>0)return false;return true;}bool SimpleMatrix::Is_column_all_Positive(int col){for(int i=0;i<rowLen-1;i++){return false;}return true;}int SimpleMatrix::InColumn(){int count=0;for(int i=0;i<colLen-1;i++){int temp=GetItem(rowLen-1,i);if(temp>=0){count++;}elsebreak;}double maxItem=fabs(GetItem(rowLen-1,count));int index_col;for(i=0;i<colLen-1;i++){double temp=GetItem(rowLen-1,i);if(temp<0){if(maxItem<=fabs(temp)){maxItem=fabs(temp);index_col=i;}}}return index_col;}int SimpleMatrix::DepartRow(int col){int index_row;int count=0;for(int i=0;i<rowLen;i++){if(data[i][col]<0)count++;elsebreak;}double minItem=data[count][colLen-1]/data[count][col]; index_row=count;double temp;for(i=0;i<rowLen-1;i++)temp=data[i][col];if(temp>0){temp=data[i][colLen-1]/temp;if(temp<minItem){minItem=temp;index_row=i;}}}return index_row;}void SimpleMatrix::MainItem_To_1(int row,int col){double temp=GetItem(row,col);pp#include <iostream>#include ""using namespace std;int main(){double M[4][7]={{5,3,1,1,0,0,9},{-5,6,15,0,1,0,15},{2,-1,1,0,0,-1,5},{-10,-15,-12,0,0,0,}}; SimpleMatrix Matrix(4,7,(double **)M);if(5))//判断是否存在最优解{bool p=();//判断主元列是否全部为正,确定是否已经取得最优解while(!p){int col=();//确定主元所在的行if(col))//确定线性规划的解是否为无解的{cout<<"线性规划问题是无界的,没有最优解"<<endl;exit(EXIT_FAILURE);}else{int mainRow=(col);//确定主元所在的行(mainRow,col);//将主元所在的行做变换,使主元变成1int i=0;while(i<()){if(i!=mainRow){(i,mainRow,col);//处理矩阵中其他的行,使主元列的元素为0i++;}elsei++;}}}for(int i=0;i<();i++)//输出变换以后的矩阵,判断是否正确处理{for (int j=0;j<();j++){cout<<(i,j)<<" ";}cout<<endl;}p=();}();}elsecout<<"线性规划无解"<<endl;return0;}。
c语言实现二阶段单纯形法
![c语言实现二阶段单纯形法](https://img.taocdn.com/s3/m/ade5f86ebc64783e0912a21614791711cc7979de.png)
c语言实现二阶段单纯形法二阶段单纯形法(Two-Phase Simplex Method)是线性规划的一种求解方法。
它主要分为两个阶段:第一阶段是寻找一个初始解,第二阶段是使用单纯形法进行迭代优化。
以下是一个简单的C语言实现二阶段单纯形法的示例代码:```c#include <stdio.h>#include <stdlib.h>#include <math.h>#define MAX_ITER 1000#define EPSILON 1e-6int main() {int n, m;double a[100][100], b[100], x[100], z, min_x;int phase = 1;int i, j, k;// 输入数据printf("Enter the number of variables (n) and constraints (m): ");scanf("%d %d", &n, &m);printf("Enter the constraint matrix A and the right-hand side vector b:\n");for (i = 0; i < m; i++) {for (j = 0; j < n; j++) {scanf("%lf", &a[i][j]);}scanf("%lf", &b[i]);}printf("Enter the objective function coefficients:\n"); for (j = 0; j < n; j++) {scanf("%lf", &x[j]);}printf("Enter the objective function constant: ");scanf("%lf", &z);// 第一阶段:寻找初始解for (i = 0; i < n; i++) {if (x[i] < 0) { // 如果目标函数的系数小于0,则该变量为基变量min_x = -x[i]; // 计算最小绝对值for (j = 0; j < m; j++) { // 在约束条件中寻找该变量的系数最小值对应的变量if (a[j][i] > EPSILON) { // 如果该变量的系数大于一个很小的值,则该变量为基变量if (fabs(a[j][i]) < min_x) { // 计算最小绝对值min_x = fabs(a[j][i]); // 更新最小绝对值}}}x[i] = -min_x; // 将该变量的值设置为最小绝对值乘以一个很小的正数(使得该变量成为基变量)} else { // 如果目标函数的系数大于等于0,则该变量为非基变量,取值为0x[i] = 0;}}for (i = 0; i < m; i++) { // 判断约束是否满足(无可行解) if (b[i] < z * x[0] + z * x[1] + ... + z * x[n - 1]) { // 如果约束不满足,则无可行解,结束程序printf("No feasible solution.\n");return 0;}}printf("Initial solution: ");for (i = 0; i < n; i++) { // 输出初始解printf("%.2f ", x[i]);}printf("\n");// 第二阶段:使用单纯形法进行迭代优化for (k = 0; k < MAX_ITER; k++) { // 最大迭代次数为1000次,可以根据实际情况进行调整int pivot_index = -1; // 记录pivot变量的下标,初始化为-1表示未找到pivot变量double max_ratio = -1; // 记录最大比值,初始化为-1表示未找到pivot变量对应的比值最大值for (i = 0; i < n; i++) { // 在非基变量中寻找pivot 变量和对应的最大比值if (x[i] > EPSILON) { // 如果该变量的值大于一个很小的正数,则该变量为非基变量,可以作为pivot变量候选者之一 double ratio = b[i] / a[i][n]; // 计算比值(目标函数值/约束条件值)和最大比值比较大小,更新最大比值和对应的pivot变量下标和目标函数值if (ratio > max_ratio) { // 如果当前比值大于最大比值,则更新最大比值和。
c++实现单纯形法现行规划问题的求解
![c++实现单纯形法现行规划问题的求解](https://img.taocdn.com/s3/m/1d36b045c950ad02de80d4d8d15abe23482f03f7.png)
c++实现单纯形法现⾏规划问题的求解在本程序中默认该现⾏规划问题有最优解针对此问题:1 #include<iostream>2using namespace std;34int check(float *sigema, int m) {5for (int i = 1; i <= m ; i++) {6if (sigema[i] > 0) {7return0;8 }9 }10return1;11 }1213//此程序已经化为标准型的线性规划问题中,且默认有最优解14int main(int argc, char* argv[])15 {16//数据输⼊部分17int m, n;18 cout << "请输⼊变量个数:";19 cin >> m;20 cout << "请输⼊不等式个数:";21 cin >> n;22float **matrix = new float*[n + 1]; //系数矩阵23for (int i = 1; i <= n; i++) {24 matrix[i] = new float[m + 2];25 }26float *cj = new float[m + 1];27float *cB = new float[n + 1]; //基变量系数28int *XB = new int[n + 1]; //⽤来标注基变量x的下标29float *b = new float[n + 1];30float *sigema = new float[n + 1];31float *sita = new float[n + 1];32//初始化33for (int i = 0; i <= m; i++) {34 cj[i] = 0;35 }36for (int i = 0; i <= n; i++) {37 cB[i] = 0;38 XB[i] = 0;39 b[i] = 0;40 sigema[i] = 0;41 sita[i] = 0;42 }43 cout << "请输⼊⽬标函数系数(⽤空格间开):" << endl;44for (int i = 1; i <= m; i++) {45 cin >> cj[i];46 }47 cout << "请输⼊各不等式的系数和常量(⽤空格间开):" << endl;48for (int i = 1; i <= n; i++) {49 cout << "不等式" << i << ": ";50for (int j = 1; j <= m + 1; j++) {51 cin >> matrix[i][j];52 }53 }54 cout << "请输⼊⽬标函数中基变量下标:" << endl;55for (int i = 1; i <= n; i++) {56 cin >> XB[i];57 cB[i] = cj[XB[i]];58//常量59 b[i] = matrix[i][m + 1];60 }6162//计算检验数63for (int i = 1; i <= m; i++) {64 sigema[i] = cj[i];65for (int j = 1; j <= n; j++) {66 sigema[i] -= cB[j] * matrix[j][i];67 }68 }6970while (check(sigema, m) == 0) {71//寻找⼊基变量72float maxn = sigema[1];73int sigema_xindex = 0;74float sigema_xcoefficient = 0;75for (int i = 1; i <= m; i++) {76if (maxn <= sigema[i]) {77 maxn = sigema[i];78 sigema_xindex = i;79 sigema_xcoefficient = cj[i];80 }81 }82//计算sita83for (int i = 1; i <= n; i++) {84if (matrix[i][sigema_xindex] > 0) {85 sita[i] = b[i] / matrix[i][sigema_xindex];86 }87else {88 sita[i] = 9999; //表⽰sita值为负数89 }90 }91//寻找出基变量92float minn = sita[1];93int sita_xindex = 0;94for (int i = 1; i <= n; i++) {95if (minn >= sita[i] && sita[i] > 0) {96 minn = sita[i];97 sita_xindex = i;98 }99 }100//⼊基出基变换,先⼊基再出基101//⼊基操作102for (int i = 1; i <= n; i++) {103if (i == sita_xindex) {104 XB[i] = sigema_xindex;105 cB[i] = sigema_xcoefficient;106break;107 }108 }109//出基计算110//化1111//cout << endl << "此处为化1的结果------" << endl;112float mul1 = matrix[sita_xindex][sigema_xindex];113for (int i = 1; i <= m; i++) {114 matrix[sita_xindex][i] /= mul1;115 }116 b[sita_xindex] /= mul1;117//化0118//cout << endl << "此处为化0的结果------" << endl;119for (int i = 1; i <= n; i++) {120if (i == sita_xindex) {121continue;122 }123float mul2 = matrix[i][sigema_xindex] / matrix[sita_xindex][sigema_xindex]; 124for (int j = 1; j <= m; j++) {125 matrix[i][j] -= (matrix[sita_xindex][j] * mul2);126 }127 b[i] -= (b[sita_xindex] * mul2);128 }129for (int i = 1; i <= n; i++) {130if (i == sita_xindex) {131continue;132 }133 }134for (int i = 1; i <= m; i++) {135 sigema[i] = cj[i];136for (int j = 1; j <= n; j++) {137 sigema[i] -= cB[j] * matrix[j][i];138 }139 }140 }141float MaxZ = 0;142float *result = new float[m + 1];143for (int i = 0; i <= m; i++) {144 result[i] = 0;145 }146for (int i = 1; i <= n; i++) {147 result[XB[i]] = b[i];148 }149 cout << "最优解为:X = (";150for (int i = 1; i < m; i++) {151 cout << result[i] << ",";152 }153 cout << result[m] << ")" << endl;154for (int i = 1; i <= m; i++) {155 MaxZ += result[i] * cj[i];156 }157 cout << "最优值为:MzxZ = " << MaxZ; 158return0;159 }程序运⾏结果:。
C语言求线性规划
![C语言求线性规划](https://img.taocdn.com/s3/m/abb878e00975f46527d3e13c.png)
单纯形法解线性规划,注释很清楚了:#include<stdio.h>#include<math.h>#include<iostream.h>float matrix[100][100],x[100]; /* 记录总方程的数组,解的数组 */int a[100]; /* 记录基础,非基础的解的情况,0:非基础,1:基础 */int m,n,s,type; /* 方程变量,约束数,求最大最小值的类型,0:最小 1:最大 */ int indexe,indexl,indexg; /* 剩余变量,松弛变量,人工变量 */void Jckxj(){int i,j;for(i=0;i<n;i++)for(j=0;j<s;j++)if(matrix[i][j]==1&&a[j]==1){x[j]=matrix[i][s];j=s;}for(i=0;i<s;i++)if(a[i]==0) x[i]=0;}int Rj(){int i;for(i=0;i<s;i++)if(fabs(matrix[n][i])>=0.000001)if(matrix[n][i]<0) return 0;return 1;}int Min(){int i,temp=0;float min=matrix[n][0];for(i=1;i<s;i++)if(min>matrix[n][i]){min=matrix[n][i];temp=i;}return temp;}void JustArtificial(){int i;for(i=m+indexe+indexl;i<s;i++)if(fabs(x[i])>=0.000001){printf("No Answer\n");return;}}int Check(int in){int i;float max1=-1;for(i=0;i<n;i++)if(fabs(matrix[i][in])>=0.000001&&max1<matrix[i][s]/matrix[i][in]) max1=matrix[i][s]/matrix[i][in];if(max1<0)return 1;return 0;}int SearchOut(int *temp,int in){int i;float min=10000;for(i=0;i<n;i++)if(fabs(matrix[i][in])>=0.000001&&(matrix[i][s]/matrix[i][in]>=0)&&mi n>matrix[i][s]/matrix[i][in]){min=matrix[i][s]/matrix[i][in];*temp=i;}for(i=0;i<s;i++)if(a[i]==1&&matrix[*temp][i]==1) return i;}void Mto(int in,int temp){int i;for(i=0;i<=s;i++)if(i!=in)matrix[temp][i]=matrix[temp][i]/matrix[temp][in]; matrix[temp][in]=1;}void Be(int temp,int in){int i,j;float c;for(i=0;i<=n;i++){c=matrix[i][in]/matrix[temp][in];if(i!=temp)for(j=0;j<=s;j++)matrix[i][j]=matrix[i][j]-matrix[temp][j]*c;}}void Achange(int in,int out){int temp=a[in];a[in]=a[out];a[out]=temp;}void Print(){int i,j,k,temp=0;for(i=0;i<n;i++){for(k=temp;k<s;k++)if(a[k]==1){printf("X%d ",k);temp=k+1;k=s;}for(j=0;j<=s;j++)printf("%8.2f",matrix[i][j]);printf("\n");}printf("Rj ");for(j=0;j<=s;j++)printf("%8.2f",matrix[n][j]);printf("\n");}void InitPrint(){int i;printf("X");for(i=0;i<s;i++)printf(" a%d",i);printf(" b\n");Print();printf("\n");}void Result(){int i;printf(" (");for(i=0;i<s;i++)printf("%8.2f",x[i]);printf(" ) ");if(type==1)printf(" Zmax=%f\n\n",matrix[n][s]);else printf(" Zmin=%f\n\n",matrix[n][s]);}void PrintResult(){if(type==0) printf("The Minimal :%f\n",-matrix[n][s]);else printf("The Maximum :%f\n",matrix[n][s]);}void Merge(float nget[][100],float nlet[][100],float net[][100],float b[]){int i,j;for(i=0;i<n;i++){for(j=m;j<m+indexe;j++)if(nget[i][j-m]!=-1) matrix[i][j]=0;else matrix[i][j]=-1;for(j=m+indexe;j<m+indexe+indexl;j++)if(nlet[i][j-m-indexe]!=1) matrix[i][j]=0;else matrix[i][j]=1;for(j=m+indexe+indexl;j<s;j++)if(net[i][j-m-indexe-indexl]!=1) matrix[i][j]=0;else matrix[i][j]=1;matrix[i][s]=b[i];}for(i=m;i<m+indexe+indexl;i++)matrix[n][i]=0;for(i=m+indexe+indexl;i<s;i++)matrix[n][i]=100;matrix[n][s]=0;}void ProcessA(){int i;for(i=0;i<m+indexe;i++)a[i]=0;for(i=m+indexe;i<s;i++)a[i]=1;}void Input(float b[],int code[]){int i=0,j=0;printf("The equator Variable and Restrictor\n"); /* 输入方程变量和约束数 */cin>>m>>n;for(i=0;i<n;i++){printf("Input b[] and Restrictor code 0:<= 1:= 2:>=\n"); /* 输入方程右边的值,code的值 */cin>>b[i]>>code[i];printf("The XiShu\n");for(j=0;j<m;j++)cin>>matrix[i][j]; /* 输入方程 */}printf("The Type 0:Min 1:Max \n"); /* 输入求最大值还是最小值 */do{cin>>type;if(type!=0&&type!=1) printf("Error,ReInput\n");}while(type!=0&&type!=1);printf("The Z\n"); /* 输入z */for(i=0;i<m;i++)cin>>matrix[n][i];if(type==1)for(i=0;i<m;i++)matrix[n][i]=-matrix[n][i];}void Xartificial(){int i,j,k;if(indexg!=0){for(i=m+indexe+indexl;i<s;i++){for(j=0;j<n;j++)if(matrix[j][i]==1){for(k=0;k<=s;k++)matrix[n][k]=matrix[n][k]-matrix[j][k]*100;j=n;}}}}void Process(float c[][100],int row,int vol){int i;for(i=0;i<n;i++)if(i!=row) c[i][vol]=0;}void Sstart(float b[],int code[]){int i;float nget[100][100],nlet[100][100],net[100][100]; /* 剩余变量数组,松弛变量数组,人工变量数组 */indexe=indexl=indexg=0;for(i=0;i<n;i++){if(code[i]==0){nlet[i][indexl++]=1; Process(nlet,i,indexl-1);}if(code[i]==1){ net[i][indexg++]=1; Process(net,i,indexg-1); }if(code[i]==2){net[i][indexg++]=1;nget[i][indexe++]=-1;Process(net,i,indexg-1); Process(nget,i,indexe-1);}}s=indexe+indexl+indexg+m;Merge(nget,nlet,net,b); /* 合并 */ProcessA(); /* 初始化a[] */InitPrint(); /* 初始化打印 */Xartificial(); /* 消去人工变量 */}void Simplix() /* 单纯型算法 */{int in,out,temp=0;while(1){Jckxj(); /* 基础可行解 */Print(); /* 打印 */Result(); /* 打印结果 */if(!Rj()) in=Min(); /* 求换入基 */else {if(indexg!=0) JustArtificial(); /* 判断人工变量 */ PrintResult(); /* 打印最后结果 */return;}if(Check(in)){ /* 判断无界情况 */printf("No Delimition\n");return;}out=SearchOut(&temp,in); /* 求换出基 */Mto(in,temp); /* 主元化1 */Be(temp,in); /* 初等变换 */Achange(in,out); /* 改变a[]的值 */}}void main(){int code[100]; /* 输入符号标记 */float b[100]; /* 方程右值 */Input(b,code); /* 初始化 */Sstart(b,code); /* 化标准型 */Simplix(); /* 单纯型算法 */}。
单纯型法程序计算
![单纯型法程序计算](https://img.taocdn.com/s3/m/797ddd196bd97f192279e972.png)
1
单纯形法程序(C 语言)
3) 程序源代码: #include<stdio.h> #define M 10000000 #define N 10000000 #define P 102 #define Q 401 float xs[P][Q]; int m=0,n=0,s=0; void main() { int shuru(); int jisuan(); int a=P,b=Q; printf("******************单纯形法计算程序***************\n"); printf("\n"); printf("本程序可以解决%d 个决策变量,%d 个约束条件的线性规划问题,但所有决策变 量必须是非负的\n",b-1-2*(a-2),a-2); printf("\n"); shuru(); jisuan(); printf("*************计算结束**************\n"); printf("**********程序编写者信息**********\n"); printf("***********06 级农水 1 班************\n"); printf("**************曾文治**************\n"); printf("***********200631580005************\n"); } void shuru() { int i,j; printf("**************请输入有关参数****************** \n\n"); printf("请按提示输入相关参数,多个参数之间请用 TAB 键隔开\n\n"); do { printf("请输入决策变量数 m="); scanf("%d",&m); if(m>(Q-2*(P-2)-1)) printf("您输入的决策变量数目超限,请重新输入\n"); else break; } while(1); do { printf("请输入约束不等式个数 n="); scanf("%d",&n);
C 单纯形法
![C 单纯形法](https://img.taocdn.com/s3/m/63d9a03083c4bb4cf7ecd17e.png)
//在Visual C++控制台程序中编译执行#include<iostream.h>#include<math.h>#define M 10000//全局变量float kernel[11][31];//核心矩阵表int m=0,n=0,t=0;//m:结构向量的个数//n:约束不等式个数//t:目标函数类型:-1代表求求最小值,1代表求最大值//输入接口函数void input(){//读入所求问题的基本条件cout<<"----------参数输入-----------"<<endl; cout<<"请按提示输入下列参数:"<<endl<<endl;cout<<" 结构向量数m: "<<" m= ";cin>>m;cout<<endl<<" 约束不等式数n:"<<" n= ";cin>>n;int i,j;//初始化核心向量for (i=0;i<=n+1;i++)for (j=0;j<=m+n+n;j++)kernel [i][j]=0;//读入约束条件cout<<endl<<" 约束方程矩阵的系数及不等式方向(1代表<=,-1代表>=):"<<endl<<endl<<" ";for (i=1;i<=m;i++)cout<<" x"<<i;cout<<" 不等式方向 "<<" 常数项"<<endl;for (i=1;i<=n;i++){cout<<" 不等式"<<i<<" ";for (j=1;j<=m+2;j++)cin>>kernel [i][j];}for (i=1;i<=n;i++){kernel [i][0]=kernel [i][m+2];kernel [i][m+2]=0;}//读入目标条件cout<<endl<<endl<<" 目标函数的系数及类型(求最小值:1;求最大值:-1):"<<endl<<endl<<" ";for(i=1;i<=m;i++)cout<<"x"<<i<<" ";cout<<"类型"<<endl<<" ";cout<<" 目标函数: ";for (i=1;i<=m;i++)cin>>kernel [0][i];cin>>t;//矩阵调整if(t==-1)for(i=1;i<=m;i++)kernel [0][i]=(-1)*kernel [0][i]; for(i=1;i<=n;i++){kernel [i][m+i]=kernel [i][m+1];if(i!=1)kernel [i][m+1]=0;}}//算法函数void comput(){int i,j,flag,temp1,temp2,h,k=0,temp3[10];float a,b[11],temp,temp4[11],temp5[11],f=0,aa,d,c; //初始化for(i=1;i<=n;i++)temp3[i]=0;for(i=0;i<11;i++){ temp4[i]=0;temp5[i]=0;}for(i=1;i<=n;i++){if(kernel [i][m+i]==-1){kernel [i][m+n+i]=1;kernel [0][m+n+i]=M;temp3[i]=m+n+i;}elsetemp3[i]=m+i;}for(i=1;i<=n;i++)temp4[i]=kernel [0][temp3[i]];//循环求解do{for(i=1;i<=m+n+n;i++){a=0;for(j=1;j<=n;j++)a+=kernel [j][i]*temp4[j];kernel [n+1][i]=kernel [0][i]-a; }for(i=1;i<=m+n+n;i++){if(kernel [n+1][i]>=0) flag=1; else{flag=-1;break;}}if(flag==1){ for(i=1;i<=n;i++){if(temp3[i]<=m+n) temp1=1;else{temp1=-1;break;}}//输出结果cout<<endl<<endl;cout<<"----------结果输出-----------"<<endl<<endl;if(temp1==1){cout<<" 此线性规划的最优解存在!"<<endl<<endl<<" 最优解为:"<<endl<<endl<<" ";for(i=1;i<=n;i++)temp5[temp3[i]]=kernel [i][0];for(i=1;i<=m;i++)f+=t*kernel [0][i]*temp5[i];for(i=1;i<=m;i++){cout<<"x"<<i<<" = "<<temp5[i];if(i!=m)cout<<", ";}cout<<" ;"<<endl<<endl<<" 最优目标函数值f= "<<f<<endl<<endl; return ;}else{cout<<" 此线性规划无解"<<endl<<endl;return ;}}if(flag==-1){temp=100000;for(i=1;i<=m+n+n;i++)if(kernel [n+1][i]<temp){temp=kernel [n+1][i];h=i;}for(i=1;i<=n;i++){if(kernel [i][h]<=0) temp2=1;else {temp2=-1;break;}}}if(temp2==1){cout<<"此线性规划无约束";return ;}if(temp2==-1){c=100000;for(i=1;i<=n;i++){if(kernel [i][h]!=0) b[i]=kernel [i][0]/kernel [i][h]; if(kernel [i][h]==0) b[i]=100000;if(b[i]<0) b[i]=100000;if(b[i]<c){c=b[i];k=i;}}temp3[k]=h;temp4[k]=kernel [0][h];d=kernel [k][h];for(i=0;i<=m+n+n;i++)kernel [k][i]=kernel [k][i]/d;for(i=1;i<=n;i++){ if(i==k)continue;aa=kernel [i][h];for(j=0;j<=m+n+n;j++)kernel [i][j]=kernel [i][j]-aa*kernel [k][j]; }}}while(1);return ;}//主函数void main(){ cout<<"-------------------单纯形算法程序----------------------"<<endl<<endl; input();comput();}。
C++实现单纯形法
![C++实现单纯形法](https://img.taocdn.com/s3/m/c7d56dd0195f312b3169a5d5.png)
实验目的:用软件实现单纯形法。
1.过程简述:VC 软件对给出的例题用单纯形法进行求解。
例题:线性规划问题目标函数 Max 2132x x z +=满足的约束条件 0,12416482212121≥≤≤≤+x x x x x x求解上述线性规划。
2.问题解答:首先将上述线性问题标准化得到目标函数 Max 2132x x z +=满足的约束条件 0,,,,12416482543215241321≥=+=+=++x x x x x x x x x x x xC++程序如下:#include<iostream>using namespace std;void main(){ float e[4][6]={ 0,2,3,0,0,0,8,1,2,1,0,0,16,4,0,0,1,0,12,0,4,0,0,1},f[4],v,t,u,h[4]; int i,j,r=0,n=0,m=0,N=0,b,c[4],d[4],a,g,w=0,x=0,y=0,z=0;do{for(j=1;j<6;j++){r=x=y=z=n=m=0;for(i=1;i<4;i++){if(e[i][j]==1){n=n+1;b=i;}else if(e[i][j]==0)m=m+1;}if(n==1&&m==2){ N=N+1;c[N]=b;d[N]=j;}}u=e[0][1];for(j=1;j<6;j++){if(e[0][j]>=u){u=e[0][j];a=j;}}for (i=1;i<4;i++){if(e[i][a]>0)f[i]=e[i][0]/e[i][a];else f[i]=100;}for (i=1;i<4;i++){if(f[i]<=f[1]){f[1]=f[i];g=i;}}for(N=1;N<4;N++){if(c[N]==g)d[N]=a;}t=e[g][a];for(j=0;j<6;j++){e[g][j]=e[g][j]/t;}for(i=0;i<4;i++){if(i==g)e[i][a]=e[i][a];else{h[i]=e[i][a];}}for(j=0;j<6;j++){for(i=0;i<4;i++){if(i!=g)e[i][j]=e[i][j]-e[g][j]*h[i];}}for(i=1;i<6;i++){if(i!=d[1]&&i!=d[2]&&i!=d[3]&&e[0][i]<=0){if(e[0][i]==0)x=x+1;else y=y+1;}}if(x!=0){r=r+1;cout<<"无穷多最优解。
单纯形法c语言
![单纯形法c语言](https://img.taocdn.com/s3/m/dc65f136f111f18583d05adb.png)
#include<stdio.h>#include<stdlib.h>#define N 100#define M 10000float array[N][N];float b[N];float c[N];float rj[N];float b_x[N];int xb[N];int in_basic,out_basic;int row,line;int flag=0;FILE *in;void print(FILE *write,float arra[][N],int x_b[N],int ro,int lin,int in,int out) {int i,j;fprintf(write," ");for(i=0;i<lin-1;i++)fprintf(write,"x%d ",i+1);fprintf(write,"b\n\n");for(i=0;i<ro;i++){if(i<ro-1)fprintf(write,"x%d ",x_b[i]);elsefprintf(write,"rj ");for(j=0;j<lin;j++)if(i==out&&j==in)fprintf(write,"%6.2f*",arra[i][j]);elsefprintf(write,"%7.2f",arra[i][j]);fprintf(write,"\n");}for(i=0;i<80;i++)fprintf(write,"-");fprintf(write,"\n");}void array_conv(float arra[][N],int ro,int lin,int in,int out){int i,j;float temp;temp=arra[out][in];for(i=0;i<lin;i++)arra[out][i]/=temp;for(i=0;i<ro;i++){if(i!=out){temp=arra[i][in];for(j=0;j<lin;j++)arra[i][j]-=temp*arra[out][j];}}}int b_to_x(float arra[][N],float *bx,int *xB,int ro,int lin,int in) {int i,j,k=0;float min;for(i=0;i<ro-1;i++)if(arra[i][in]>-1e-5){bx[i]=arra[i][lin-1]/arra[i][in];k=1;}elsebx[i]=M;if(k==0) return M;min=bx[0];j=0;for(i=1;i<ro-1;i++){if(bx[i]<min){min=bx[i];j=i;}else if((bx[i]-min)>-1e-5&&(bx[i]-min)<1e-5){if(xB[i]>xB[j])j=i;}}return j;}int c_in(float arra[][N],int ro,int lin){int i,j;float min;min=arra[ro-1][0];j=0;for(i=1;i<lin-1;i++)if(arra[ro-1][i]<min){min=arra[ro-1][i];j=i;}if(min>-1e-5)return M;elsereturn j;}void smj(){int i,j;float xx[N];for(i=0;i<row;i++)array[i][line]=b[i];for(i=0;i<line;i++)array[row][i]=c[i];array[row][line]=0;for(i=0;i<row;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){for(i=0;i<line;i++)if(array[row][i]>1e-5)j++;if(j<line-row)fprintf(in,"\nLP问题有无穷最优解,其中之一如下:\n");fprintf(in,"\nf*=%f\n",-array[row][line]);fprintf(in,"x*=(");for(i=0;i<line;i++)xx[i]=0;for(i=0;i<row;i++)xx[xb[i]-1]=array[i][line];for(i=0;i<line;i++)fprintf(in,"%6.2f",xx[i]);fprintf(in," )T\n");}}void conv(){int i,j;float xx[N];float temp[N];for(i=0;i<line;i++)array[row][i]=c[i];for(i=0;i<row;i++)array[i][line]=array[i][line+row+flag];array[row][line]=0;for(i=0;i<row;i++)temp[i]=array[row][xb[i]-1];for(i=0;i<line+1;i++)for(j=0;j<row;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<line;i++)if(array[row][i]>1e-5)j++;if(j<line-row)fprintf(in,"\nLP问题有无穷最优解,其中之一如下:\n");fprintf(in,"\nf*=%f\n",-array[row][line]);fprintf(in,"x*=( ");for(i=0;i<line;i++)xx[i]=0;for(i=0;i<row;i++)xx[xb[i]-1]=array[i][line];for(i=0;i<line;i++)fprintf(in,"%6.2f",xx[i]);fprintf(in," )T\n");}}void conve(){int i,j=0,k;while(j!=1){j=0;k=0;for(i=0;i<row;i++)if(xb[i]>line){j++;k=i;}if(j!=0){out_basic=k;for(i=0;i<row;i++){for(k=0;k<row;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();}void linezecon(int zl){int i,j,k,li;li=row;k=zl;while(k!=N+1){for(i=k;i<li-1;i++)xb[i]=xb[i+1];for(i=0;i<line+row+1;i++)for(j=k;j<li-1;j++)array[j][i]=array[j+1][i];li--;k=N+1;for(i=0;i<li;i++)if(xb[i]>line){k=i;break;}j=0;if(k!=N+1){for(i=0;i<line;i++)if(array[k][i]>1e-5||array[k][i]<-1e5)break;if(i<line){k=N+1;j=1;}}}for(i=0;i<line+row+1;i++)array[li][i]=array[row][i];flag=row-li;row=li;if(j==0)conv();elseconve();}void _smj(){int i,j,k;float temp;fprintf(in,"\n建立辅助LP min w=");for(i=0;i<row-1;i++)fprintf(in,"x%d+",line+1+i);fprintf(in,"x%d\n\n",line+row);for(i=0;i<row;i++)for(j=line;j<line+row;j++)if(i==j-line)array[i][j]=1;elsearray[i][j]=0;for(i=0;i<row;i++)array[i][line+row]=b[i];for(i=0;i<row;i++)c[i+line]=0;for(i=0;i<line+row+1;i++)array[row][i]=0;for(i=0;i<line;i++){temp=0;for(k=0;k<row;k++)temp+=array[k][i];array[row][i]=-temp;}temp=0;for(i=0;i<row;i++)temp+=array[i][line+row];array[row][line+row]=-temp;for(i=0;i<row;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问题进入第二阶段。
优化设计--线性规划单纯形法
![优化设计--线性规划单纯形法](https://img.taocdn.com/s3/m/559f4b4833687e21af45a9e5.png)
printf("x1=%f x2=%f x3=%f x4=%f x5=%f \n",x[0],x[1],x[2],x[3],x[4]);
printf("w(x)=%f\n",w(0,0,0,0,0));
}
printf("最优解:x*=x=(%f,%f,%f,%f,%f) \n",x[0],x[1],x[2],x[3],x[4]);
float a[3][5]={{9,4,1,0,0},{3,10,0,1,0},{4,5,0,0,1}};
float b[3]={360,300,200};
float cl,al[3],x[5]={0,0,0,0,0};
int i,j,r,l,t,f;
while(c[0]<0||c[1]<0||c[2]<0||c[3]<0||c[4]<0)
#include<math.h>
#define w(x1,x2,x3,x4,x5) (c[0]*x1+c[1]*x2+c[2]*x3+c[3]*x4+c[4]*x5+c[5])
int min5(float *x);
int min3(float a,float b,float c);
int min5(float a[5])
printf("函数值:w(x)=%f\n",-(w(0,0,0,0,0)));
运行结果:
for(i=1;i<3;i++)
if(x[min]>x[i]&&x[i]>0);0)
{min=1;
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
划问题无解。
int danchunxing2(int a)
{
int i,k,j;
int flag=0;
float min;
k=a;
for(i=0;i<m;i++)
if(A[i][k]<=0)
flag=1;
else {flag=0;break;}
4/3/2021 7:33:32 AM
第 5 页 共 14 页
(2)、输入初始基变量的数字代码 num 矩阵
(3)、输入方程组右边的值矩阵 b
(4)、输入目标函数各个变量的系数所构成的系数阵 C
输出:
(1)、输出是否为最优解
(2)、输出最优解为多少
3、使用所编程序求解如下 LP 问题并给出结果。
学号:
4/23/2021 7:33:32 AM
第 11 页 共 14 页
delta[i]=delta[i]-A[c][i]*temp3;
}
(6)、输入函数,输入方程组的系数矩阵、初始基变量的数字代码、方程组右边的值矩阵、目标函
数各个变量的系数所构成的系数阵。
4/23/2021 7:33:32 AM
第 7 页 共 14 页
自动化系上机实验报告(课程名称:运筹学)
void print()
自动化系上机实验报告(课程名称:运筹学)
P26
学生姓名:
学号:
例5
程 请输入方程组的系数矩阵 A(3 行 5 列):
序
运2
2
1
0
0
行
结4
0
0
1
0
果
0
5
0
0
1
--------------------------------------------------------------------------
printf(" \tCB\tXB\tb\t");
for(i=0;i<n;i++)
printf(" X(%d)\t",i+1);
for(i=0;i<n;i++)
x[i]=0;
printf("\n");
while(1)
{
q=danchunxing1();
if(q==-1)
{
print();
printf("\n 所得解已经是最优解!\n");
for(i=0;i<n;i++)
scanf("%f",&C[i]);
for(i=0;i<n;i++)
delta[i]=C[i];
for(i=0;i<m;i++)
{
k=num[i]-1;
CB[i]=C[k];
}}
(7)、主函数,调用前面定义的函数。
main()
{
int i,j=0;
int p,q,temp;
/*用于存储常约束条件中的常数*/
float CB[m]; /*用于存储基变量的系数*/
float seta[m]; /*存放出基与入基的变化情况*/
float delta[n]; /*存储检验数矩阵*/
float x[n];
/*存储决策变量*/
int num[m]; /*用于存放出基与进基变量的情况*/
自动化系上机实验报告(课程名称:运筹学)
if(flag==1)
学生姓名:
{printf("\n 该线性规划无最优解!\n"); return -1;}
for(i=0;i<m;i++)
{
if(A[i][k]>0)
seta[i]=b[i]/A[i][k];
else seta[i]=M;
}
min=M;
for(i=0;i<m;i++)
了解算法程序实现的过程和方法。
2、要求:
使用熟悉的编程语言编制单纯形算法的程序。
独立编程,完成实验,撰写实验报告并总结。
二、实验内容和结果
1、单纯形算法的步骤及程序流程图。
(1)、算法步骤
4/23/2021 7:33:32 AM
第 1 页 共 14 页
自动化系上机实验报告(课程名称:运筹学)
第 2 页 共 14 页
自动化系上机实验报告(课程名称:运筹学)
学生姓名:
找出初始基可行
解列出初始单纯
形表 计算校验数
学号:
计算新的单纯形 表
所有δ j<=0?
对于某个δ j>0,是否存在 Pj<=0 确定为入基变量
确定出基变量
已得最优解,结 束
无最优解,结 束
2、单纯形算法程序的规格说明 各段代码功能描述: (1)、定义程序中使用的变量 #include<stdio.h> #include<math.h> #define m 3 /*定义约束条件方程组的个数*/ #define n 5 /*定义未知量的个数*/
int k;
printf("请输入方程组的系数矩阵 A(%d 行%d 列):\n",m,n);
for(i=0;i<m;i++)
4/23/2021 7:33:32 AM
第 8 页 共 14 页
自动化系上机实验报告(课程名称:运筹学)
for(j=0;j<n;j++)
学生姓名:
学号:
scanf("%f",&A[i][j]);
j
0}确定 xk 进基;
②由 xk
min { bi i aik
| aik
0}
bl alk
确定 xl 出基,其中 alk 称为主元素;
③利用初等变换将 alk 化为 1,并利用 alk 将同列中其它元素化为 0,得新解 X(1)。
(5)返回(3),直至求得最优解为止。
(2)、程序图
4/23/2021 7:33:32 AM
x1=31.020 x2=31.060 x3=01.050 x4=4.00 x5=0.00 ZB=15.00
序 运 行 结 果 输 出:
请输入目标函数各个变量的系数所构成的系数阵 C:
2
3 请输入0方程组的0系数矩阵0A(3 行 5 列):
--------------1---------0----------0-.-5-------0-----------0-.-2--------------------
(1)将线性规划化为标准形。
学生姓名:
学号:
(2)用最快的方法确定一个初始基本可行解 X(0)。当 s·t 均为“≤”形式时,以松驰变
量做初始基本变量最快。
(3)求 X(0)中非基本变量 xj 的检验数σj。若 j 0 ,则停止运算,X(0)=X*(表示最
优解),否则转下一步。
(4)①由 k
max{ j
4/23/2021 7:33:32 AM
学号: 第 6 页 共 14 页
自动化系上机实验报告(课程名称:运筹学)
c=p;/*行号*/
学生姓名:
学号:
l=q;/*列号*/
temp1=A[c][l];
b[c]=b[c]/temp1;
for(j=0;j<n;j++)
A[c][j]=A[c][j]/temp1;
请输入初始基变量的数字代码 num 矩阵: 0.00 0.00 -1.00 0.00 -0.20
所得解3 已经是最4 优解! 5 --------------------------------------------------------------------------
最优解请为输:入方程组右边的值矩阵 b:
4/23/2021 7:33:32 AM
第 9 页 共 14 页
自动化系上机实验报告(课程名称:运筹学)
input();
学生姓名:
学号:
printf("\n--------------------------------------------------------------------------\n");
int danchunxing1()
{
int i,k=0;
int flag=0;
float max=0;
for(i=0;i<n;i++)
4/23/2021 7:33:32 AM
第 4 页 共 14 页
自动化系上机实验报告(课程名称:运筹学)
if(delta[i]<=0)
学生姓名:
学号:
flag=1;
printf("\n 请输入初始基变量的数字代码 num 矩阵:\n");
for(i=0;i<m;i++)
scanf("%d",&num[i]);
printf("\n 请输入方程组右边的值矩阵 b:\n");
for(i=0;i<m;i++)
scanf("%f",&b[i]);
printf("\n 请输入目标函数各个变量的系数所构成的系数阵 C:\n");
CB 0 XB 0 b -2 X(11) X(02.)8 X(3) X(4) X(5)
--------------0---------1----------0---------0---------0--.2---------------------