单纯形法程序,在VC++6.0 下测试通过!
# a" O S9 j4 R; i- P- K8 Y$ Q
4 k; d5 R+ ~* {- M/ N/ r4 h' q# f3 T* D, R9 A5 c
#include<iostream.h>6 z. s7 @& u9 l2 U
#include<math.h>
# z( b! v0 S, t8 y# b+ Z( bfloat matrix[100][100],x[100];7 X& t. P+ g T. z$ T% c
int a[100];- P7 v% v$ O/ q/ P( a
int m,n,s,type;
( N/ P V G( Y7 _( z, g8 Lint indexe,indexl,indexg;
( J: z( U: L0 I% c/////////////////////////////////
/ G; p6 d5 p w# {, x0 ~void jckxj()//基础可行解
1 z2 B5 W. B, h g7 z. ^{. }. O5 ~6 D& N7 I; }) a
int i,j;7 G' \" \, x0 G4 `! w
for(i=0;i<n;i++)7 c4 C0 x0 y: f2 }
for(j=0;j<s;j++)8 ]& C/ |1 C- h* I
if(matrix[j]==1&&a[j]==1)
3 d1 J, L; J. I1 r {! j8 ~2 o* {1 e0 h9 q
x[j]=matrix;
2 V5 ?5 i. A4 L4 E5 l( T, e7 t5 Q f j=s;7 S2 B2 ^ r! K1 V2 M% f6 C
}
' X( a2 M, C/ S6 i1 a1 F for(i=0;i<s;i++)
/ ?1 h( J* I9 `% E' i) e% f) U if(a==0)x=0;) ?' ]* }0 m4 l2 C
} 0 V* L7 L, D/ l( g
int rj()//基解矩阵
; k$ p# c: K: `8 E# X{ Q. w t& Y. z, p8 }$ y8 I
int i;
: ~- E7 D r( U for(i=0;i<s;i++)
. D/ A1 r0 L" d7 B8 ?! v* K: Z* I if(fabs(matrix[n])>=0.000001)
3 m; e9 K4 A" I3 @ s2 N if(matrix[n]<0)return 0;" V7 p! T; ]( v, O* f7 O4 J
return 1;
0 }+ z' I8 Y a: n, f @5 V" [8 |}
% w+ z5 e) L+ I0 ?6 Kint Min()//求最小的" S/ _ _& l1 `! h
{, V" ]) m- E6 P& |$ z' t3 g8 r
int i,temp=0;
+ f7 |+ s+ S3 y1 \- v4 k* m float min=matrix[n][0];
/ K& W* e6 D1 d% n4 \ for(i=1;i<s;i++)
, P$ } @# ^! m5 F if(min>matrix[n])
9 a8 ^) ~1 D6 N3 y) C {( g0 v* p" a* a5 y8 ~& _- k" ^# }
min=matrix[n];: }( H+ d9 v# I! O; Q
temp=i;3 r. t1 T8 \0 b- z5 N; |( M
}
4 d' q% {9 w: o return temp;
% C, S1 J* {, M' L& D9 C; u}
) C2 c4 r# ~( x/////////////////////////////////+ a, J1 F5 b) _+ t6 H3 b$ g& [+ C
void JustArtificial()//人工变量$ {$ @9 C5 k" q! A* p/ P
{
4 D" l2 n9 \9 r$ Q int i;/ N* ?; i4 Z# L: C, g
for(i=m+indexe+indexl;i<s;i++)
, @3 s- f/ z2 d if(fabs(x)>=0.000001)
/ [* h% P; t, P) Z" b' ` {# B4 Q$ M$ F \
cout<<"NO Answer\n";7 O- w2 E$ g6 m( j4 M
return;! [# d. S( a1 f' N; v; u9 Y
}3 ^5 \' _' N8 I$ d9 B( i
}/ j! I9 N; M, {5 K6 h
/////////////////////
$ F, A9 T7 \6 _: Q A: l$ z( Nint Check(int in)//检验
1 X+ |8 O+ D4 J# @{1 o0 F( H8 m% u
int i;
+ G8 w' ~* S0 S) y/ K float maxl=-1;
! u! `9 S) ]0 u3 u for(i=0;i<n;i++)1 |8 g0 }' u6 l; o; [3 i. t6 D; S/ S
if(fabs(matrix[in])>=0.000001&&maxl<matrix/matrix[in])* J9 A2 V- q% Y. f
maxl=matrix/matrix[in];
- l* D" `8 |+ h# U9 g: w if(maxl<0)! R F8 h; L6 c' L4 J# W0 g4 m
return 1;4 k, j" } x1 \3 A6 y. I
return 0;
5 Q; J& s0 s9 c. w}
' g) ]# H7 T! }- vint SearchOut(int *temp,int in)//出基变量% G6 T y" A6 b, P: W
{
# u% [; [2 b3 X& {0 w, L) u int i;# T7 }8 J0 k; B/ \
float min=10000;
8 V" \: ~+ B4 z7 D for(i=0;i<n;i++)
4 s& C) R$ ~6 @, f7 o* \ if(fabs(matrix[in])>=0.000001&&(matrix/matrix[in]>=0)# a: @" P/ ~4 ?4 z
&&min>matrix/matrix[in])
0 x. i5 V0 l, Z4 e {
% q$ u/ s- D0 C3 N! r c. V min=matrix/matrix[in];
4 c3 |8 c% s% ^ *temp=i;2 c N W0 Q: b2 R& R
}
3 f* S2 m _3 L% t& a, c/ V for(i=0;i<s;i++)
l5 L8 e4 r4 ^1 g if(a=1&&matrix[*temp]==1)5 H9 ^) l% l; }& V
return i;
7 ~$ \$ Y/ A; t* }( m4 Q2 {* |, O4 g}
6 U: q: d$ j) p7 @" L) m/////////////////////////////////
" y) o$ _( v* @* z4 m+ @, F/ ]void Mto(int in,int temp)
9 @1 P/ W- D! }5 h$ T9 x. w6 ]{' o2 J8 Q7 d) w4 ]* g
int i;
. k) |& ]" j) Q; i% N3 u$ ?! A/ k for(i=0;i<=s;i++)
4 q. O8 g! T. z( `8 M1 o8 }* K |' X) A if(i!=in)6 @+ F5 x/ z% e0 w: g# ~
matrix[temp]=matrix[temp]/matrix[temp][in];
$ o. g9 ]6 U; K, ] matrix[temp][in]=1;! [6 I% @) y U3 S# j; Q3 W
}9 `# C: N$ `3 J2 _2 T
/////////////////////////////
& A7 a* C" x- e% wvoid Be(int temp,int in)//初等变换! X7 R3 B7 p) n
{1 ? F! R0 H' Y: p# c9 d2 B( q
int i,j;- [/ z3 \7 p. i9 R& R
float c;
" [9 b" o/ n. s5 h5 e for(i=0;i<=n;i++)( C( X3 C# |9 |6 o/ j/ ], N
{
* w9 X+ }2 ~# Y! p3 [3 q c=matrix[in]/matrix[temp][in];, Z- k( c- F _$ K
if(i!=temp)
y+ Z& H! a+ A8 ?7 C; Q6 F. r- b for(j=0;j<=s;j++)
: T+ @6 K1 Z1 a' T) ^5 M8 h( M0 z8 A matrix[j]=matrix[j]-matrix[temp][j]*c;
Z5 Q8 Y3 b' W- E }8 n* ^; `/ E4 M2 F
}
/ e* w: K! D( ?4 g//////////////////////////$ @' `; X4 Q8 Q2 I$ `( b
void Achange(int in,int out)//出基入基转换
/ I5 g4 B, N8 _4 [{3 F- j3 s8 M; i8 `" H$ D
int temp=a[in];
. _) d8 E- e+ b* H" g7 I a[in]=a[out];, w0 P) Y( z; J* r
a[out]=temp;! }; ]4 X' e- P
}$ b1 A# n6 Z1 t7 T8 \$ G
////////////////////////
. H5 J: U8 Q2 n5 Jvoid Print()$ W* i) @# C( \
{, _ m5 `( l6 ]. d. `
int i,j,k,temp=0;" @3 u' G1 z1 p+ h6 P! k
for(i=0;i<n;i++): `) j/ c; q# _
{6 L$ u1 ^8 _0 C
for(k=temp;k<s;k++)
: Z5 N* U9 N# f! E; |5 r if(a[k]==1)
) N7 a* r7 ]4 O( I5 v {. q6 e K# m/ w! n
cout<<k;# S' c. c3 m( c0 b# v! Q: Z
temp=k+1;
% E" K$ S( O9 L+ p k=s;! I+ P* R; \+ t
}
# S' k6 b( l; B) E for(j=0;j<=s;j++)
) C& J$ a6 U! ^" ^2 n* N+ F cout<<matrix[j];
7 y$ \4 n2 ?; q# \; E4 ~$ A cout<<"\n";
3 e4 Z4 q5 ~4 u9 s, k1 v5 f# S2 ^ }& {# W% ^ d O: J2 R
cout<<"Rj";
+ O! c, o- U4 z% d for(j=0;j<=s;j++)4 h% S3 L; ?4 r+ l5 B- [
cout<<matrix[n][j];
7 H% @/ i$ Y' L9 w cout<<"\n";5 N5 \& H% n+ k$ n
}
* b( c) l5 f7 P////////////////////////
- _( I+ J# x9 b. S+ Hvoid InitPrint()3 a% A1 I, F+ l3 `8 _/ B( t2 N6 w8 |
{2 g& Q/ G* X' }5 r
int i;
$ O- t$ a4 @- s cout<<"X";
6 d9 g& K% ^4 i( y& n for(i=0;i<s;i++)
5 X; C5 O/ F& a+ [2 m2 M6 ] cout<<i;* i% G6 W% x% O j
cout<<"b\n";
- l& F% M* E* B- L' k& C cout<<" ";
( {7 D) C2 `1 \9 ^7 e j cout<<"\n";7 C1 J% ? N" p
}0 M9 i( A+ u. x0 k4 g
//////////////////; F* S' @3 S' E/ h
void Result()
8 p' D% y. ^; u{ @2 G( D, l9 T: D( T1 D5 `
int i;
* u% X8 M1 N4 D1 _ cout<<"(";/ E h5 i4 Z+ a+ Z
for(i=0;i<s;i++)& o2 v, K5 j7 p x) Y# L
cout<<x;
+ M# j# t0 K' z9 C9 K$ T0 l7 j" L% n cout<<")";
: S! b& w" G* l4 }8 Q7 r$ K if(type==1)$ R: @% Z: {% t- J6 x( H8 A2 A& f
cout<<"Zmax="<<matrix[n];
) p1 S8 ?9 ^3 n) M$ z$ j else cout<<"Zmin="<<matrix[n];/ ?" Q1 i( u3 Q: ^* L
}
: b9 } v, A7 c1 _9 a, X" W- _9 v3 l//////////////////////
3 C6 ~9 T3 \' j3 Y5 ?! ovoid PrintResult()0 v0 X r. f1 U! h0 N' ?
{% y! @3 a! ]( P8 k
if(type==0)7 f% P7 u7 M5 X. o' H7 l
cout<<"the Minimal:"<<matrix[n];+ h( b! H! Z4 P" Q
else cout<<"theMaximum:"<<matrix[n];4 x" s, U9 B* I' h6 V
}
6 y5 R4 B! d3 N$ I- G' a////////////////////////////////8 m/ j, O) c( u1 |' K( ^, ~0 a
void Merge(float nget[][100],float nlet[][100],float net[][100],float b[])//合并
* p9 e7 n3 w8 [6 A) u$ [6 G{1 P" b3 ^1 E5 x# q3 Z3 M
int i,j;( @# O0 L7 j' ]* F3 q1 r/ Q
for(i=0;i<n;i++)( ?( ^" M7 O9 S3 Y, q1 s
{( y+ [' @0 s; G$ ~% O
for(j=m;j<m+indexe;j++)! X$ z" p9 ?2 b& W3 B
if(nget[j-m]!=-1)matrix[j]=0;
# k! T8 \: Z+ S4 E/ L# {* Z3 B else matrix[j]=-1;
$ X3 I9 V$ k' n* p7 w. s U" G for(j=m+indexe;j<m+indexe+indexl;j++)
* M+ @9 g6 h1 R$ r) `2 u8 `. W) K if(nlet[j-m-indexe]!=1)matrix[j]=0;
6 f) H& n9 L/ ` v; e" r v else matrix[j]=1;
2 P% N2 l* f# @ for(j=m+indexe+indexl;j<s;j++)
! P% M* |* o! W if(net[j-m-indexe-indexl]!=1)matrix[j]=0;
9 X. a% U6 ]; d) ^ else matrix[j]=1;
2 e" n9 |6 @0 N ~7 r% H% p' Q+ B }
' [6 a8 J! s9 c* V& j% P2 ?' l for(i=m;i<m+indexe+indexl;i++)
. A# H4 n) N# w- `; d matrix[n]=0;
+ G, K* W/ c- r6 @' Y2 q for(i=m+indexe+indexl;i<s;i++)5 f- z, d2 ]0 d: s+ U- q. _' O
matrix[n]=100;
3 d @& J K- X5 C matrix[n]=0;
" e% x8 X1 e1 h1 Y- Y3 i} ; Q0 e( t$ r& n$ n# z" G1 d
///////////////////////////
6 k' h. t; A( e0 d# x4 Kvoid ProcessA()//初始a[]
+ P5 ]# J3 q6 S. n{
3 D* z& }1 Y( M% q int i;
. I, Q3 E2 ~' V+ \1 X) W/ w for(i=0;i<m+indexe;i++)# ~' F% _& [* H* Q, j+ X
a=0;& [: U! q0 d( l3 G9 n, ^" a
for(i=m+indexe;i<s;i++)
4 J- p' V, e9 a( U1 d5 e a=1;
3 ~8 [6 L0 u% \3 u8 w}
2 k9 d' F% e5 k6 u' |////////////////////////////////1 c% V8 S- f4 |" e( [: r
void Input(float b[],int code[])
3 U4 a/ V9 V' x7 J" l{
7 A8 D& B- o9 Q0 B% d+ C' K1 p int i=0;int j=0;
2 t( I+ [' b1 l' `/ p3 T) m/ ^9 r cout<<"The equator variable and Restrictor\n";7 e& K; c+ H% ?) Z3 u" W7 d- f
cin>>m>>n;
" v! w& c+ i& U0 T for(i=0;i<n;i++)4 s- M" L8 ^+ R9 J9 m0 J5 u
{; c; @: V9 F. p$ H2 d
cout<<"Inputb[] and Restrictor code0:<=1 1:= 2:>=\n";
, o# r# ` L5 `6 I8 {- ? cin>>b>>code;+ H# d/ h7 [ p S# E% l/ U
cout<<"The 系数 \n";" D, |" O# [- v m3 G/ t, s
for(i=0;j<m;j++)
7 v0 \7 X# U, D& X) e/ V; H: F cin>>matrix[j];' k/ D9 M/ W4 e$ l) i- J2 X
}6 {( {8 b; w' q8 t! L. Q
cout<<"the type 0:Min 1:max\n";# j4 A/ [" G9 i3 E
do{& i6 L) J0 [+ P# L5 M# \
cin>>type;
/ o! E. S$ l7 x) B r0 J' o if(type!=0&&type!=1) r5 M7 T. A1 R5 v# l
cout<<"error,ReInput!\n";
4 o- M& T, I8 W2 w5 a }while(type!=0&&type!=1);
3 f* c' G/ M! c5 ^& F0 _9 A# E cout<<"the Z\n";, F, p& E! w: |" q: b- g
for(i=0;i<m;i++)# m. c) M% Q! J$ A5 E
cin>>matrix[n];' U& B( r4 k8 ~) [4 Z9 x5 ~# x
if(type==1)
& H3 p$ P2 F+ Q for(i=0;i<m;i++)
! D7 V5 Y3 U7 J3 B+ ~ matrix[n]=-matrix[n];
8 [' W( P$ L3 `% y0 F( z/ q3 ]}
d: [3 p4 `4 ~6 Q* ~2 I" Y
- l8 n) p" A L4 e//////////////////
* Q2 e$ a% M7 H) C( q5 lvoid Xartificial()//消去人工变量) P& D- N6 d1 P8 M4 N" F. p
{
x8 P* C! d0 w5 ^ int i,j,k;
+ x3 l4 |2 q' ~3 k2 [6 C! { if(indexg!=0)
' ]: E/ p/ h& r/ @6 G {
7 x" Z' {: Q( S* [ for(i=m+indexe+indexl;i<s;i++)
, h# f$ K) p! ^; p, ]7 f) H$ w" W {
9 d v+ A e& p5 L0 ~" |% q1 M for(j=0;j<n;j++)+ e( K+ ^7 J% m( A* r+ q+ w
if(matrix[j]==1)* {+ E, `0 m, r* {( a! _7 E" I
{
; ?( A& D5 q# Z+ X7 a) P, J$ J for(k=0;k<=s;k++). i; I6 M8 u, X+ c4 ~2 \/ U% I
matrix[n][k]=matrix[n][k]-matrix[j][k]*100;1 b# d ` l1 T
j=n;" B) r/ I6 w/ Y7 H' C% B6 Y2 g
}: R: ~) Q( S, N! }# W% `6 r. w" b, M
}4 P: Q% ~) n- b8 @7 d* c6 X, N8 z' N1 N
}( P7 X; b& y. Y
} ' I2 e/ v4 ^. z8 c/ c3 z. ^; |
////////////////////////////////////////////////' I8 h( E1 _6 Q; ~! k
void Process(float c[][100],int row,int vol)2 k' ?( {7 ?9 a5 u {+ s }
{
0 J+ r5 y, @% O; M; B3 P int i;1 C3 W o$ Q7 b) j
for(i=0;i<n;i++)
. {8 C$ q- j8 P; q6 ] if(i!=row)c[vol]=0;3 q* A8 }! m9 ~
}
. x! u" T& m' X4 p" D: C//////////////////////& m+ T9 A# x! J1 N
void Start(float b[],int code[])
9 s& U' v+ r* z4 L) X8 e{6 |) H5 V5 y- F/ t0 Y
int i;& j3 r6 R8 |0 S! L1 D2 d2 i% @
float nget[100][100],nlet[100][100],net[100][100];
- b: S5 \" l/ ~( e5 m indexe=indexl=indexg=0;
# `! K3 v: G$ Q for(i=0;i<n;i++)! S. ~4 y+ O+ T! C/ y& y
{
8 |) f8 T$ t% `: L' J if(code==0){nlet[indexl++]=1 rocess(nlet,i,indexl-1);}
5 s' y$ ?8 O1 r4 t0 e$ L# ?1 } if(code==1){net[indexl++]=1 rocess(net,i,indexg-1);}
% R! i1 N0 n7 W if(code==2){
G7 t) b4 {4 z$ F5 P1 X4 u, ]0 z net[indexg++]=1;
" ]7 A: t6 U3 e- L) w4 p8 ?9 w nget[indexe++]=-1;
/ m' X9 e5 P2 t/ t& V) S9 r Process(net,i,indexg-1) rocess(nlet,i,indexe-1);/ N6 U( x7 A' C" a' i) t% y
}
) U( ]5 b$ A( R$ @6 g }' W4 b* d2 ?2 f3 g( j! J
s=indexe+indexl+indexg+m;& z1 X3 V/ T3 g
Merge(nget,nlet,net,b);. l% A' C' |. _! v6 M& q) S1 T
ProcessA();
$ s5 s* B$ C, G- [ InitPrint();
5 ^) G& d+ Q$ ?5 f% F" m/ o% R; Y Xartificial();
8 f& N+ T: C' s1 j' [! ^' K& X8 Y}
7 R, s- R9 N$ ovoid Simplix()//单纯形法& d% m- L& U; I8 p8 k0 Q" p! V
{
( c0 N( W3 q+ {6 j int in,out,temp=0;1 H* w: M8 i, l0 F
while(1)
& u8 P& N2 \8 t7 l! ~; b) [ {
' |; M, ]$ h; X( Q9 G jckxj();
" [( g- x7 ` n, w! g7 T P7 r o$ H Print();
( n$ O; ?+ ^/ O* q Result();
$ \2 U7 A0 b% V1 `2 y if(!rj()) in=Min();
: y" w/ V. ^7 q0 E2 N$ W0 Z else{
4 `: L8 v! Y$ u if(indexg!=0)! B0 X+ W3 `+ R7 {0 H; _) \
JustArtificial();9 w( S& J [7 ^
PrintResult();. f2 b3 a7 l# @5 d4 p3 Q
return;
5 A5 g r) M7 `$ J' w: t2 J }
9 x m- T: q$ W& c, j4 U if(Check(in))1 c6 z9 o" X7 R. j8 t0 ?, R4 M5 l
{. Y0 ?. E% w |
cout<<"No Delimition\n";! B0 A) u5 M! L8 L9 s
return;
8 Y/ @" p8 K' I2 r6 O0 S }
# }; s7 B: O8 {( e! L# m" H( K* k4 Y out=SearchOut(&temp,in);2 h* [ j% T& ]) A/ ~/ w$ W
Mto(in,temp);
- G3 u P* ^* o+ E+ f: K Be(temp,in);
) ?2 T. |' G+ L9 h# S* g9 z% h Achange(in,out);
8 ]6 G \5 a$ Z9 G4 f }- }' w) E3 R+ t, a
}
) X, F% U3 S& x. Y( }; t" avoid main()
) K* x4 |$ T( E' X& ?{
; y) p' d9 I& ~; r int code[100];//输入符号标记8 N7 W& H, g9 t( J) |, X
float b[100];
! D+ m* L+ N3 ^( K$ V }1 p5 q% E Input(b,code);//初始化
- I, {% U- d* w& g* @ \1 |$ }) S' n Start(b,code);//标准化行
3 U' ~0 n- a' G9 O L; b Simplix(); Z$ M2 n2 T# l
}
3 c' V# m8 N3 L4 I3 O |