#include<iostream.h>
#include<math.h>
float matrix[100][100],x[100];
int a[100];
int m,n,s,type;3 d8 J& g' s# z! g, j
int indexe,indexl,indexg;5 A% z6 p4 Y f
/////////////////////////////////
void jckxj()//基础可行解
{' q2 p0 u7 F' E/ S" O
int i,j;4 W. j. @/ Q, f9 x
for(i=0;i<n;i++)1 L% u1 l3 e, F/ b$ i$ U0 s
for(j=0;j<s;j++)$ ]3 ?* |' ?4 P$ \+ W" z* P' n
if(matrix[j]==1&&a[j]==1)% K1 q; D6 A* B9 W7 ^% I$ m# O
{0 n8 O, d: i3 q! e! W' P( J
x[j]=matrix;% c2 D- p6 A6 i# m
j=s;. s* { G: a# S" i/ x' H
}
for(i=0;i<s;i++)( U0 y: z2 ? o/ F/ p0 t' p
if(a==0)x=0;
}
int rj()//基解矩阵
{1 k5 m: Z# z8 M+ U
int i;
for(i=0;i<s;i++)
if(fabs(matrix[n])>=0.000001)
if(matrix[n]<0)return 0;
return 1;' g! i0 U: f! N" w Y
}" C, `" g' R. O$ O8 Z0 r0 c
int Min()//求最小的1 o3 U! M1 A; Q- l6 h- d$ @
{/ l1 z$ w b- d, G5 E% I! B
int i,temp=0;( D: P3 U' n, x, R
float min=matrix[n][0];0 b- f7 `9 n. l1 H; k+ f9 B
for(i=1;i<s;i++); K9 U- z, ?& U( ]7 |0 x! d
if(min>matrix[n])$ M' L, R1 T1 j/ @
{/ ~* i4 H; l( i0 T& {4 J- ^8 A
min=matrix[n];
temp=i;
}
return temp;
}
/////////////////////////////////
void JustArtificial()//人工变量 f1 a2 d3 Q0 G- f& K5 R0 \
{; L5 s4 H$ u! N6 K3 e/ m
int i;
for(i=m+indexe+indexl;i<s;i++)
if(fabs(x)>=0.000001)
{
cout<<"NO Answer\n";: r: [( U3 f) s, ]0 }
return;
}; F2 \8 W0 ?! V" D
}8 M2 ?1 m3 C/ S, X( `
/////////////////////, x; v3 {- b; d" q9 e% U
int Check(int in)//检验( y/ T8 H; r& f+ \' o: p4 d
{& A$ F& b8 E W
int i;) q" i! S6 P2 N: `( ]# b. Q
float maxl=-1;
for(i=0;i<n;i++)" _- ^' x( _& O. }$ T0 e; H
if(fabs(matrix[in])>=0.000001&&maxl<matrix/matrix[in]) r* J$ p8 H/ l* h: c
maxl=matrix/matrix[in];9 l1 {& J5 m& Q$ I3 Q. E: O
if(maxl<0)
return 1;' C$ C4 R- z+ z& ~
return 0;0 a6 m% F5 j7 P9 p, `1 H
}! v3 j5 }# s% a/ }0 a- N
int SearchOut(int *temp,int in)//出基变量
{! C& Z a. V; v0 y* \6 m% F& R
int i;& C# g& D$ ~$ Q7 |3 p! P
float min=10000;
for(i=0;i<n;i++)* T8 Y: n7 m; C7 g; b7 B
if(fabs(matrix[in])>=0.000001&&(matrix/matrix[in]>=0): d( H V9 s# Y( }
&&min>matrix/matrix[in]) @* Z; e" v: k$ p
{ p! ^) C- M& U7 e/ n
min=matrix/matrix[in];5 N6 `9 t6 m3 \. P8 \! e Y M+ }
*temp=i;9 T% d7 B) h: R" p
}
for(i=0;i<s;i++): [4 [, y/ r: P+ @+ o7 Y9 V& C
if(a=1&&matrix[*temp]==1)
return i;( I! K: Q0 @- f5 }
}- u' z1 W# H7 L2 e6 b& R \
/////////////////////////////////
void Mto(int in,int temp)
{5 [, I' a) r' H, `8 ~- I. m' I/ Q
int i;
for(i=0;i<=s;i++)3 G, U5 K7 M* r) U. ?
if(i!=in)4 E$ S6 t- B. c8 u+ {2 Z* r4 V8 E
matrix[temp]=matrix[temp]/matrix[temp][in];7 D/ O7 \& e5 q; F9 b! y4 _
matrix[temp][in]=1;/ b+ ]! R" [- a
}
/////////////////////////////
void Be(int temp,int in)//初等变换* R* S# k( g w/ Q. ]8 b4 x" J
{
int i,j;
float c;
for(i=0;i<=n;i++)
{- k- g; M2 ?2 G) S1 }
c=matrix[in]/matrix[temp][in];# o1 G: A# J8 A2 V: O
if(i!=temp)
for(j=0;j<=s;j++)
matrix[j]=matrix[j]-matrix[temp][j]*c;
}" X3 b+ z$ J$ D, ^
}
//////////////////////////. o5 ?# X3 q) d) `5 {* O
void Achange(int in,int out)//出基入基转换
{
int temp=a[in];
a[in]=a[out];
a[out]=temp;
}
////////////////////////+ x! _% M# h; h$ b4 G$ v0 y S% X
void Print()
{) J8 Q1 c6 U5 K0 q; m+ [
int i,j,k,temp=0;7 ~' |9 z/ n3 J; D& N, \
for(i=0;i<n;i++)3 {5 g/ k \" p
{" v: R, t0 c9 ^5 }# t# F0 l) B
for(k=temp;k<s;k++)
if(a[k]==1)
{
cout<<k;
temp=k+1;
k=s;) D- K. n$ y t0 s7 `1 e5 x/ G
}
for(j=0;j<=s;j++)/ ?4 O- }5 k/ W- `+ h( \9 A- w
cout<<matrix[j];
cout<<"\n";
}* P3 e; \# z3 J7 T1 p8 |
cout<<"Rj";$ y3 Q# _7 x# ^9 l5 W
for(j=0;j<=s;j++)
cout<<matrix[n][j];
cout<<"\n";
}
////////////////////////' P/ }& _: l# R' X$ I
void InitPrint()( t. n/ D& a+ B# R6 [- a. t% k3 A
{. u& u* p% W/ s [2 A ~
int i;
cout<<"X";+ T6 [) `: T! x. A- |3 h
for(i=0;i<s;i++)
cout<<i;+ U( E; e0 i4 f7 V) a% R; g
cout<<"b\n";5 x/ ?) _3 |) Y0 C. }& Y
cout<<" ";
cout<<"\n";
}
//////////////////* K8 @1 T& D' Q4 T' d
void Result()
{$ a8 X+ @* n2 z0 N
int i;# A' Q% p) t4 G. D, ^
cout<<"(";
for(i=0;i<s;i++)0 k m# C4 u6 F# w9 |7 \% O- I8 p' j
cout<<x;
cout<<")";( m! `/ y" [3 s) t! F! R4 ~+ b1 g' V6 _
if(type==1)
cout<<"Zmax="<<matrix[n];
else cout<<"Zmin="<<matrix[n];: @0 o1 W3 v; W- Q! T2 H
}
//////////////////////
void PrintResult()
{' Q5 F2 ?5 d, D$ X2 u1 A: ~
if(type==0)
cout<<"the Minimal:"<<matrix[n];
else cout<<"theMaximum:"<<matrix[n];# v v0 h2 y9 `1 E- n7 g
}4 O, O5 T: @) D
////////////////////////////////" b( b' s* L+ _
void Merge(float nget[][100],float nlet[][100],float net[][100],float b[])//合并5 B, n8 i S2 g' T
{
int i,j;
for(i=0;i<n;i++); T' O9 A5 M7 ?. P
{
for(j=m;j<m+indexe;j++)
if(nget[j-m]!=-1)matrix[j]=0;' m# M* K6 g9 V$ t c
else matrix[j]=-1;
for(j=m+indexe;j<m+indexe+indexl;j++) z" H( ^" } e
if(nlet[j-m-indexe]!=1)matrix[j]=0;0 B+ f0 o7 f# @" I
else matrix[j]=1;
for(j=m+indexe+indexl;j<s;j++)& W, u" s+ |# C e. F+ A( w; _
if(net[j-m-indexe-indexl]!=1)matrix[j]=0;
else matrix[j]=1;
}- A% v6 f. Y) N5 E5 U1 y4 C( L
for(i=m;i<m+indexe+indexl;i++)+ g3 U' F6 W& v# T
matrix[n]=0;
for(i=m+indexe+indexl;i<s;i++)9 L) `2 j8 x( W3 C- x
matrix[n]=100;- c- N$ h! K6 M) T0 P
matrix[n]=0;3 ~0 w, |- P8 R: T( O
}
///////////////////////////, z K: }$ }( v: \ void ProcessA()//初始a[] { int i; for(i=0;i<m+indexe;i++) a=0; for(i=m+indexe;i<s;i++)% `. J$ r: w9 I a=1;3 R3 i+ R4 m) Y. ~7 i7 _9 B }
6 r I; F3 u5 O& v0 G////////////////////////////////) P& Z D: [1 ~- H* d& r void Input(float b[],int code[]) {& K& u. ]+ l3 ] \ int i=0;int j=0;1 t. w* c/ _& n4 S' C- X: W cout<<"The equator variable and Restrictor\n"; cin>>m>>n; for(i=0;i<n;i++) {/ d9 J& S0 l! `2 c+ P$ @- g7 [9 A cout<<"Inputb[] and Restrictor code0:<=1 1:= 2:>=\n";; E x8 B6 b: b+ g! D cin>>b>>code;) l" `. a4 Z# c, Z, z cout<<"The 系数 \n"; for(i=0;j<m;j++)' j# O9 ]; D9 I+ `+ F cin>>matrix[j];: ?: f5 \! p/ \ }" s( |+ h7 X2 f cout<<"the type 0:Min 1:max\n";! _2 J0 u' B1 {$ d do{1 i4 ^6 S& A* x4 P cin>>type;+ e9 w5 p+ d; X7 K, F3 e; o! X if(type!=0&&type!=1) cout<<"error,ReInput!\n"; }while(type!=0&&type!=1);. J" o1 K) _) u cout<<"the Z\n";" s4 d" c& D! Y2 o2 W ~ m for(i=0;i<m;i++) cin>>matrix[n]; if(type==1)3 n& \1 k$ {, b( m9 ^( ? for(i=0;i<m;i++) matrix[n]=-matrix[n];8 b' _0 m# Q1 M5 K) y }
////////////////// void Xartificial()//消去人工变量 { int i,j,k; if(indexg!=0)5 v+ W! v0 ^/ U" Q# y {) Z; {8 ^: Q d5 ]; m W7 { for(i=m+indexe+indexl;i<s;i++)9 n; E) i1 l$ F& ^* u' G { for(j=0;j<n;j++) if(matrix[j]==1)' z7 r! M8 T; `# z {3 z2 E0 g7 i# I E for(k=0;k<=s;k++)# F+ a5 W+ N2 H( i) f matrix[n][k]=matrix[n][k]-matrix[j][k]*100; j=n; }9 w$ {8 w: c2 k2 l9 ^1 _ }' G6 A# L" f3 X. z! ?3 M$ o* o }) L, {' z4 P/ V* ^1 q: Y }
////////////////////////////////////////////////
void Process(float c[][100],int row,int vol)
{
int i;
for(i=0;i<n;i++)- T& }$ f) d# w8 O+ f, O
if(i!=row)c[vol]=0;
}5 b7 }2 K9 _% C. U+ ]. D$ u! }. l
//////////////////////; w! h; Z% U7 z4 w+ b! V; k
void Start(float b[],int code[]) A Y! F+ C- j: @) e. n- n
{
int i;5 P& I. C/ i5 P* Y* D7 c
float nget[100][100],nlet[100][100],net[100][100];/ D. ~: \* C$ S9 c3 P. w
indexe=indexl=indexg=0;& d" M% W! o3 a% ^( G5 `
for(i=0;i<n;i++)9 n7 s+ a! N8 F6 L8 _ a% J# R
{+ e A- c7 I1 \8 I$ R7 d
if(code==0){nlet[indexl++]=1
rocess(nlet,i,indexl-1);}4 H) }4 I5 s* H/ Z
if(code==1){net[indexl++]=1
rocess(net,i,indexg-1);}+ ]# K& q! @. K. O* |9 M. X) P& a
if(code==2){% I8 o# X% `- ?: j, U! E
net[indexg++]=1;
nget[indexe++]=-1;1 I3 r% v$ Y) D2 k2 H
Process(net,i,indexg-1)
rocess(nlet,i,indexe-1);
}
}- S* W, O ?2 M# t! B
s=indexe+indexl+indexg+m;
Merge(nget,nlet,net,b);" x$ C1 \: U9 P0 z
ProcessA();
InitPrint();# ^& H1 Q% J- b
Xartificial();7 W3 a: ~. z. K8 g- a+ t: u) R W
}
void Simplix()//单纯形法9 R6 X( x7 h- {. K2 y0 Y; q {2 ?, _5 `- P$ z6 c int in,out,temp=0; while(1) { jckxj(); Print();, C1 C7 r- c9 C) P: W Result(); if(!rj()) in=Min(); else{1 Y" w( S1 l, B3 h+ W if(indexg!=0) JustArtificial();1 r4 A F. X9 G7 c PrintResult(); return;+ w u+ N' b e: Q8 C }# k i) a. j! D, _7 o. Y1 l3 O if(Check(in))9 x/ A# p* h( C8 y5 A9 K {0 `2 ?2 |5 M7 H; j/ G cout<<"No Delimition\n";' [- N! `9 R6 M3 `% h6 R+ j return; }* n: N1 C; Q3 j# ] out=SearchOut(&temp,in);3 e O, Y5 L) s+ X6 G( p! E+ v- S Mto(in,temp); Be(temp,in); Achange(in,out); } }
void main() {2 D; h: G. M7 w+ ] int code[100];//输入符号标记( p u' w& T0 ~5 a float b[100]; Input(b,code);//初始化" b) E5 c4 C, i# X- H4 v1 @# ~ Start(b,code);//标准化行 Simplix();# H2 _- o7 e; |' n }
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 |