QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 12591|回复: 25
打印 上一主题 下一主题

单纯形算法程序

[复制链接]
字体大小: 正常 放大
zhyi        

4

主题

2

听众

25

积分

升级  21.05%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-18 21:45 |只看该作者 |正序浏览
|招呼Ta 关注Ta
单纯形法程序,在VC++6.0 下测试通过! 8 O( n0 n- F6 }1 Q+ h1 g; e. B9 r" ]3 B$ N0 K4 _/ g | - z& A2 H/ M: Y& j$ g. s$ g

#include<iostream.h> / W. R& n: ^2 J2 ~. H& r/ n#include<math.h> ' X7 M B3 J2 }2 t$ |float matrix[100][100],x[100];7 Z8 v( x& m8 m! F+ }6 c9 A int a[100]; ! p% w6 W3 S7 i z. o2 _6 F) Kint m,n,s,type; U5 m/ g( [7 b/ @) y# m H) e int indexe,indexl,indexg; 0 }2 W3 l7 b6 O4 K$ y7 h: y/ {/////////////////////////////////% J2 K" N( X3 q; W void jckxj()//基础可行解 7 C8 v3 [/ l6 Q. l{ ) t; F" o. a) F2 _6 h) z int i,j; 4 b9 u/ [5 S2 x" S7 v5 n! L for(i=0;i<n;i++): f' s w D6 U9 W for(j=0;j<s;j++)0 T% ~5 L5 P7 m if(matrix[j]==1&&a[j]==1)+ m2 i8 o' N' ~" E9 q8 Q { , e# @# d! @$ t. `5 a; W W x[j]=matrix; $ z, w# B+ h' {- y2 d7 d6 k- T/ Q) R j=s; n% W9 v9 ^4 E$ u } 2 E0 P7 b5 \( ]- d for(i=0;i<s;i++)9 L' U/ P. `8 t- S: o/ [ if(a==0)x=0; * _/ l+ {# _+ h1 p( j$ y* ?) }) J}

; a5 _7 g# e# [0 M' q6 b

int rj()//基解矩阵 / A. m* P3 o' m4 J6 x( t{0 Y% G: } g4 j) M; [& _ int i; ; ?/ ^% O: q6 A$ r) Q for(i=0;i<s;i++)6 i# ^& v" d" m1 `& p if(fabs(matrix[n])>=0.000001)% L6 ^1 i4 {0 z5 _$ Q+ M$ C- u if(matrix[n]<0)return 0;6 h4 H9 E1 ^ ?0 H* N0 f( s, G return 1; - u- }4 b6 s$ B) f: O/ }8 b& }}& m3 e. x4 x9 Y! f( H( n int Min()//求最小的 3 g; y, Q2 z! m3 f{ 3 p8 d. r9 |4 ]; X int i,temp=0; ( S7 {; K2 h( `4 U# { float min=matrix[n][0]; . l7 D m4 G3 H! K9 |2 H for(i=1;i<s;i++); S( W- s# T* F, O if(min>matrix[n]) 5 B+ P. i% a, {, y$ _3 r. r {& [, k9 F5 i; U' R5 k' v) J min=matrix[n]; . Z" |+ v7 [- n temp=i; 3 s4 e9 H3 d1 u. P5 L4 @* A }/ e; ?) e* O6 R return temp; # V* i/ y* P% b}7 ~7 y/ k6 i; ~% N /////////////////////////////////' n# k5 J1 s0 ` void JustArtificial()//人工变量 6 H0 d; e! X6 n% D{ . L8 a. N& ]6 [6 ]1 K R$ w int i;$ H, u" @+ ~1 Z7 C for(i=m+indexe+indexl;i<s;i++)# a( J- C: T' Q1 |! s if(fabs(x)>=0.000001) 9 {% ]" z K% }& }3 `& Q { * k. H9 j5 J) | cout<<"NO Answer\n";, A' [. i" k# [1 F4 \7 R return; $ P; a; [; I. l( h }2 ]1 J, V4 t2 g7 U0 | }2 J" ~1 T6 i) o2 F; S ///////////////////// - K9 p2 R9 D% f }int Check(int in)//检验9 i+ k, v* z/ R1 b8 ^ { 4 t2 X" C, ?3 {5 @, j( U0 t: r6 U int i; , h5 F+ ^& q B5 A: k- d8 q float maxl=-1;7 I# ?& ?' S S" }8 N- y8 s5 } for(i=0;i<n;i++)1 I! D+ b6 f8 e/ T if(fabs(matrix[in])>=0.000001&&maxl<matrix/matrix[in]) ; A" L( v2 \5 x" j maxl=matrix/matrix[in]; 7 u" Q6 l! ~8 [+ }+ m- { if(maxl<0) 1 d- P$ k* E7 D! c7 N return 1;- H6 t1 X7 v4 R9 M- Q return 0;* o, p" [* {% g% h } ! A1 [; u( n6 w9 M7 Z0 @6 c9 uint SearchOut(int *temp,int in)//出基变量 1 u9 L- f8 c# n( c* i2 q{ & m5 e9 w5 M; t+ S9 F) P! ~6 y- [ int i;; y4 e: k! k# I3 g3 z A3 W$ L float min=10000;1 [7 V1 Z5 k: c u( \ for(i=0;i<n;i++)6 ?" @2 o/ T9 U$ H$ [- c% d if(fabs(matrix[in])>=0.000001&&(matrix/matrix[in]>=0): ~4 W$ D! J6 v& ] &&min>matrix/matrix[in])" v1 Q3 [3 T0 j8 D {* `# \- v7 _: W) s min=matrix/matrix[in];1 y/ N9 J% v- i/ }" |3 k *temp=i;( \- J" m( ~: z- p3 W } ; R" A# z1 @) p$ m0 H: q for(i=0;i<s;i++) % ?' E$ @/ W3 I4 \ if(a=1&&matrix[*temp]==1)# n1 w3 c2 }; x; \5 O3 Q2 [ return i;9 @& P5 m: A q/ U- k6 w/ ` } & H6 d; |* b) `+ T S1 m+ \/////////////////////////////////1 L) c. z' ~6 B void Mto(int in,int temp)7 i+ u. H- z" [ {6 ^9 F. z9 ?+ |7 ~3 P3 W3 e int i;9 S/ P/ B9 d1 ]5 C7 O8 i for(i=0;i<=s;i++) v0 k# T( S" q9 J2 U' Y if(i!=in) + d! U/ ^; Q1 L7 d4 n8 T: r( V matrix[temp]=matrix[temp]/matrix[temp][in];; v% ^8 \2 f0 d/ ` ? matrix[temp][in]=1;% y' f+ L# T# C } 3 J& V( e3 Y$ n/////////////////////////////+ b- ~/ y" _! L+ A4 [ void Be(int temp,int in)//初等变换5 }6 T% w$ o3 |4 a# Q' K J {$ v( n# h& v- p7 ^+ X8 \5 | int i,j; 6 q5 F# Z8 [+ \* c) C9 t7 s" O* S. E& ~( c float c; 2 m3 ?5 F0 H1 N* x" Y0 B. h for(i=0;i<=n;i++)% H! Z8 U1 P4 [$ r; ~ { 8 Z# c: L/ O! F c=matrix[in]/matrix[temp][in];2 ]- H) _+ w" ~; y if(i!=temp)( X& h5 b) z: W( P9 M7 N4 ~# w, X for(j=0;j<=s;j++) - M1 p/ X3 v8 q* ]) ~ matrix[j]=matrix[j]-matrix[temp][j]*c;9 L/ c& \ [0 L. K$ D$ M. d6 m% C* X } ; r& {" I0 u! f* g5 [} : i3 L, z+ v+ P) l2 _5 F+ C# r5 ~- B7 h//////////////////////////' M5 |5 a4 {! N! k% j" M0 J; M' N1 W void Achange(int in,int out)//出基入基转换9 O: K5 ^# h* c! a' l {2 d: k+ f/ }) t# s- u int temp=a[in];, B$ I; {1 l) B! g0 Y a[in]=a[out];: v+ s; `7 H3 z3 `5 p" _ a[out]=temp; 3 H) J. t' r6 v' u+ p4 F} / n, X* n5 W7 | E//////////////////////// 6 `3 |& L# I! J! m5 x2 p; Gvoid Print()' P3 ~6 a1 E7 U0 @, o9 A {5 v+ I/ o. k& O* ^ O int i,j,k,temp=0; & P7 p" a$ C+ \( K for(i=0;i<n;i++)9 _$ j @% Y& F {) i* b3 `$ c: ]$ c for(k=temp;k<s;k++)0 V9 f3 m6 w' y2 X9 o) q r2 R% e if(a[k]==1)( W, s# X* g2 ~* B { ! |" a1 |3 H% [% t) L9 G cout<<k; 6 Y9 q, K j4 w$ l temp=k+1; - w0 K/ s" r3 B$ c3 j& O* { k=s;) X& d( N5 d3 H/ U/ F5 o8 @ } & Q2 m4 [/ P2 C: p% I3 P% m for(j=0;j<=s;j++) . ] Z* {) z0 U4 c cout<<matrix[j]; 2 L6 r6 J1 L) k+ M9 N; z cout<<"\n";3 r/ V6 M( V" a2 s3 s! w } ' i0 q' O( G. t. S, K, k5 M cout<<"Rj";/ L/ g1 x6 @+ `$ @: z9 F" E for(j=0;j<=s;j++) ! f* D2 W1 z% _! L& C. X' p# s3 ? cout<<matrix[n][j]; 0 y- T, P" C% ^ cout<<"\n";! k* x$ `3 L, u1 ] }) V$ N4 x8 v4 _: B! N9 ^1 o //////////////////////// / | E) |; E6 P( q5 I. j Jvoid InitPrint()# y, A$ G d* o# { {8 Q( w% }' _! V. |7 J {$ G int i;4 m- Y9 u: K5 U& i. P cout<<"X"; ) e$ M+ k$ d1 f/ p4 n4 q for(i=0;i<s;i++)" {1 D6 W5 |& b cout<<i; * G" F' U' H" Q( |: A& P1 L cout<<"b\n";9 g1 f2 ?6 m( Q0 ?( _ cout<<" ";* `3 b$ H, o& @7 ]2 @* c* t cout<<"\n"; 5 g" d ~- O* [0 a) q5 \}7 R0 G+ Z7 N8 }) d; _ ////////////////// 5 s2 E0 n+ m8 V E2 D; {. cvoid Result() 1 d% Y3 a7 B4 c0 v" Z( h{9 f4 c% x) N# D1 O5 _+ h6 r int i; ' k3 [) R" f( e' P7 _3 _/ h cout<<"("; 0 P. `9 C$ a3 Q& M* H+ {3 C for(i=0;i<s;i++) : ?# w* X+ U) g! S' C. u cout<<x; 3 ^$ T+ @2 G! @% C; |' Y cout<<")"; ' m* W+ {2 d9 [4 m9 s if(type==1) * {4 J2 a3 X, a cout<<"Zmax="<<matrix[n]; ( m) [8 V& A6 t+ N W4 \ else cout<<"Zmin="<<matrix[n];7 `' l) o7 s% y4 z; @0 {* e }. [2 w. E$ {7 t //////////////////////& l9 Y! A) o N1 v3 M void PrintResult()1 e# t- [; }5 f0 h7 ~: Y: J3 T {' z; v6 [/ {+ V1 i if(type==0) . G5 N& B* K/ E) H5 S5 { cout<<"the Minimal:"<<matrix[n]; : k4 ?# R' W8 X( G/ h else cout<<"theMaximum:"<<matrix[n];. X; b7 T0 h5 B+ F0 F6 M }4 ]/ F' ^1 O9 _. x: Y8 M9 v8 Q ////////////////////////////////1 ~3 A a9 y0 y+ z3 A void Merge(float nget[][100],float nlet[][100],float net[][100],float b[])//合并- H) B1 W! F5 w {9 g g* t2 y! L6 M( G, k5 G int i,j;" e& W: g/ _1 j for(i=0;i<n;i++) ; }, d' E9 t' P3 ^# J! H3 S {& A' \ s1 o5 }" Y for(j=m;j<m+indexe;j++); o+ D% {5 Z" F if(nget[j-m]!=-1)matrix[j]=0; + Z V: `: y1 N! h2 e else matrix[j]=-1; # P7 G8 s0 Q a! s! _, H8 {- ~ for(j=m+indexe;j<m+indexe+indexl;j++)6 p! i V. e1 a# _ J if(nlet[j-m-indexe]!=1)matrix[j]=0;6 W0 O4 Z0 x7 A1 \# \0 e9 y9 x else matrix[j]=1; 3 Y/ {% r7 A! q for(j=m+indexe+indexl;j<s;j++)6 Z# k# v. b7 L9 p1 |, l; Z if(net[j-m-indexe-indexl]!=1)matrix[j]=0;. {# }0 F) w3 `! o* Q else matrix[j]=1;; _, v- t5 u) u/ D: ^* v } - `1 D& c5 ^* b0 z8 B" k2 | for(i=m;i<m+indexe+indexl;i++)8 G' Z% H7 o6 q' M9 T8 c matrix[n]=0; % _5 Y- a. G2 N" h for(i=m+indexe+indexl;i<s;i++)3 i3 U0 L* M6 _7 r: }; p5 J$ ^5 a matrix[n]=100; ; c" M2 E' r9 L8 M* C" d2 h matrix[n]=0; 6 Y3 S4 k; Q# E7 b}

. h* w9 p* @2 a0 M8 n$ t7 T/ j$ F7 T

///////////////////////////' @* o! r9 f( l& R6 j void ProcessA()//初始a[]6 {5 J9 b& v: d {; |4 _9 |, k6 `4 w ^% F; ~ int i;" k: c8 _# {+ X2 p for(i=0;i<m+indexe;i++) + `% n- ?6 t% u: e. G4 r# k a=0; + v1 w3 A7 j, ^ for(i=m+indexe;i<s;i++)2 i1 M% M/ K0 P; { a=1;: ]! x/ }- R7 k5 M4 X }

1 G1 @8 z1 k4 t" n$ a! p

//////////////////////////////// ; r8 r" a% t, ~0 A6 q9 Tvoid Input(float b[],int code[])6 H, _3 Y* L2 b- q3 E# T! i { , J, c3 c- u8 ?. } int i=0;int j=0; . _/ P- ], y6 z cout<<"The equator variable and Restrictor\n"; . {/ O' i- ^$ R9 _+ }( g cin>>m>>n; / d( Z7 o* m& N: E% g$ s E for(i=0;i<n;i++)$ m6 y) V5 M+ _( L, z) r* R { 6 j o/ ?9 f6 f. U O& L& O cout<<"Inputb[] and Restrictor code0:<=1 1:= 2:>=\n";* c2 C O4 H7 \: O1 `! W9 U cin>>b>>code; 9 u6 P' a) f3 a2 n! \6 @$ ~: q% O cout<<"The 系数 \n";$ G+ ^6 J! w0 R/ R" r, p. @- W for(i=0;j<m;j++)3 [, Y C# x5 X7 \ cin>>matrix[j];( r$ s" M) A, d3 L; z }5 C6 A; ^, P4 P. K' v cout<<"the type 0:Min 1:max\n"; 8 g, F, R9 V6 J/ C! b+ v+ V do{8 f! M* S9 h9 j) z1 d S2 K cin>>type;7 i3 g! K# {1 m" I6 }+ W3 t# E3 }* t5 A if(type!=0&&type!=1) 4 C8 a% b- Y2 R E) d cout<<"error,ReInput!\n"; & ^% g- Y) \6 n. a8 t }while(type!=0&&type!=1);; t" k1 w; Q. a0 M8 `0 q, m cout<<"the Z\n";. G o1 Z- i L" Z& r# p$ \: {3 e5 B" ~ for(i=0;i<m;i++)8 ?* }/ A0 v) l" m2 a cin>>matrix[n]; # s: C# U4 ~% n1 K if(type==1)5 S" A" X* Z- l. f+ T/ h) G d for(i=0;i<m;i++) & H% K/ R# K' L* X matrix[n]=-matrix[n]; 1 l1 J0 c0 s! ]3 O}

5 y/ O1 M9 v, U: R0 `& O

5 t1 U- X0 n' p0 {, L! I; q) N ////////////////// + \& d8 F. Q: g! v+ Gvoid Xartificial()//消去人工变量$ R8 W9 C6 N( Z& Z) r { 4 d+ O9 a( m" V int i,j,k; # j" Q' Z6 U/ \. S) h% \" Y& u if(indexg!=0)* c- ~6 t+ L+ i$ u# p( Q2 P {1 J K1 W+ y6 h. n; B0 z$ J3 M for(i=m+indexe+indexl;i<s;i++) 6 [- k' g" R" O' N2 F- T$ \% P { % ?, R, Z; I3 c, V; ?) z4 I' i for(j=0;j<n;j++) 4 n2 W* M8 w8 V if(matrix[j]==1)" L+ b, k3 m6 J! R4 a8 u0 [ {/ ^1 T/ W P' L5 U, ^3 J for(k=0;k<=s;k++) ; W+ L$ a3 l6 ]1 N- l% K( _$ s matrix[n][k]=matrix[n][k]-matrix[j][k]*100; # o" t+ w& n( j& A2 c j=n; - z: |8 x$ k# F, g& `0 J } " M: r2 I- T8 @ h, x5 \4 S8 S4 F4 @ } & Q( G c0 U0 H8 V e }2 h3 Q8 s, |) R" a* Z- _ }

6 d2 L2 Q+ C" N& i/ n; J: Q" x" C

////////////////////////////////////////////////* ~ v5 A. c7 M9 K2 c6 n" ~ void Process(float c[][100],int row,int vol) : O8 {: c- [& G# R$ o2 ^, z{8 F0 J3 E, D. B# {/ P7 U int i; ( H& J7 @7 v) v+ Z0 } for(i=0;i<n;i++) * w' a0 c& j0 a$ G if(i!=row)c[vol]=0; 7 [$ Z, c/ O/ B6 z" i* V} & i$ |& D- O! r* Q//////////////////////$ A' y( J! g3 ~5 P2 T void Start(float b[],int code[]) - `. [0 L$ U; Z& y& _! m{ 1 r/ ~ @ l3 x int i;) w9 N" Y) @. J; m w9 \0 s9 i float nget[100][100],nlet[100][100],net[100][100]; : T+ e! G: R, t$ t/ G: p indexe=indexl=indexg=0;$ ] V3 M3 Y x for(i=0;i<n;i++)* ]: x# Q9 K* W; v6 Y# d, b { ]6 ~( ~1 }; Q, ]% m& W if(code==0){nlet[indexl++]=1rocess(nlet,i,indexl-1);}8 H) c4 I/ z& l) N. \% H if(code==1){net[indexl++]=1rocess(net,i,indexg-1);} $ t+ C! A- w' ? E- O if(code==2){ + I) `& J7 w% I, C- | net[indexg++]=1;: \6 W: \9 ~( `+ k" i- K& X nget[indexe++]=-1;! }6 X; x T: k+ M( @! P) T; k Process(net,i,indexg-1)rocess(nlet,i,indexe-1);9 F( a+ F4 y" @2 w } 5 l1 i1 ?, \, v# O6 p) t } , m; f5 O- Z0 k; o$ g s=indexe+indexl+indexg+m; 6 g; r/ J* G5 y$ b2 c+ v Merge(nget,nlet,net,b);1 _. V& j& e$ w ProcessA();/ {5 p/ _' ?. u% l6 S( D2 I @/ a InitPrint();! d* f1 x/ p$ s2 ~ Xartificial();' E2 h3 U" t: w7 X8 ^; ~) i }

; P& l4 X. _* v

void Simplix()//单纯形法 , X/ ^: S3 F+ z/ l" h2 {% A$ {" _{6 m7 U- n# w) e0 m$ J8 a int in,out,temp=0;$ J# I2 ?$ |+ M* K) r* b1 N* V while(1) . E$ h: z* p- q- q3 [ {! {' G& M; r* a5 D jckxj();; w! E @. s4 l0 ]+ N Print();2 y6 R& r" s, \' r4 Z Result();" ^/ Z' ]7 V/ H if(!rj()) in=Min();# a2 h' b( H. [( k: G$ m else{6 M4 \0 [ H u if(indexg!=0) # c9 g( O* |3 N6 O7 |3 a JustArtificial();, v- s, Z% d9 O9 n8 Z. W- J PrintResult(); 3 |5 r' x6 K6 T1 l" ]; \. S return;+ |, h% ]% F3 `) ?% H }7 e# h) V$ L$ E) m; g) f% Z0 w if(Check(in))0 {& e4 x0 S2 y4 ?: U {( g; V: @, q6 W. G% R7 v cout<<"No Delimition\n"; 1 ~) L! n, r/ |3 t) ]- w. ` return; * l, `0 C* ?# P# @) u } 9 O2 I3 ^' U5 L5 ~ j out=SearchOut(&temp,in); / L$ y# Z6 Y( K! b3 [ Mto(in,temp); % q9 e5 H) A( F Be(temp,in); - q) `' j: k0 Q* K9 k+ n Achange(in,out); 0 g0 `' K0 ~6 G' B* B2 x/ M+ p9 c }1 G& i2 t u! A" T$ _$ [: o9 ~ }

& h7 H7 W5 x& A( f1 U/ [

void main()/ Z: B* a" h! U* T* E/ D { 1 z/ j8 W6 l5 e) K$ b int code[100];//输入符号标记" e1 c% X* P4 I: Y" v float b[100];1 k- _$ y; E' o Input(b,code);//初始化) y, F: d3 |7 B Start(b,code);//标准化行 # y& y. Z: d3 k* s Simplix(); 4 D, \9 U- t: [) l1 _) f} % w0 u+ D# a5 [

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
Kadyniost        

0

主题

4

听众

187

积分

升级  43.5%

该用户从未签到

回复

使用道具 举报

aruisi 实名认证       

5

主题

3

听众

2288

积分

升级  9.6%

  • TA的每日心情
    奋斗
    2013-12-6 19:59
  • 签到天数: 565 天

    [LV.9]以坛为家II

    新人进步奖

    群组数学建模

    群组大家

    群组Mathematica研究小组

    群组安徽赛区

    群组我行我数

    回复

    使用道具 举报

    jkkjk        

    481

    主题

    6

    听众

    52

    积分

    升级  49.47%

  • TA的每日心情
    开心
    2015-4-4 06:20
  • 签到天数: 8 天

    [LV.3]偶尔看看II

    新人进步奖

    回复

    使用道具 举报

    echo5183        

    0

    主题

    3

    听众

    24

    积分

    升级  20%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    pytff7        

    0

    主题

    2

    听众

    21

    积分

    升级  16.84%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    hnus31        

    0

    主题

    3

    听众

    22

    积分

    升级  17.89%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    999mmg        

    0

    主题

    3

    听众

    22

    积分

    升级  17.89%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    1

    主题

    0

    听众

    18

    积分

    升级  13.68%

    该用户从未签到

    新人进步奖

    楼上的的确是位高手,这两天由于写论文要用到单纯形法的程序,就拿来用了,但是发现有些错误,没有结果或者得出的答案有问题,于是我仔细看了一下这个程序,将楼上的笔误,和一些其他的小错误改正如下,
    注意: 我不是用纯 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
    */

    回复

    使用道具 举报

    chz0829        

    0

    主题

    3

    听众

    72

    积分

    升级  70.53%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-6-11 21:25 , Processed in 0.547664 second(s), 111 queries .

    回顶部