zhyi 发表于 2005-4-18 21:45

单纯形算法程序

单纯形法程序,在VC++6.0 下测试通过!


<P>#include&lt;iostream.h&gt;
#include&lt;math.h&gt;
float matrix,x;
int a;
int m,n,s,type;
int indexe,indexl,indexg;
/////////////////////////////////
void jckxj()//基础可行解
{
int i,j;
for(i=0;i&lt;n;i++)
  for(j=0;j&lt;s;j++)
   if(matrix==1&amp;&amp;a==1)
   {
    x=matrix;
    j=s;
   }
   for(i=0;i&lt;s;i++)
    if(a==0)x=0;
}</P>
<P>int rj()//基解矩阵
{
int i;
for(i=0;i&lt;s;i++)
  if(fabs(matrix)&gt;=0.000001)
   if(matrix&lt;0)return 0;
   return 1;
}
int Min()//求最小的
{
    int i,temp=0;
float min=matrix;
for(i=1;i&lt;s;i++)
  if(min&gt;matrix)
  {
   min=matrix;
   temp=i;
  }
  return temp;
}
/////////////////////////////////
void JustArtificial()//人工变量
{
int i;
for(i=m+indexe+indexl;i&lt;s;i++)
  if(fabs(x)&gt;=0.000001)
  {
   cout&lt;&lt;"NO Answer\n";
   return;
  }
}
/////////////////////
int Check(int in)//检验
{
int i;
float maxl=-1;
for(i=0;i&lt;n;i++)
  if(fabs(matrix)&gt;=0.000001&amp;&amp;maxl&lt;matrix/matrix)
   maxl=matrix/matrix;
  if(maxl&lt;0)
   return 1;
  return 0;
}
int SearchOut(int *temp,int in)//出基变量
{
int i;
float min=10000;
for(i=0;i&lt;n;i++)
  if(fabs(matrix)&gt;=0.000001&amp;&amp;(matrix/matrix&gt;=0)
   &amp;&amp;min&gt;matrix/matrix)
  {
   min=matrix/matrix;
   *temp=i;
  }
  for(i=0;i&lt;s;i++)
   if(a=1&amp;&amp;matrix[*temp]==1)
    return i;
}
/////////////////////////////////
void Mto(int in,int temp)
{
int i;
for(i=0;i&lt;=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&lt;=n;i++)
{
  c=matrix/matrix;
  if(i!=temp)
   for(j=0;j&lt;=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&lt;n;i++)
{
  for(k=temp;k&lt;s;k++)
   if(a==1)
   {
    cout&lt;&lt;k;
    temp=k+1;
    k=s;
   }
   for(j=0;j&lt;=s;j++)
    cout&lt;&lt;matrix;
   cout&lt;&lt;"\n";
}
cout&lt;&lt;"Rj";
for(j=0;j&lt;=s;j++)
  cout&lt;&lt;matrix;
cout&lt;&lt;"\n";
}
////////////////////////
void InitPrint()
{
int i;
cout&lt;&lt;"X";
for(i=0;i&lt;s;i++)
  cout&lt;&lt;i;
cout&lt;&lt;"b\n";
cout&lt;&lt;"  ";
cout&lt;&lt;"\n";
}
//////////////////
void Result()
{
int i;
cout&lt;&lt;"(";
for(i=0;i&lt;s;i++)
  cout&lt;&lt;x;
cout&lt;&lt;")";
if(type==1)
  cout&lt;&lt;"Zmax="&lt;&lt;matrix;
else cout&lt;&lt;"Zmin="&lt;&lt;matrix;
}
//////////////////////
void PrintResult()
{
if(type==0)
  cout&lt;&lt;"the Minimal:"&lt;&lt;matrix;
else cout&lt;&lt;"theMaximum:"&lt;&lt;matrix;
}
////////////////////////////////
void Merge(float nget[],float nlet[],float net[],float b[])//合并
{
int i,j;
for(i=0;i&lt;n;i++)
{
  for(j=m;j&lt;m+indexe;j++)
   if(nget!=-1)matrix=0;
   else matrix=-1;
   for(j=m+indexe;j&lt;m+indexe+indexl;j++)
    if(nlet!=1)matrix=0;
    else matrix=1;
    for(j=m+indexe+indexl;j&lt;s;j++)
     if(net!=1)matrix=0;
     else matrix=1;
}
for(i=m;i&lt;m+indexe+indexl;i++)
  matrix=0;
for(i=m+indexe+indexl;i&lt;s;i++)
  matrix=100;
matrix=0;
}</P>
<P>///////////////////////////
void ProcessA()//初始a[]
{
int i;
for(i=0;i&lt;m+indexe;i++)
  a=0;
for(i=m+indexe;i&lt;s;i++)
  a=1;
}</P>
<P>////////////////////////////////
void Input(float b[],int code[])
{
int i=0;int j=0;
cout&lt;&lt;"The equator variable and Restrictor\n";
cin&gt;&gt;m&gt;&gt;n;
for(i=0;i&lt;n;i++)
{
  cout&lt;&lt;"Inputb[] and Restrictor code0:&lt;=1 1:= 2:&gt;=\n";
  cin&gt;&gt;b&gt;&gt;code;
  cout&lt;&lt;"The 系数  \n";
  for(i=0;j&lt;m;j++)
  cin&gt;&gt;matrix;
}
cout&lt;&lt;"the type 0:Min 1:max\n";
do{
  cin&gt;&gt;type;
  if(type!=0&amp;&amp;type!=1)
   cout&lt;&lt;"error,ReInput!\n";
}while(type!=0&amp;&amp;type!=1);
cout&lt;&lt;"the Z\n";
for(i=0;i&lt;m;i++)
  cin&gt;&gt;matrix;
if(type==1)
  for(i=0;i&lt;m;i++)
   matrix=-matrix;
}                                            </P>
<P>
//////////////////   
void Xartificial()//消去人工变量
{
int i,j,k;
if(indexg!=0)
{
  for(i=m+indexe+indexl;i&lt;s;i++)
  {
   for(j=0;j&lt;n;j++)
    if(matrix==1)
    {
     for(k=0;k&lt;=s;k++)
      matrix=matrix-matrix*100;
     j=n;
    }
  }
}
}</P>
<P>////////////////////////////////////////////////
void Process(float c[],int row,int vol)
{
int i;
for(i=0;i&lt;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&lt;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&lt;&lt;"No Delimition\n";
   return;
  }
  out=SearchOut(&amp;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>

lvming 发表于 2005-4-25 22:44

谢了

M_Tramp 发表于 2005-4-29 18:10

不错啊!!

pangaogao 发表于 2005-5-4 00:15

Good!

那时花开 发表于 2005-6-3 22:57

好用不?

那时花开 发表于 2005-6-3 22:58

资源分配问题可以用这个程序吗?

monkeytail 发表于 2005-6-10 01:42

哇,楼主强人!

monkeytail 发表于 2005-6-10 01:43

单纯行算法是指数算法啊!

bnulj 发表于 2005-6-11 13:14

这么长!看不懂啊。

mengfanqi 发表于 2005-9-6 19:41

<P>so well!</P>
页: [1] 2 3
查看完整版本: 单纯形算法程序