单纯形算法程序
单纯形法程序,在VC++6.0 下测试通过!<P>#include<iostream.h>
#include<math.h>
float matrix,x;
int a;
int m,n,s,type;
int indexe,indexl,indexg;
/////////////////////////////////
void jckxj()//基础可行解
{
int i,j;
for(i=0;i<n;i++)
for(j=0;j<s;j++)
if(matrix==1&&a==1)
{
x=matrix;
j=s;
}
for(i=0;i<s;i++)
if(a==0)x=0;
}</P>
<P>int rj()//基解矩阵
{
int i;
for(i=0;i<s;i++)
if(fabs(matrix)>=0.000001)
if(matrix<0)return 0;
return 1;
}
int Min()//求最小的
{
int i,temp=0;
float min=matrix;
for(i=1;i<s;i++)
if(min>matrix)
{
min=matrix;
temp=i;
}
return temp;
}
/////////////////////////////////
void JustArtificial()//人工变量
{
int i;
for(i=m+indexe+indexl;i<s;i++)
if(fabs(x)>=0.000001)
{
cout<<"NO Answer\n";
return;
}
}
/////////////////////
int Check(int in)//检验
{
int i;
float maxl=-1;
for(i=0;i<n;i++)
if(fabs(matrix)>=0.000001&&maxl<matrix/matrix)
maxl=matrix/matrix;
if(maxl<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)>=0.000001&&(matrix/matrix>=0)
&&min>matrix/matrix)
{
min=matrix/matrix;
*temp=i;
}
for(i=0;i<s;i++)
if(a=1&&matrix[*temp]==1)
return i;
}
/////////////////////////////////
void Mto(int in,int temp)
{
int i;
for(i=0;i<=s;i++)
if(i!=in)
matrix=matrix/matrix;
matrix=1;
}
/////////////////////////////
void Be(int temp,int in)//初等变换
{
int i,j;
float c;
for(i=0;i<=n;i++)
{
c=matrix/matrix;
if(i!=temp)
for(j=0;j<=s;j++)
matrix=matrix-matrix*c;
}
}
//////////////////////////
void Achange(int in,int out)//出基入基转换
{
int temp=a;
a=a;
a=temp;
}
////////////////////////
void Print()
{
int i,j,k,temp=0;
for(i=0;i<n;i++)
{
for(k=temp;k<s;k++)
if(a==1)
{
cout<<k;
temp=k+1;
k=s;
}
for(j=0;j<=s;j++)
cout<<matrix;
cout<<"\n";
}
cout<<"Rj";
for(j=0;j<=s;j++)
cout<<matrix;
cout<<"\n";
}
////////////////////////
void InitPrint()
{
int i;
cout<<"X";
for(i=0;i<s;i++)
cout<<i;
cout<<"b\n";
cout<<" ";
cout<<"\n";
}
//////////////////
void Result()
{
int i;
cout<<"(";
for(i=0;i<s;i++)
cout<<x;
cout<<")";
if(type==1)
cout<<"Zmax="<<matrix;
else cout<<"Zmin="<<matrix;
}
//////////////////////
void PrintResult()
{
if(type==0)
cout<<"the Minimal:"<<matrix;
else cout<<"theMaximum:"<<matrix;
}
////////////////////////////////
void Merge(float nget[],float nlet[],float net[],float b[])//合并
{
int i,j;
for(i=0;i<n;i++)
{
for(j=m;j<m+indexe;j++)
if(nget!=-1)matrix=0;
else matrix=-1;
for(j=m+indexe;j<m+indexe+indexl;j++)
if(nlet!=1)matrix=0;
else matrix=1;
for(j=m+indexe+indexl;j<s;j++)
if(net!=1)matrix=0;
else matrix=1;
}
for(i=m;i<m+indexe+indexl;i++)
matrix=0;
for(i=m+indexe+indexl;i<s;i++)
matrix=100;
matrix=0;
}</P>
<P>///////////////////////////
void ProcessA()//初始a[]
{
int i;
for(i=0;i<m+indexe;i++)
a=0;
for(i=m+indexe;i<s;i++)
a=1;
}</P>
<P>////////////////////////////////
void Input(float b[],int code[])
{
int i=0;int j=0;
cout<<"The equator variable and Restrictor\n";
cin>>m>>n;
for(i=0;i<n;i++)
{
cout<<"Inputb[] and Restrictor code0:<=1 1:= 2:>=\n";
cin>>b>>code;
cout<<"The 系数 \n";
for(i=0;j<m;j++)
cin>>matrix;
}
cout<<"the type 0:Min 1:max\n";
do{
cin>>type;
if(type!=0&&type!=1)
cout<<"error,ReInput!\n";
}while(type!=0&&type!=1);
cout<<"the Z\n";
for(i=0;i<m;i++)
cin>>matrix;
if(type==1)
for(i=0;i<m;i++)
matrix=-matrix;
} </P>
<P>
//////////////////
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==1)
{
for(k=0;k<=s;k++)
matrix=matrix-matrix*100;
j=n;
}
}
}
}</P>
<P>////////////////////////////////////////////////
void Process(float c[],int row,int vol)
{
int i;
for(i=0;i<n;i++)
if(i!=row)c=0;
}
//////////////////////
void Start(float b[],int code[])
{
int i;
float nget,nlet,net;
indexe=indexl=indexg=0;
for(i=0;i<n;i++)
{
if(code==0){nlet=1;Process(nlet,i,indexl-1);}
if(code==1){net=1;Process(net,i,indexg-1);}
if(code==2){
net=1;
nget=-1;
Process(net,i,indexg-1);Process(nlet,i,indexe-1);
}
}
s=indexe+indexl+indexg+m;
Merge(nget,nlet,net,b);
ProcessA();
InitPrint();
Xartificial();
}</P>
<P>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))
{
cout<<"No Delimition\n";
return;
}
out=SearchOut(&temp,in);
Mto(in,temp);
Be(temp,in);
Achange(in,out);
}
}</P>
<P>void main()
{
int code;//输入符号标记
float b;
Input(b,code);//初始化
Start(b,code);//标准化行
Simplix();
}
</P> 谢了 不错啊!! Good! 好用不? 资源分配问题可以用这个程序吗? 哇,楼主强人! 单纯行算法是指数算法啊! 这么长!看不懂啊。 <P>so well!</P>