|
单纯形法程序,在VC++6.0 下测试通过!
; {( F' D! l7 R7 x. f% L# N8 m1 a5 W0 P! H( M) k x
& t7 t! O$ W' k7 W6 ^ #include<iostream.h>, ?/ E9 o4 T- {3 F1 e. G( `$ W
#include<math.h>% m2 ^- b+ d ^. u! M/ q( k; E
float matrix[100][100],x[100];
' g% h1 F0 ^" g* ~int a[100];+ \" q- \. ~; b. |* A4 Y) I
int m,n,s,type;5 v; |8 d! P, F' N. C
int indexe,indexl,indexg;+ L' R: v1 g& p. Y$ `' S
/////////////////////////////////
* I9 x+ D" o+ }3 I @void jckxj()//基础可行解
, E4 i; G ?1 V4 d6 D$ c* y{) k" I5 Q ]7 a J7 j
int i,j;
( u0 | Z3 \8 S4 L; H" d2 H for(i=0;i<n;i++) u( P, `0 E" {. t, b* R
for(j=0;j<s;j++)( V- a* U$ S- E. T; \* v \9 ]
if(matrix[j]==1&&a[j]==1)
3 L( F7 z! G, X( p+ q j4 l: j {
$ _/ c/ l% X, @ x[j]=matrix;
0 Z4 e }. w5 W" z( r; V j=s;
" L# `, m. O- [. W" H7 e1 W: } }
( G- ]1 ?& {4 [/ V, W for(i=0;i<s;i++)5 T8 p; Z u. t6 K: {- S6 n! ?9 _
if(a==0)x=0;
4 `9 x. R; S# @9 y5 s7 U* k} * e; q1 F7 F8 x3 k8 d
int rj()//基解矩阵
1 [, O3 x; `. b, f, n0 R8 y{, L: z7 |2 w5 c1 s" e
int i;( \: ]: R+ o8 Z8 W7 y
for(i=0;i<s;i++)$ l/ ]# D' ~" x/ x
if(fabs(matrix[n])>=0.000001)
& U* R, H' T* i X6 g% E if(matrix[n]<0)return 0;
9 t: c9 C2 t( |' a6 f- ? return 1;3 Z7 {# j3 x) g" Y6 |
}/ [3 y8 M2 G, _
int Min()//求最小的
: p( x) S9 Z3 G! u$ \{ E2 \/ _; J$ d
int i,temp=0;
% e! C/ A5 _# R# h float min=matrix[n][0];
4 y' {4 U/ c% Y$ G* E' D for(i=1;i<s;i++)) E& g4 t! ?$ i; n0 N
if(min>matrix[n])! f$ m( R; x* X* x! w f, J. f
{
6 s/ o9 l& T1 [" ~ min=matrix[n];
; m* K$ f0 a( A4 c* E: Y temp=i;
- l/ X& }% V2 a6 M& w" \# B }% i! _: u; X: u5 v/ A/ E
return temp;/ O! a- q% u- z! W6 _) m
}* U4 R. R* |- h! p
/////////////////////////////////* @) _6 `! x$ l* r% N
void JustArtificial()//人工变量- ?9 a' F" K) S% D( o
{, M- E! C0 h# m, |) S0 d- Z
int i;2 t" T) i8 F8 T) V+ D: l1 M
for(i=m+indexe+indexl;i<s;i++)
" ?$ v/ g* n* @+ R/ z1 S- C if(fabs(x)>=0.000001)
: |" ~. Y$ j7 {- u {
$ N/ T, w9 `: ?2 N! R& r8 v cout<<"NO Answer\n";* W( F) x7 R, I' e0 d* a7 }
return;
: U, t' A! p4 ?+ ]+ x# ?0 H9 z }
# L7 v- z% n2 _0 U* L}4 d% i0 k5 f3 q$ B4 O' }8 ~; A! o/ u
/////////////////////
& w4 N7 m9 F3 R% c$ p( o% T2 Yint Check(int in)//检验4 C, B; f$ a! f- ~
{
# F1 K& e- g. H9 j int i;+ W& i L6 { W3 i2 B, R# z1 a
float maxl=-1;
: m6 F, c. o6 T$ ~ for(i=0;i<n;i++)2 \' t, o9 \: |* D6 r1 |
if(fabs(matrix[in])>=0.000001&&maxl<matrix/matrix[in])
/ W% ]( g9 z7 p, N: R maxl=matrix/matrix[in];
$ D; q1 w8 ?8 S2 J" m/ P3 ?% r+ C if(maxl<0)
. W+ f, U1 {3 m; u! Z; _" v return 1;
2 C/ V% ?* r/ v0 e8 D X return 0;/ L/ F4 I: w% h
}. s& B2 a8 X) ^' C+ U
int SearchOut(int *temp,int in)//出基变量/ L$ J0 h6 N H) Z' c3 b
{7 [; z5 k1 q4 A9 m
int i;* A' ~. v* T( B( V+ _
float min=10000;
0 }/ Y3 V0 F! X3 w' l; F for(i=0;i<n;i++)
9 e1 F3 K! g3 y1 }/ C if(fabs(matrix[in])>=0.000001&&(matrix/matrix[in]>=0)
5 l( r1 _* M! k' i+ B( Z; ` &&min>matrix/matrix[in])
" A9 X9 o) `, x; Y {
4 I1 Y% q q& s2 ] min=matrix/matrix[in];
" b3 a4 }* S$ \7 U! e *temp=i;( ?' G0 e( g; h1 r* D* c9 ?
}
! B8 _7 [4 @* Y! j for(i=0;i<s;i++)! @4 D! c, f, T- p! \, X7 t4 G
if(a=1&&matrix[*temp]==1)
: b' ^. v( \( w/ n" \6 r return i;8 y5 X1 R" f- w1 ]- o
}
" N' t' r- D0 v) b) ^% {/////////////////////////////////; ~$ n5 y& U% g$ ]2 n) i
void Mto(int in,int temp)
L; z4 I* ~& B0 B D{
' f' Y) e# W R2 Y% S0 J/ y int i;, B" S( P# c6 D1 n& H1 e
for(i=0;i<=s;i++)' |4 G. H6 q, |, o
if(i!=in)
1 f# c# ]) V: y6 d matrix[temp]=matrix[temp]/matrix[temp][in];
, ?, d- N3 n$ M9 i5 A matrix[temp][in]=1;
- t* f- z* l. g4 c8 X6 F% }}
% f/ Y1 _$ ^4 c8 ~ O( {7 x2 H/////////////////////////////# r `- s$ y9 L% \
void Be(int temp,int in)//初等变换
- ?+ V. ?3 p2 J' R+ h. H0 w+ Q{
6 F# Q* G% w6 b& k int i,j;# X y5 C$ B( v# N! r/ a
float c;
& L# O( c6 J4 x# U! X for(i=0;i<=n;i++)
8 s( P+ {! u9 Q1 N; W+ v {+ x a* J* E! n5 y' Y
c=matrix[in]/matrix[temp][in];
6 }* ^" X8 V1 O/ j. f4 U; `) T/ W if(i!=temp)
/ [( F+ L4 f4 c for(j=0;j<=s;j++)
. H- n3 V2 g4 k0 z R matrix[j]=matrix[j]-matrix[temp][j]*c;& o y1 f+ o V
}' @% G, M. j# u6 B( S' m9 T3 H u
}
+ Y. n+ p" F. |7 `6 [3 z( w) X( R* S F//////////////////////////
' p- u) L! @9 T3 C; {void Achange(int in,int out)//出基入基转换
6 J+ L2 d4 M4 b( o+ s* M0 u# V{
4 P5 |- o6 u" f, V6 B6 }$ J' a int temp=a[in];
' `- I0 J8 `+ H- R a[in]=a[out];
6 a! r4 [6 e3 Q! Q+ T a[out]=temp;
3 A6 U+ t& b2 _9 P}
8 N2 x3 U7 l+ m////////////////////////
. E( R0 a+ v8 s! j4 f0 M& tvoid Print()
% f6 g1 t0 l+ C9 l$ V{
" U$ P3 H, ^4 z" t( h! @7 v: b) L int i,j,k,temp=0;* a4 N' U: R, G! R, P" ~7 O9 N
for(i=0;i<n;i++)) Z( B: G/ H7 X; b0 p& ]
{
6 ^$ c4 {7 K c- m! ~2 _5 q9 m: S for(k=temp;k<s;k++)2 c2 o6 f! u$ Y* D' S
if(a[k]==1)
9 b S ~: H7 T7 Z# v {1 J& F' L$ q) i2 v
cout<<k;
9 u* @; `5 |1 s9 z1 J- _ temp=k+1;
9 Q) h; s4 J2 l( \ o; p% J k=s;) _& i" O/ K( ]
}
! C$ j: [4 o; G' B for(j=0;j<=s;j++)4 _) ?% W9 R* i
cout<<matrix[j];
& f" T' s9 w7 u* ?# R; s cout<<"\n";+ t$ t& {- ]0 _. A# M
}9 H- G2 E1 W T; b: u
cout<<"Rj";
% A/ u. e O4 u for(j=0;j<=s;j++)9 R A6 w. o, o2 k
cout<<matrix[n][j];
* w2 S9 T( h F# ~. v+ _8 n cout<<"\n";
. Z* R+ A s' M' q}
8 F6 @" F# Z* d- t1 b0 l////////////////////////) G! H1 h, Q5 E
void InitPrint()
) w5 n7 L! c! x& D{# c, z# O2 M* R6 {
int i;2 }0 F9 O# e' Z# J
cout<<"X";+ A; `5 N) o# o0 o v) q
for(i=0;i<s;i++)6 m8 M& x5 C9 c; J- x( T# |
cout<<i;
# l( `/ F. M* |3 Q4 Y( e cout<<"b\n";
& W4 z) I. A T8 o* c/ d5 k$ f" K cout<<" ";. m5 k& l9 \ M- s2 ~
cout<<"\n";
) t' D) X2 K6 [$ F& q3 {8 S}
( W6 d s- Z2 G. I% v//////////////////! y& {% p6 E8 H" W2 x8 }# i
void Result()
4 i+ p# w2 Z; n: W{
; m, { }6 R1 x; U; H int i;) Y8 D+ f8 G+ R2 p6 y
cout<<"(";
* i8 E' i& B3 w1 w7 a for(i=0;i<s;i++)" C6 r- j% b# W, c
cout<<x; f# k( S, K* }2 J9 L: j7 X
cout<<")";
2 P, k" u$ P s6 C# N if(type==1)8 t7 A) H V; P% P
cout<<"Zmax="<<matrix[n];
# p; A- |- X& _( a @5 w, h& r' C else cout<<"Zmin="<<matrix[n];2 C+ ^5 P; b9 |- H( N
}" f% K! O8 G+ C" }0 [
//////////////////////
$ a& l8 R' N( S: s3 j. avoid PrintResult()" b' b7 `$ T2 t: {
{
. K4 i: g& X! d0 I1 o1 R if(type==0)
+ @, ^2 f8 Q" W2 X" @6 c! K cout<<"the Minimal:"<<matrix[n];2 O5 T/ Q0 s9 h% s9 O
else cout<<"theMaximum:"<<matrix[n];
9 Y- F) s" E2 Z}( Q) b4 p; I' I
////////////////////////////////
8 \$ S7 J- o) T2 ]void Merge(float nget[][100],float nlet[][100],float net[][100],float b[])//合并+ @1 r" g+ D. L! X' ^
{- V- X2 H8 v5 v4 l3 T. J0 D7 U
int i,j;
0 j& o ^4 x$ r4 B- r for(i=0;i<n;i++)
' g% k# E. `& F& A {! u& b4 R3 S) ]- @7 p7 i
for(j=m;j<m+indexe;j++)
, {0 L: V# r$ s& G. ~! G) ? if(nget[j-m]!=-1)matrix[j]=0;. r- d* ~; r/ G! C* J% N5 @% F
else matrix[j]=-1;1 N8 _* z2 c: X+ `+ n9 n
for(j=m+indexe;j<m+indexe+indexl;j++)9 T% g1 f y w: Z) f( k* H
if(nlet[j-m-indexe]!=1)matrix[j]=0;
+ S; D6 y. H. F% F- X$ h. s+ k else matrix[j]=1;
( v7 z4 q0 z# @. r for(j=m+indexe+indexl;j<s;j++)
2 M. k. L: ~* P( a% f+ V. V1 }. ? if(net[j-m-indexe-indexl]!=1)matrix[j]=0;
; d. }, N( R. m3 @2 X else matrix[j]=1;
; j' v% u9 R2 \ }
- X- Q7 |& H2 E8 N4 A for(i=m;i<m+indexe+indexl;i++)) Q# _( R# |/ B
matrix[n]=0;3 o& D" V1 E( [/ f6 [% f
for(i=m+indexe+indexl;i<s;i++)
9 A2 z6 R N/ N6 O, Z/ I matrix[n]=100;# @. X9 t9 }6 U% o4 ?' e6 _
matrix[n]=0;
) n; u$ L1 J: w} 4 B8 G- @/ Q5 l' k( f: D
///////////////////////////7 K5 t3 W* d& c% i: O5 Y: ?" _
void ProcessA()//初始a[]
6 P4 Q' @* a2 z, x{; \6 L; h9 {& @- J, L: H
int i;
& T1 s5 I4 G! u) m% Y for(i=0;i<m+indexe;i++)7 E+ ~* u% Y) c- T0 G' Q
a=0;
) g% o" S0 k8 c1 o& i% o+ L for(i=m+indexe;i<s;i++)9 O3 q+ ^( M! J3 n$ W
a=1;7 X! U& \. l4 {% O5 u6 q- y
} - Z/ R" U# J* Y- l
////////////////////////////////4 z4 ?. Y) ?+ t8 }! b! s7 @
void Input(float b[],int code[])
1 j. k/ z4 d# S2 k; L{
* U2 C* ]$ _8 R: M# r! o int i=0;int j=0;2 g j: N- O+ M; M$ |8 ~; T
cout<<"The equator variable and Restrictor\n";, X! A6 {0 H# c# }
cin>>m>>n;
, l. Y! z. [% w5 ^ L- i- a for(i=0;i<n;i++)
" L+ e* F- K9 l. e. [ {+ x/ [1 s9 z2 Y S9 Y# n2 @
cout<<"Inputb[] and Restrictor code0:<=1 1:= 2:>=\n";
. m; l1 _0 c# H% }, ? cin>>b>>code;
# m7 v8 p) t5 @0 K cout<<"The 系数 \n";
* ^, {. c6 n0 T4 F' T1 Q for(i=0;j<m;j++): z- n+ \# R; B
cin>>matrix[j];% J) a' X. x' I; m; Q3 L
}; P. @6 J% [, f' V8 G4 H+ C
cout<<"the type 0:Min 1:max\n";: |5 j, `: H0 v' f6 G/ d7 v( _: N ?7 a+ P
do{7 Z! i9 R. @5 k8 b9 J
cin>>type;( A: q: K$ Y. {* S$ D
if(type!=0&&type!=1)
. T+ a- T$ Q* f7 a& ^ cout<<"error,ReInput!\n";
* M+ x$ W3 i( C, D0 q- T$ S1 w }while(type!=0&&type!=1);! s2 e0 ]% A9 O0 d
cout<<"the Z\n";
' T9 z$ \# f) d for(i=0;i<m;i++)
( I. i( k7 ?2 t6 | cin>>matrix[n];
( e& e$ n1 U/ s( |7 X! m if(type==1)
# E2 i) H6 B9 w( L8 A6 M for(i=0;i<m;i++)! Y$ s8 \' o$ l& [; @4 u; c
matrix[n]=-matrix[n];
+ `& ]9 L: V( S2 F. Q} % ~& }0 _% I* `. @7 }
+ W. Z( X$ O$ i0 Q////////////////// / D; A5 p' n6 Q/ u
void Xartificial()//消去人工变量
& l/ {1 b( y) _" u9 n# G; n{4 |; ~2 {& g% o6 K$ `, M
int i,j,k;! L. J6 V0 t9 A) I
if(indexg!=0): [5 g8 ?, B8 T. V
{
$ O( F5 E6 p; D for(i=m+indexe+indexl;i<s;i++)* j$ d+ A% E+ G
{
. Q) Z8 _' L9 l0 L for(j=0;j<n;j++)% ?) Y- ]6 a. p% j
if(matrix[j]==1)7 l0 ~, z$ r/ z# n) ] e+ P
{( C% M m `4 h2 R1 ]# ?
for(k=0;k<=s;k++)6 ^ S6 E" }5 B, t/ X8 n
matrix[n][k]=matrix[n][k]-matrix[j][k]*100;
/ \8 ?$ r* T% v* u; F" F j=n;5 E! S0 M% P8 {7 q! Q7 w# W
}
) E+ y1 [ s ^5 V. l: {. s& K8 \ }
% c- g% q, D) ?& c" @ }
% S' u3 \6 \4 e3 o# l9 T* F' j7 c+ x/ u}
* D u8 L7 I7 X# R////////////////////////////////////////////////
) U& O K. f4 C* S, ?0 A, Zvoid Process(float c[][100],int row,int vol)7 b. u8 M9 F5 }! N
{: X2 k# Z' G- N* _
int i;( U1 Y) D" B$ c
for(i=0;i<n;i++)) Y5 d) Z) H/ ~+ K; o# c4 C+ t% n, l
if(i!=row)c[vol]=0;, E" B( k- x* i4 Z4 ?' L
}
4 b" \' k5 I* e1 ~/////////////////////// K2 y1 t, m+ J! Z1 z
void Start(float b[],int code[])
, J+ ~& z8 X. _9 E% W{% m) O7 ]% z' z. D$ @* k
int i;" `- V& r7 I. o' t! p
float nget[100][100],nlet[100][100],net[100][100];
$ p: J) U% w; Q& p; _8 R& F1 C indexe=indexl=indexg=0;
: r+ F. e1 Q2 T& W for(i=0;i<n;i++)
+ j! c3 h; V( @* ^ {
+ }/ J* l7 g" Q8 K6 L7 F if(code==0){nlet[indexl++]=1 rocess(nlet,i,indexl-1);}4 N& o# O- e# r! f# J1 x
if(code==1){net[indexl++]=1 rocess(net,i,indexg-1);}
6 H; v) w/ f2 L if(code==2){
@: \- e1 H, ?$ Z net[indexg++]=1;# |& H5 W7 x, a9 G. g
nget[indexe++]=-1;
) p& I: l. \$ m) K Process(net,i,indexg-1) rocess(nlet,i,indexe-1);# q4 T, {6 Y7 x( I: k# _
}, Z9 {8 M) J6 b) S; {6 m- z) V6 f
}
5 V4 ? m% D( l, A, y. h B4 o+ C s=indexe+indexl+indexg+m;, C2 D, N/ Q6 R* I5 R
Merge(nget,nlet,net,b);) a5 J) u0 s. R; p: ]/ \
ProcessA();- _5 ~) c3 b; G" Q; R5 l3 q3 J
InitPrint();7 G0 ~1 o% H7 f
Xartificial();5 S+ m$ m, N1 ^
} 8 j( I1 I/ j* x2 H8 l; d2 k7 `
void Simplix()//单纯形法
9 T A& f+ W$ o2 d2 R/ C" N: c{
( u$ P5 a. }3 C$ f% i int in,out,temp=0;
/ U1 W R' _8 M& f while(1). B0 x; B6 b; B- E$ B+ [
{2 k# h0 z. [7 Q% V6 L* y- E" L
jckxj();
% A& T/ [; K9 D( J Print();1 d2 a8 |6 v: d! r
Result();
6 K* e+ F3 l* l" e/ H6 Q if(!rj()) in=Min();) V* s5 R$ x3 Q8 i3 P
else{9 e( d3 ~: L6 U$ s
if(indexg!=0)* V8 c+ U' g: t
JustArtificial();9 X6 j+ {- v* n6 Q0 ]% T6 Y$ W4 n8 T
PrintResult();
; P% A: t' m: _! T: g& W: ^4 P return;
+ n2 p4 u% j/ R7 E) T6 i5 e. C }. G4 y+ C; u! S R" V
if(Check(in))
; B/ s( A5 D I) p5 D0 R0 \ {( V Y8 Q7 J; b& M' ^+ t
cout<<"No Delimition\n";- Y) T, A7 t* Y8 _: c' d
return;
9 N d. M+ W( i }( Y: Q1 c. ^- d6 H- E7 r
out=SearchOut(&temp,in);
0 E) v x; V+ }' ~- Y- x Mto(in,temp);
2 C9 M! v. j- E" a7 j8 X: o7 _. m Be(temp,in);
$ k6 k i" m7 S Achange(in,out);1 l3 c) O' Q9 t& r- B+ G2 A
}
) S- s* r' ^1 r4 B; ^* z} 4 q) @2 u2 W" ?- @7 {3 p
void main()" N( c: W1 [* D2 s( {7 w
{) `6 c: Z$ N7 J; E: P! M/ z
int code[100];//输入符号标记8 p! w" n8 q# t% K
float b[100];
- s% o# S& V8 U' M0 h Input(b,code);//初始化2 w. @4 _- s' \8 L x8 r
Start(b,code);//标准化行% P5 U+ P% s. Y1 j# v
Simplix();
2 k/ b7 r, o# O- K}
! m( u( _* ]5 i6 r$ C( S4 q) v |