- 在线时间
- 0 小时
- 最后登录
- 2006-7-19
- 注册时间
- 2006-7-19
- 听众数
- 0
- 收听数
- 0
- 能力
- 0 分
- 体力
- 57 点
- 威望
- 0 点
- 阅读权限
- 20
- 积分
- 18
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 2
- 主题
- 1
- 精华
- 0
- 分享
- 0
- 好友
- 0
升级   13.68% 该用户从未签到
 |
<p>#include<stdio.h><br/>#include<iostream.h><br/>#include<math.h><br/>float matrix[100][100],x[100];<br/>int a[100];<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[j]==1&&a[j]==1)<br/> {<br/> x[j]=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[n])>=0.000001)<br/> if(matrix[n]<0)return 0;<br/> return 1;<br/>}</p><p>int Min()//求最小的<br/>{<br/> int i,temp=0;<br/> float min=matrix[n][0];<br/> for(i=1;i<s;i++)<br/> if(min>matrix[n])<br/> {<br/> min=matrix[n];<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[in])>=0.000001&&maxl<matrix/matrix[in])<br/> maxl=matrix/matrix[in];<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[in])>=0.000001&&(matrix/matrix[in]>=0)<br/> &&min>matrix/matrix[in])<br/> {<br/> min=matrix/matrix[in];<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[temp]=matrix[temp]/matrix[temp][in];<br/> matrix[temp][in]=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[in]/matrix[temp][in];<br/> if(i!=temp)<br/> for(j=0;j<=s;j++)<br/> matrix[j]=matrix[j]-matrix[temp][j]*c;<br/> }<br/>}<br/>//////////////////////////<br/>void Achange(int in,int out)//出基入基转换<br/>{<br/> int temp=a[in];<br/> a[in]=a[out];<br/> a[out]=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[k]==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[j] );<br/> printf("\n");<br/> }<br/> printf("Rj\n");<br/> for(j=0;j<=s;j++)<br/> printf(" %.0f ",matrix[n][j] );<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[n] );<br/> else printf("\nZmin=%.0f\n", matrix[n] );<br/>}<br/>//////////////////////<br/>void PrintResult()<br/>{<br/> if(type==0)<br/> printf("the Minimal: %.2f\n", matrix[n] );<br/> else <br/> printf("the Maximum: %.2f\n", matrix[n] );<br/>}<br/>////////////////////////////////<br/>void Merge(float nget[][100],float nlet[][100],float net[][100],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[j-m]!=-1)matrix[j]=0;<br/> else matrix[j]=-1;<br/> for(j=m+indexe;j<m+indexe+indexl;j++)<br/> if(nlet[j-m-indexe]!=1)matrix[j]=0;<br/> else matrix[j]=1;<br/> for(j=m+indexe+indexl;j<s;j++)<br/> if(net[j-m-indexe-indexl]!=1)matrix[j]=0;<br/> else matrix[j]=1;<br/> }<br/> for(i=m;i<m+indexe+indexl;i++) //将目标函数中人工变量的系数补为0<br/> matrix[n]=0;<br/> for(i=m+indexe+indexl;i<s;i++)<br/> matrix[n]=100; //置成M<br/> for(i=0;i<n;i++) //把b[]的值赋给matrix <br/> matrix=b;<br/> matrix[n]=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[j];<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[n];<br/> if(type==1) //如果是求极大,把它转化为极小来做,系数全部反号<br/> for(i=0;i<m;i++)<br/> matrix[n]=-matrix[n];<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[j]==1)<br/> {<br/> for(k=0;k<=s;k++)<br/> matrix[n][k]=matrix[n][k]-matrix[j][k]*100;<br/> j=n;<br/> }<br/> }<br/> }<br/>}</p><p>////////////////////////////////////////////////<br/>void Process(float c[][100],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[vol]=0;<br/>}<br/>//////////////////////<br/>void Start(float b[],int code[])<br/>{<br/> int i;<br/> float nget[100][100],nlet[100][100],net[100][100];<br/> indexe=indexl=indexg=0; //indexl 表示松弛变量数 indexg 表示人工变量数, indexe表示减去的松弛变量数<br/> for(i=0;i<n;i++)<br/> {<br/> if(code==0) //如果是<=<br/> {<br/> nlet[indexl++]=1; //松弛变量数+1 且置成相应的标记<br/>   rocess(nlet,i,indexl-1);//传 net, 行号,indexl-1 过去<br/> }<br/> if(code==1)<br/> {<br/> net[indexg++]=1; //人工变量数+1且置成相应的标记<br/>   rocess(net,i,indexg-1); //将刚加入的列单位化 <br/> }<br/> if(code==2)<br/> {<br/> net[indexg++]=1; //人工变量数+1 且置成相应的标记<br/> nget[indexe++]=-1; //剩余变量数+1 且置成相应的标记<br/> Process(net,i,indexg-1) rocess(nlet,i,indexe-1);<br/> }<br/> }<br/> s=indexe+indexl+indexg+m; //变量总个数<br/> Merge(nget,nlet,net,b);<br/>  rocessA();<br/> InitPrint();<br/> Xartificial();<br/>}</p><p>void Simplix()//单纯形法<br/>{<br/> int in,out,temp=0;<br/> while(1)<br/> {<br/> jckxj();<br/>   rint();<br/> Result();<br/> if(!rj()) in=Min();<br/> else<br/> {<br/> if(indexg!=0)<br/> JustArtificial();<br/>   rintResult();<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[100];//输入符号标记<br/> float b[100];<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> |
zan
|