[分享][原创]单纯形法的程序代码,程序中不是用纯粹的VC++,输出函数用的是printf(
<p>#include<stdio.h><br/>#include<iostream.h><br/>#include<math.h><br/>float matrix,x;<br/>int a;<br/>int m,n,s,type;<br/>int indexe,indexl,indexg;<br/>/////////////////////////////////<br/>void jckxj()//基础可行解<br/>{<br/> int i,j; //基础可行解即为 非基变量对应的x=b, 基变量对应的解为0<br/> for(i=0;i<n;i++)<br/> for(j=0;j<s;j++)<br/> if(matrix==1&&a==1)<br/> {<br/> x=matrix;<br/> j=s;<br/> }<br/> for(i=0;i<s;i++)<br/> if(a==0)x=0;<br/>}</p><p>int rj()//基解矩阵<br/>{<br/> int i;<br/> for(i=0;i<s;i++)<br/> if(fabs(matrix)>=0.000001)<br/> if(matrix<0)return 0;<br/> return 1;<br/>}</p><p>int Min()//求最小的<br/>{<br/> int i,temp=0;<br/> float min=matrix;<br/> for(i=1;i<s;i++)<br/> if(min>matrix)<br/> {<br/> min=matrix;<br/> temp=i;<br/> }<br/> return temp;<br/>}<br/>/////////////////////////////////<br/>void JustArtificial()//人工变量<br/>{<br/> int i;<br/> for(i=m+indexe+indexl;i<s;i++)<br/> if(fabs(x)>=0.000001)<br/> {<br/> cout<<"NO Answer\n";<br/> return;<br/> }<br/>}<br/>/////////////////////<br/>int Check(int in)//检验<br/>{<br/> int i;<br/> float maxl=-1;<br/> for(i=0;i<n;i++)<br/> if(fabs(matrix)>=0.000001&&maxl<matrix/matrix)<br/> maxl=matrix/matrix;<br/> if(maxl<0)<br/> return 1;<br/> return 0;<br/>}</p><p>int SearchOut(int *temp,int in)//出基变量<br/>{<br/> int i;<br/> float min=10000;<br/> for(i=0;i<n;i++)<br/> if(fabs(matrix)>=0.000001&&(matrix/matrix>=0)<br/> &&min>matrix/matrix)<br/> {<br/> min=matrix/matrix;<br/> *temp=i;<br/> } <br/> for(i=0;i<s;i++)<br/> if(a=1&&matrix[*temp]==1)<br/> return i;<br/>}<br/>/////////////////////////////////<br/>void Mto(int in,int temp)<br/>{<br/> int i;<br/> for(i=0;i<=s;i++)<br/> if(i!=in)<br/> matrix=matrix/matrix;<br/> matrix=1;<br/>}<br/>/////////////////////////////<br/>void Be(int temp,int in)//初等变换<br/>{<br/> int i,j;<br/> float c;<br/> for(i=0;i<=n;i++)<br/> {<br/> c=matrix/matrix;<br/> if(i!=temp)<br/> for(j=0;j<=s;j++)<br/> matrix=matrix-matrix*c;<br/> }<br/>}<br/>//////////////////////////<br/>void Achange(int in,int out)//出基入基转换<br/>{<br/> int temp=a;<br/> a=a;<br/> a=temp;<br/>}<br/>////////////////////////<br/>void Print()<br/>{<br/> int i,j,k,temp=0;<br/> for(i=0;i<n;i++)<br/> {<br/> for(k=temp;k<s;k++)<br/> if(a==1)<br/> {<br/> printf(" %d ",k);<br/> temp=k+1;<br/> k=s;<br/> }<br/> for(j=0;j<=s;j++)<br/> printf( " %.0f ",matrix );<br/> printf("\n");<br/> }<br/> printf("Rj\n");<br/> for(j=0;j<=s;j++)<br/> printf(" %.0f ",matrix );<br/> printf("\n");<br/>}<br/>////////////////////////<br/>void InitPrint()<br/>{<br/> int i;<br/> printf(" X ");<br/> for(i=0;i<s;i++)<br/> printf(" %d ",i);<br/> printf(" b \n" );<br/> printf(" " );<br/> printf("\n" );<br/>}<br/>//////////////////<br/>void Result()<br/>{<br/> int i;<br/> printf( "(" );<br/> for(i=0;i<s;i++)<br/> printf( "%.0f",x );<br/> printf( ")" );<br/> if(type==1)<br/> printf("\nZmax= %.0f\n" ,matrix );<br/> else printf("\nZmin=%.0f\n", matrix );<br/>}<br/>//////////////////////<br/>void PrintResult()<br/>{<br/> if(type==0)<br/> printf("the Minimal: %.2f\n", matrix );<br/> else <br/> printf("the Maximum: %.2f\n", matrix );<br/>}<br/>////////////////////////////////<br/>void Merge(float nget[],float nlet[],float net[],float b[])//合并 <br/>{ <br/> //置成我们需要的矩阵,最后一列置成0 <br/> // 1 2 1 0 0 0<br/> // 4 0 0 1 0 0<br/> // 0 4 0 0 1 0<br/> //-2 -3 0 0 0 0<br/> int i,j; <br/> for(i=0;i<n;i++)<br/> {<br/> for(j=m;j<m+indexe;j++)<br/> if(nget!=-1)matrix=0;<br/> else matrix=-1;<br/> for(j=m+indexe;j<m+indexe+indexl;j++)<br/> if(nlet!=1)matrix=0;<br/> else matrix=1;<br/> for(j=m+indexe+indexl;j<s;j++)<br/> if(net!=1)matrix=0;<br/> else matrix=1;<br/> }<br/> for(i=m;i<m+indexe+indexl;i++) //将目标函数中人工变量的系数补为0<br/> matrix=0;<br/> for(i=m+indexe+indexl;i<s;i++)<br/> matrix=100; //置成M<br/> for(i=0;i<n;i++) //把b[]的值赋给matrix <br/> matrix=b;<br/> matrix=0;<br/>}</p><p><br/>///////////////////////////<br/>void ProcessA()//初始a[] a[]是标记基变量,若为基变量则为0,若为非基变量则为1<br/>{<br/> int i;<br/> for(i=0;i<m+indexe;i++)<br/> a=0;<br/> for(i=m+indexe;i<s;i++)<br/> a=1;<br/>}</p><p>////////////////////////////////<br/>void Input(float b[],int code[])<br/>{<br/> int i=0;int j=0;<br/> cout<<"The equator variable and Restrictor\n";<br/> cin>>m>>n;<br/> for(i=0;i<n;i++)<br/> {<br/> cout<<"Inputb[] and Restrictor code 0:<= 1:= 2:>=\n";//输入b[]和限制符号 <= ,= ,>=<br/> cin>>b>>code; //分别输入到b 和 code 中<br/> cout<<"The 系数 \n"; //提示输入每个限制条件的系数<br/> for(j=0;j<m;j++) <br/> cin>>matrix;<br/> }<br/> cout<<"the type 0:Min 1:max\n";//输入要求是类型极大还是极小 0:Min 1:max<br/> do{<br/> cin>>type;<br/> if(type!=0&&type!=1)<br/> cout<<"error,ReInput!\n";<br/> }while(type!=0&&type!=1);<br/> cout<<"the Z\n";<br/> for(i=0;i<m;i++)<br/> cin>>matrix;<br/> if(type==1) //如果是求极大,把它转化为极小来做,系数全部反号<br/> for(i=0;i<m;i++)<br/> matrix=-matrix;<br/>} </p><p><br/>////////////////// <br/>void Xartificial()//消去人工变量<br/>{<br/> int i,j,k;<br/> <br/> if(indexg!=0)<br/> {<br/> for(i=m+indexe+indexl;i<s;i++)<br/> {<br/> for(j=0;j<n;j++)<br/> if(matrix==1)<br/> {<br/> for(k=0;k<=s;k++)<br/> matrix=matrix-matrix*100;<br/> j=n;<br/> }<br/> }<br/> }<br/>}</p><p>////////////////////////////////////////////////<br/>void Process(float c[],int row,int vol)<br/>{<br/> int i;<br/> for(i=0;i<n;i++) //i =0 时置第一列为 1 0 0 i=1 时置第2列为 0 1 0 <br/> if(i!=row)c=0;<br/>}<br/>//////////////////////<br/>void Start(float b[],int code[])<br/>{<br/> int i;<br/> float nget,nlet,net;<br/> indexe=indexl=indexg=0; //indexl 表示松弛变量数 indexg 表示人工变量数, indexe表示减去的松弛变量数<br/> for(i=0;i<n;i++)<br/> {<br/> if(code==0) //如果是<=<br/> {<br/> nlet=1; //松弛变量数+1 且置成相应的标记<br/> Process(nlet,i,indexl-1);//传 net, 行号,indexl-1 过去<br/> }<br/> if(code==1)<br/> {<br/> net=1; //人工变量数+1且置成相应的标记<br/> Process(net,i,indexg-1); //将刚加入的列单位化 <br/> }<br/> if(code==2)<br/> {<br/> net=1; //人工变量数+1 且置成相应的标记<br/> nget=-1; //剩余变量数+1 且置成相应的标记<br/> Process(net,i,indexg-1);Process(nlet,i,indexe-1);<br/> }<br/> }<br/> s=indexe+indexl+indexg+m; //变量总个数<br/> Merge(nget,nlet,net,b);<br/> ProcessA();<br/> InitPrint();<br/> Xartificial();<br/>}</p><p>void Simplix()//单纯形法<br/>{<br/> int in,out,temp=0;<br/> while(1)<br/> {<br/> jckxj();<br/> Print();<br/> Result();<br/> if(!rj()) in=Min();<br/> else<br/> {<br/> if(indexg!=0)<br/> JustArtificial();<br/> PrintResult();<br/> return;<br/> }<br/> if(Check(in))<br/> {<br/> cout<<"No Delimition\n";<br/> return;<br/> }<br/> out=SearchOut(&temp,in);<br/> Mto(in,temp);<br/> Be(temp,in);<br/> Achange(in,out);<br/> }<br/>}</p><p>void main()<br/>{<br/> int code;//输入符号标记<br/> float b;<br/> Input(b,code);//初始化<br/> Start(b,code);//标准化行<br/> Simplix();<br/>}<br/>/*模拟输入数据 <br/> max z=2 x1 + 3 x2<br/> s.t {<br/> x1 + 2 x2 <=8<br/> 4 x1 <=16<br/> 4 x2<=12<br/> x1,x2>=0<br/> }</p><p>2 3 8 0 1 2 16 0 4 0 12 0 0 4<br/>*/</p> 如果是 = 该如何考虑呢?<br/> 支持! 好厉害,lz的程序不错。不过用gsl科学计算库的话可以省下很多步骤:) 1# hustyangyang 好啊
页:
[1]