#include<iostream.h>
#include<math.h>- E& N+ }% r- m" N
float matrix[100][100],x[100];9 B1 K. @0 W, O4 L, n) g; C0 N7 Z
int a[100];
int m,n,s,type;
int indexe,indexl,indexg;
/////////////////////////////////; ]( Z6 J: }# R
void jckxj()//基础可行解
{
int i,j;
for(i=0;i<n;i++)7 |3 e8 q& x/ t! \8 k. X
for(j=0;j<s;j++)
if(matrix[j]==1&&a[j]==1)8 S' j9 Y7 X# @, F: P
{
x[j]=matrix;( A; w, r I' T D
j=s;( k! e- S: G* \5 ?* m
}9 ^. j) r! ^ w" F" {+ N& B* E
for(i=0;i<s;i++)
if(a==0)x=0;
}
int rj()//基解矩阵
{
int i;2 C3 A6 C8 O# W k; v
for(i=0;i<s;i++)
if(fabs(matrix[n])>=0.000001)6 s( U8 }8 r+ V/ N$ h
if(matrix[n]<0)return 0;' ^9 s. K8 b& X8 m5 }/ P' X
return 1;. z% q" ?6 i. l# Q
}6 g- d9 D. b$ c6 a( t; W
int Min()//求最小的2 |* W1 N( \# w1 g4 @
{
int i,temp=0;7 L4 W& [# `; X
float min=matrix[n][0];+ z L5 p8 q4 i+ A' _( u [
for(i=1;i<s;i++)
if(min>matrix[n])
{) _1 F! z0 o* y* A8 A
min=matrix[n];
temp=i;
}
return temp;! y& H3 i) B! z3 w* O) r
}4 S' N4 A: G0 p4 ~+ x
/////////////////////////////////9 _% n/ G3 j0 Z! _, [' q+ E2 U5 Z, J
void JustArtificial()//人工变量
{1 ^9 y6 ]* z. ]6 @5 N
int i;
for(i=m+indexe+indexl;i<s;i++)) U L) K @7 h
if(fabs(x)>=0.000001)- g2 N [$ R, I8 @" H; P* Z
{* \4 ?0 v1 x: m1 R' q
cout<<"NO Answer\n";/ H3 K) d( p8 G0 T9 ]/ K3 Y
return;
}
}
/////////////////////
int Check(int in)//检验
{
int i; q+ u: A" Y7 U& ^2 k5 p
float maxl=-1;0 c, g' [; d9 Y* \3 ^( s! ~
for(i=0;i<n;i++)% K+ m& q( p s
if(fabs(matrix[in])>=0.000001&&maxl<matrix/matrix[in])
maxl=matrix/matrix[in];/ }9 y4 g, t8 i, x, f* i, C
if(maxl<0)" D& a8 j/ r4 s$ F
return 1;
return 0; _. o! `4 m1 v+ b5 V9 j; h
}& B3 v5 c) [+ k( z
int SearchOut(int *temp,int in)//出基变量( |3 O& l6 s; P$ K/ ~# f
{) e2 Y3 S3 J: A; b$ x
int i;1 q4 Y9 H' K' `( A
float min=10000;8 Q2 F/ u$ G" s# ?
for(i=0;i<n;i++), K8 A. y0 j) d' B1 \8 `5 @
if(fabs(matrix[in])>=0.000001&&(matrix/matrix[in]>=0)
&&min>matrix/matrix[in])7 e3 j; n7 v8 I5 e( n# ^2 s Q* \
{$ |; G; W4 t5 m) e9 B
min=matrix/matrix[in];
*temp=i;
}+ y, }7 a+ J1 a1 ^* s- _
for(i=0;i<s;i++)
if(a=1&&matrix[*temp]==1)0 \0 R% Q7 h& n
return i;$ z" a; T$ |2 D
}
/////////////////////////////////- _5 _4 G0 Z( c0 X
void Mto(int in,int temp)- D! B3 t. P7 C# Q5 M" U8 h5 `
{
int i;
for(i=0;i<=s;i++)
if(i!=in)
matrix[temp]=matrix[temp]/matrix[temp][in]; p% I+ a3 E7 R
matrix[temp][in]=1;
}- _3 Q* v, D; t
/////////////////////////////' ~1 d2 @! p9 x7 h. M
void Be(int temp,int in)//初等变换4 z; l, u/ [) k( d6 u9 O5 n
{
int i,j;
float c;
for(i=0;i<=n;i++)
{
c=matrix[in]/matrix[temp][in];. l$ D# F$ K1 x6 O x3 _
if(i!=temp)
for(j=0;j<=s;j++)# `( ?. H# D* p0 W
matrix[j]=matrix[j]-matrix[temp][j]*c;
}. K5 |- ^4 c6 t4 H, z5 m
}
//////////////////////////; w6 ~ A4 o) }9 y/ g3 o% A+ E
void Achange(int in,int out)//出基入基转换+ z; m; A& C5 \# Y
{. U7 _+ f5 A" y7 o& S
int temp=a[in];5 z( \3 L0 W4 [: V9 k
a[in]=a[out];
a[out]=temp;
}
////////////////////////; O: g: E9 C& r/ Z: q. l; y( e
void Print()! F% n# V3 j1 T/ Q- b' e
{
int i,j,k,temp=0;4 o/ c( R3 o% r A" [" Q0 o4 |5 o
for(i=0;i<n;i++)
{; u- ]$ V; U# Z4 O% P
for(k=temp;k<s;k++), m0 w! c% D% |! l6 z
if(a[k]==1)
{5 w. f5 n4 F7 R2 [ i" y1 x2 m
cout<<k;& B; O: m: Y% M% `# L7 \, n7 P
temp=k+1;
k=s;9 U* H8 R4 \% [; c# s
}% N U I+ j5 `* I: S" L
for(j=0;j<=s;j++)
cout<<matrix[j];) \9 [3 [. L$ W2 K/ T& H. ~2 }# M
cout<<"\n";
}
cout<<"Rj";! ^- W M, j7 K1 \5 {( s2 X9 {
for(j=0;j<=s;j++)% D1 S7 n1 V7 s* @; f9 \4 n
cout<<matrix[n][j];
cout<<"\n";, a1 B! a, m. r+ M/ e D$ {
}
////////////////////////
void InitPrint()
{
int i;6 k$ w4 z9 j, k1 L8 J
cout<<"X";/ }- H6 a8 S0 ~
for(i=0;i<s;i++)# ?/ M9 B; e0 E; e
cout<<i;2 e6 |( R/ ~& ^7 \* R4 }0 Y
cout<<"b\n";# g8 i4 E( f( d5 h
cout<<" ";
cout<<"\n";9 u+ g: Y1 R4 y2 B* b [
}0 f% `4 G* R/ Q& W) D
//////////////////& L# N q1 @+ o; A' C2 u& I' ~: `% R
void Result()2 M' e4 }; R- a# A
{
int i;$ Z9 S! J1 Q( Q
cout<<"(";, }7 Q8 o- G5 P7 E5 c/ F$ F
for(i=0;i<s;i++)! c6 S3 U# {3 c: R \
cout<<x;
cout<<")";
if(type==1)
cout<<"Zmax="<<matrix[n];
else cout<<"Zmin="<<matrix[n];9 Y1 e' o2 p& A. w
}
//////////////////////
void PrintResult()
{5 N% P/ C" O0 {/ ~
if(type==0)
cout<<"the Minimal:"<<matrix[n];. Z0 |- i; V4 w0 J: Z$ S* I
else cout<<"theMaximum:"<<matrix[n];
}
////////////////////////////////. Y$ B, r& E) J; {- z
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[j-m]!=-1)matrix[j]=0;
else matrix[j]=-1;
for(j=m+indexe;j<m+indexe+indexl;j++)
if(nlet[j-m-indexe]!=1)matrix[j]=0;0 j; U8 n5 F1 ?* E2 F" N
else matrix[j]=1;8 o. I4 z! n" J
for(j=m+indexe+indexl;j<s;j++)
if(net[j-m-indexe-indexl]!=1)matrix[j]=0;7 Y/ K: k8 m" K7 z) S1 {
else matrix[j]=1;
}# ]' g8 e3 {0 h d. S3 Q5 S. M
for(i=m;i<m+indexe+indexl;i++)" u7 ]0 f1 [3 i) j. ?
matrix[n]=0;& [' z, W; H& c
for(i=m+indexe+indexl;i<s;i++)8 h1 E$ }% F! u5 Q6 k
matrix[n]=100;
matrix[n]=0;( J2 [! d- R' j# P
}
/////////////////////////// void ProcessA()//初始a[] {2 H- ]3 e9 U0 V0 U$ @ int i; for(i=0;i<m+indexe;i++)# R+ x/ L) v: B4 l* w7 L a=0;( k) I( T# v1 M; k0 g for(i=m+indexe;i<s;i++)7 l* A7 T6 [# J* H a=1; }
////////////////////////////////+ Q: l% {4 V; C3 l4 z% N4 o void Input(float b[],int code[]) {5 q" k2 e4 V; @4 C0 r+ { int i=0;int j=0;) L' `% }" ~, q9 M; v9 z3 x cout<<"The equator variable and Restrictor\n"; cin>>m>>n; for(i=0;i<n;i++) {3 h- I* q! w" Z/ \! Y) I5 p. k cout<<"Inputb[] and Restrictor code0:<=1 1:= 2:>=\n"; cin>>b>>code; cout<<"The 系数 \n"; for(i=0;j<m;j++)8 ]" H( U0 w: B, T1 ^; C& r% W cin>>matrix[j];2 H+ p1 F6 P" s. A7 i }" I$ {; S+ K, \ cout<<"the type 0:Min 1:max\n"; do{ cin>>type; if(type!=0&&type!=1)8 x" k% w4 H4 k& z cout<<"error,ReInput!\n";0 n# c$ b7 v6 ?7 S, z5 c; z }while(type!=0&&type!=1);+ |* _/ s2 ^: F' c1 F0 x( b2 ? cout<<"the Z\n";! {) W. H, W4 o% z8 { for(i=0;i<m;i++) M$ T2 j. v0 \$ | cin>>matrix[n];1 G5 B% H- h m/ y3 `6 z' A if(type==1) for(i=0;i<m;i++) matrix[n]=-matrix[n];' t) Q& Y* B" F6 f }
) ^. w3 g% T- L8 n0 s0 m, y7 j, b ////////////////// void Xartificial()//消去人工变量0 r% i5 e, j! H7 F. r) Y: E {" P# Q# p' x* e) S0 W2 y/ w int i,j,k;# \' q: _, S* r6 Y* |5 {0 }3 X if(indexg!=0) {* p. S1 _& ^ V, `, N' e3 e for(i=m+indexe+indexl;i<s;i++)/ z/ Y4 g" D. Q- ]9 d { for(j=0;j<n;j++)* Y o5 B1 @" O/ A. o if(matrix[j]==1)% T( H6 f" N+ h {1 P+ L" m. B' ]( B$ r for(k=0;k<=s;k++)* |+ y j6 q- w+ {( p4 P0 E. T matrix[n][k]=matrix[n][k]-matrix[j][k]*100; j=n; }. N- B: r2 d& @: I/ L3 `3 \, N6 V7 e } }& L3 B; Y" R" P- g2 o }
- i2 ~" w: r6 L0 F/ f+ d////////////////////////////////////////////////5 S, S2 K# N3 p
void Process(float c[][100],int row,int vol)
{
int i;/ z% \4 M' F& `9 \) V" W5 |) P6 [
for(i=0;i<n;i++)
if(i!=row)c[vol]=0;
}
//////////////////////
void Start(float b[],int code[])
{
int i;
float nget[100][100],nlet[100][100],net[100][100];$ D! i$ }$ ^" M! x3 `
indexe=indexl=indexg=0;7 A7 y5 ]5 B `, i0 F
for(i=0;i<n;i++)
{6 X2 ]3 |6 u+ j2 |
if(code==0){nlet[indexl++]=1
rocess(nlet,i,indexl-1);}$ d: A! K1 H, x5 r' ^1 V* g1 ~* ~
if(code==1){net[indexl++]=1
rocess(net,i,indexg-1);}: t3 W: m& Q1 O- ^2 a
if(code==2){4 W8 t+ `' k$ _ m. z9 b/ a; Y& m$ T
net[indexg++]=1;) ]; @+ r& u5 F+ ^4 |( s5 }& K' z
nget[indexe++]=-1;
Process(net,i,indexg-1)
rocess(nlet,i,indexe-1);
}( [& B% i- Y _ s. f
}1 Q3 J; @9 B$ H
s=indexe+indexl+indexg+m;
Merge(nget,nlet,net,b);( {$ y! p* O( v, g: R
ProcessA();
InitPrint();! O, p2 e& z9 D! \ b& _
Xartificial();
}
void Simplix()//单纯形法 {5 u) q/ A9 ]0 y. F& F& L* R7 ` int in,out,temp=0; while(1) { jckxj(); Print(); Result();: f3 h% x6 {% Q, K" X! i if(!rj()) in=Min();6 S. A- y* s1 r- u else{6 S6 Q( J' o. A: \6 `' E% i6 g, S if(indexg!=0) JustArtificial();/ N) H2 z" d8 @; ` T PrintResult();4 n/ C5 z' `& V7 L/ _; X return;: Q1 ^% V9 z: N, s L* v } if(Check(in))" K3 U c( {! ]7 S8 h {5 r, ^% ^- {" O/ f+ X+ a cout<<"No Delimition\n";+ V9 S, _# J! o% g return; } out=SearchOut(&temp,in);2 ?' _4 @; P5 g+ w, Z6 ~ Mto(in,temp); Be(temp,in);0 t# N; M% m; c1 |2 |1 M0 h/ X( j Achange(in,out); }0 t# _2 e9 C, u }
void main()- M S6 K' ^) Z | { int code[100];//输入符号标记 float b[100]; Input(b,code);//初始化# t! X/ w3 V6 X4 N) K7 M8 X: A# j Start(b,code);//标准化行 Simplix(); } P* R: o" n1 B# |, z
so well!
还有其他算法吗关于仿生算法的谢谢
有C語言的嗎?我要C語言的
谢谢,我正在找这个程序,终于找到了!
楼上的的确是位高手,这两天由于写论文要用到单纯形法的程序,就拿来用了,但是发现有些错误,没有结果或者得出的答案有问题,于是我仔细看了一下这个程序,将楼上的笔误,和一些其他的小错误改正如下,
注意: 我不是用纯 VC++ 我的输出函数用的是 printf (),这样可以动态观察结果输出,以便于修改,这个程序是我花了一天的时间改的,太长也太烦琐,我看的也不是很清楚,只对 限制条件是 <= 的情况进行了详细的察看,和修改,其他的情况就没有看了,程序中相应的部分有比较详细的注解,如果有需要可以和我联系,我们一起共同探讨。谢谢!QQ:116490942
#include<stdio.h>
#include<iostream.h>
#include<math.h>
float matrix[100][100],x[100];
int a[100];
int m,n,s,type;
int indexe,indexl,indexg;
/////////////////////////////////
void jckxj()//基础可行解
{
int i,j; //基础可行解即为 非基变量对应的x=b, 基变量对应的解为0
for(i=0;i<n;i++)
for(j=0;j<s;j++)
if(matrix[j]==1&&a[j]==1)
{
x[j]=matrix;
j=s;
}
for(i=0;i<s;i++)
if(a==0)x=0;
}
int rj()//基解矩阵
{
int i;
for(i=0;i<s;i++)
if(fabs(matrix[n])>=0.000001)
if(matrix[n]<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])
{
min=matrix[n];
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[in])>=0.000001&&maxl<matrix/matrix[in])
maxl=matrix/matrix[in];
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[in])>=0.000001&&(matrix/matrix[in]>=0)
&&min>matrix/matrix[in])
{
min=matrix/matrix[in];
*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[temp]=matrix[temp]/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[in]/matrix[temp][in];
if(i!=temp)
for(j=0;j<=s;j++)
matrix[j]=matrix[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(" %d ",k);
temp=k+1;
k=s;
}
for(j=0;j<=s;j++)
printf( " %.0f ",matrix[j] );
printf("\n");
}
printf("Rj\n");
for(j=0;j<=s;j++)
printf(" %.0f ",matrix[n][j] );
printf("\n");
}
////////////////////////
void InitPrint()
{
int i;
printf(" X ");
for(i=0;i<s;i++)
printf(" %d ",i);
printf(" b \n" );
printf(" " );
printf("\n" );
}
//////////////////
void Result()
{
int i;
printf( "(" );
for(i=0;i<s;i++)
printf( "%.0f",x );
printf( ")" );
if(type==1)
printf("\nZmax= %.0f\n" ,matrix[n] );
else printf("\nZmin=%.0f\n", matrix[n] );
}
//////////////////////
void PrintResult()
{
if(type==0)
printf("the Minimal: %.2f\n", matrix[n] );
else
printf("the Maximum: %.2f\n", matrix[n] );
}
////////////////////////////////
void Merge(float nget[][100],float nlet[][100],float net[][100],float b[])//合并
{
//置成我们需要的矩阵,最后一列置成0
// 1 2 1 0 0 0
// 4 0 0 1 0 0
// 0 4 0 0 1 0
//-2 -3 0 0 0 0
int i,j;
for(i=0;i<n;i++)
{
for(j=m;j<m+indexe;j++)
if(nget[j-m]!=-1)matrix[j]=0;
else matrix[j]=-1;
for(j=m+indexe;j<m+indexe+indexl;j++)
if(nlet[j-m-indexe]!=1)matrix[j]=0;
else matrix[j]=1;
for(j=m+indexe+indexl;j<s;j++)
if(net[j-m-indexe-indexl]!=1)matrix[j]=0;
else matrix[j]=1;
}
for(i=m;i<m+indexe+indexl;i++) //将目标函数中人工变量的系数补为0
matrix[n]=0;
for(i=m+indexe+indexl;i<s;i++)
matrix[n]=100; //置成M
for(i=0;i<n;i++) //把b[]的值赋给matrix
matrix=b;
matrix[n]=0;
}
///////////////////////////
void ProcessA()//初始a[] a[]是标记基变量,若为基变量则为0,若为非基变量则为1
{
int i;
for(i=0;i<m+indexe;i++)
a=0;
for(i=m+indexe;i<s;i++)
a=1;
}
////////////////////////////////
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 code 0:<= 1:= 2:>=\n";//输入b[]和限制符号 <= ,= ,>=
cin>>b>>code; //分别输入到b 和 code 中
cout<<"The 系数 \n"; //提示输入每个限制条件的系数
for(j=0;j<m;j++)
cin>>matrix[j];
}
cout<<"the type 0:Min 1:max\n";//输入要求是类型极大还是极小 0:Min 1:max
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[n];
if(type==1) //如果是求极大,把它转化为极小来做,系数全部反号
for(i=0;i<m;i++)
matrix[n]=-matrix[n];
}
//////////////////
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]==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++) //i =0 时置第一列为 1 0 0 i=1 时置第2列为 0 1 0
if(i!=row)c[vol]=0;
}
//////////////////////
void Start(float b[],int code[])
{
int i;
float nget[100][100],nlet[100][100],net[100][100];
indexe=indexl=indexg=0; //indexl 表示松弛变量数 indexg 表示人工变量数, indexe表示减去的松弛变量数
for(i=0;i<n;i++)
{
if(code==0) //如果是<=
{
nlet[indexl++]=1; //松弛变量数+1 且置成相应的标记
 
rocess(nlet,i,indexl-1);//传 net, 行号,indexl-1 过去
}
if(code==1)
{
net[indexg++]=1; //人工变量数+1且置成相应的标记
 
rocess(net,i,indexg-1); //将刚加入的列单位化
}
if(code==2)
{
net[indexg++]=1; //人工变量数+1 且置成相应的标记
nget[indexe++]=-1; //剩余变量数+1 且置成相应的标记
Process(net,i,indexg-1)
rocess(nlet,i,indexe-1);
}
}
s=indexe+indexl+indexg+m; //变量总个数
Merge(nget,nlet,net,b);
 
rocessA();
InitPrint();
Xartificial();
}
void Simplix()//单纯形法
{
int in,out,temp=0;
while(1)
{
jckxj();
 
rint();
Result();
if(!rj()) in=Min();
else
{
if(indexg!=0)
JustArtificial();
 
rintResult();
return;
}
if(Check(in))
{
cout<<"No Delimition\n";
return;
}
out=SearchOut(&temp,in);
Mto(in,temp);
Be(temp,in);
Achange(in,out);
}
}
void main()
{
int code[100];//输入符号标记
float b[100];
Input(b,code);//初始化
Start(b,code);//标准化行
Simplix();
}
/*模拟输入数据
max z=2 x1 + 3 x2
s.t {
x1 + 2 x2 <=8
4 x1 <=16
4 x2<=12
x1,x2>=0
}
2 3 8 0 1 2 16 0 4 0 12 0 0 4
*/
好
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |