QQ登录

只需要一步,快速开始

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

单纯形算法程序

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

4

主题

2

听众

25

积分

升级  21.05%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-4-18 21:45 |只看该作者 |正序浏览
|招呼Ta 关注Ta
单纯形法程序,在VC++6.0 下测试通过! 0 ^0 J) j7 [+ F4 I% ?- X, U, n0 w ; N! S5 O/ e ]% Q) o/ a 7 q4 K( e0 q1 D! `

#include<iostream.h>3 i: J# x; B8 h- ?6 E #include<math.h>! ^3 j( K) {8 z b float matrix[100][100],x[100];3 m7 U; L+ N4 | int a[100];" X& D ]) J% x+ A k int m,n,s,type;" G9 ~$ R5 ?6 r4 I6 ] int indexe,indexl,indexg; 1 C4 r) z7 d S, u M1 s+ R///////////////////////////////// 4 E" H3 A5 U" Z. v8 [' _( wvoid jckxj()//基础可行解8 f: m8 v3 m, Q7 W# r5 @ {0 Q% T$ W7 r4 V int i,j; - V# m- T7 T2 y( V for(i=0;i<n;i++) 5 e3 N$ v; F4 [2 z for(j=0;j<s;j++) - Q! @# z- l; [. d* G if(matrix[j]==1&&a[j]==1) + z9 S$ O1 `% p { + S8 W( K" x" L* d! H6 a x[j]=matrix; 1 l0 z" i6 n# w2 g' y' \1 h1 O j=s;4 H5 p/ D4 @: I% e" F) o& z }0 S' Z; ^+ v p+ f4 Q) V1 ~ for(i=0;i<s;i++)8 N7 T0 B8 w& N. k& v$ M5 H if(a==0)x=0; 7 @; p0 |. M# [0 o3 f}

. M6 q& d* y' Q, ~3 g

int rj()//基解矩阵 * W) r$ o8 i. [1 `/ s8 c# l. _) U- r{2 o2 O' k1 r3 ~; O, X# b int i;6 N1 x1 L ^) ~6 I: N for(i=0;i<s;i++) g7 S# @8 f+ M* f; k* m7 z y if(fabs(matrix[n])>=0.000001) , l6 v; X# g1 a5 c8 o4 j' s$ J if(matrix[n]<0)return 0;4 z$ u- s: a0 Y" m2 m" h return 1;) d( q7 F `/ u" e6 T } / H3 M, R6 d8 \! Y pint Min()//求最小的. J! G, i* v9 B# @$ b6 B1 \ {1 p9 M4 a' o J8 ^0 F int i,temp=0;2 ^/ r t5 p }7 ~ o5 V8 L float min=matrix[n][0]; 3 I* A9 T* Z M; j& Z for(i=1;i<s;i++)* Z0 {# p& y( l; F, s' T if(min>matrix[n])3 A. F" A: @6 O( f+ _ _ { . a1 [7 G% s# r, b' C min=matrix[n]; 2 u) ?0 n$ f( r temp=i; ; ]( ~7 v8 D6 z b9 `8 S1 ` }" p8 q& ^) {5 L) B3 ? return temp; + H' E, g! R( E( Q9 Z7 R# J}+ |" p' b- ]7 m; N /////////////////////////////////4 i; d3 v, b; [$ r! p void JustArtificial()//人工变量" m$ p# L- c) L8 J" m1 j {, c- d% s3 m" Y9 Q int i; ) K8 {7 ~3 V, e9 J for(i=m+indexe+indexl;i<s;i++) " C# Y) C) w! Y if(fabs(x)>=0.000001) 6 s5 C. @9 W; A) f" | { 3 G: F+ U2 u3 B$ O cout<<"NO Answer\n";* {' A* _) J( Z: E return; # I# |8 _5 v, Q8 V! N: j+ `4 \$ ` } * r4 q( U$ Q" [& A} ; Y- g- S& T/ Z0 F" q% ]0 o/////////////////////8 u/ i' I W A/ {+ H2 }5 g- X+ o int Check(int in)//检验5 ^! ]0 i+ y: ]8 L$ [ {5 G0 O" M% ^) f% \+ S1 `* Z/ @1 l0 X int i; 5 N) C" ]) M7 m z" s- ^; h8 Y float maxl=-1;) M; z7 X7 r6 Y. L$ _( T# s for(i=0;i<n;i++) ; W) H% ^' ^6 J3 x: Z if(fabs(matrix[in])>=0.000001&&maxl<matrix/matrix[in])# G: c) B& G3 {+ X) r, H maxl=matrix/matrix[in]; 5 \0 l3 l6 C) a+ D! T7 D/ P if(maxl<0), C: R7 H$ _- i& A2 s. |" s3 V return 1;/ T0 f: ^ x* Q2 n7 c8 {$ g return 0; 2 f9 d9 C+ y8 ^# J3 S5 S/ H} " j5 V& I6 Z' O. a- C: M+ ^6 fint SearchOut(int *temp,int in)//出基变量2 Q" J( P- h: Q# l1 d* r { ) X- F. }6 j8 }. x6 ^ int i;/ ?- s4 G% }" d9 H float min=10000;. h+ b% a! P% n) q( ?. V for(i=0;i<n;i++) 4 f- @ P5 {3 Z r if(fabs(matrix[in])>=0.000001&&(matrix/matrix[in]>=0)+ j, M {/ P- N &&min>matrix/matrix[in])1 L, {. Q3 \3 z { ' ^- V1 [* }2 n% ?' t$ w g! q9 s2 L min=matrix/matrix[in]; * W, E+ l. x' @+ F I8 U8 H3 g *temp=i;2 P4 X z3 [: e y0 u5 K } 0 C# \! W5 r- w* I1 q for(i=0;i<s;i++)) U' `8 f! @; ` @. [ if(a=1&&matrix[*temp]==1) 8 Q3 q& G, ~9 U4 {; c) p! Z return i;( G1 h( \- o: L. j( \4 t3 Y } % z: T9 \( ~" ] M9 [) Q( u/////////////////////////////////& x) s0 Y, x9 o( R+ m void Mto(int in,int temp) L+ T& W' x6 O" I) R! |{ 7 X0 E4 `1 q# d+ l3 h int i;! F. g/ W3 w) H/ U* t for(i=0;i<=s;i++)& W p8 L% [& E; r+ Y if(i!=in)9 I7 L6 n% [3 @. r. G/ Z matrix[temp]=matrix[temp]/matrix[temp][in]; ' Z$ B7 t3 A0 i' ? u matrix[temp][in]=1;+ v* C" L( l( ? } & E* u5 Y( E/ b/////////////////////////////& h( }4 m# f9 V/ n void Be(int temp,int in)//初等变换* P- V9 d0 C; v- I) F* L3 P {: [' P2 q6 Z* E S int i,j;4 j" g$ l% u9 ]. | float c; $ x5 h( `4 ?! C! z4 k for(i=0;i<=n;i++) * M+ s6 U, S- H: V. G7 ?, b3 W# ~ { 7 O1 F8 r' j. w- T9 q c=matrix[in]/matrix[temp][in];: a/ |" j& [% w4 l if(i!=temp)# P1 u# z% G6 U/ @+ X1 r! v! v1 n for(j=0;j<=s;j++) + q2 k, c8 L) G matrix[j]=matrix[j]-matrix[temp][j]*c; $ e8 ~! C% g, Z8 S" c' _% o; k }, n1 X7 H# O1 I% H8 l }7 ~8 p% s3 T. }. G ////////////////////////// % k( q3 Y; a- G. D& Wvoid Achange(int in,int out)//出基入基转换 8 i; f$ Z6 P% h* p' k5 X! \' w7 L' t{ a0 ?0 u4 l5 O0 @5 S4 i4 q4 @ int temp=a[in]; ) P" \8 P2 U* P2 _6 h1 m a[in]=a[out];- f1 p2 l1 f3 ?8 i a[out]=temp; 1 ~" s' a) _7 O B) X% e5 I2 p}# X2 S; k/ Q$ O ////////////////////////5 Q7 w& D; P& Q; L" C/ x. V# s void Print() # `/ q6 ` @* c! h/ `! T% D{( |5 q/ W3 ?" G int i,j,k,temp=0; ) Y9 u1 Z. k6 e1 n6 x% R for(i=0;i<n;i++)" }7 e7 }5 J3 D8 F2 J3 u. E; u { $ g2 K) a+ P/ u/ W for(k=temp;k<s;k++). G. d+ G! Z7 p9 B* j; u5 n5 _ if(a[k]==1) " M/ U! B2 | y3 z. P { 2 m8 B2 s2 S6 h7 |& c+ |9 q cout<<k;, z4 l( e! U8 t temp=k+1;( I) [' x; \$ B } k=s; ; p6 H: b0 K$ n8 G( N) I/ I0 V. T/ X; N } " e. j1 Q! ?# [1 J4 X8 @0 W5 z for(j=0;j<=s;j++)0 i# A. c% i+ D cout<<matrix[j];: F6 ?# C+ B$ ?( Z cout<<"\n"; ( i2 }8 l# X2 m# Q5 l) M5 S }; M& C( \/ H' K cout<<"Rj"; 8 ?, x# d! L8 `. _( n! m' i for(j=0;j<=s;j++) 5 {7 x$ x0 G# U! M cout<<matrix[n][j]; ) B' y$ a$ P! c( R& w! f cout<<"\n"; $ P' W; u) ^) [8 d0 R- \}, j: V' ?! R5 L8 \1 g3 V( I$ Z //////////////////////// . N, m X3 |3 ~9 t. `6 J- N$ Vvoid InitPrint() % @6 K: X" w% U* T7 A$ [" s6 Z' x{0 \' L8 D. t: X, `% s h U int i;/ G$ k1 M% l2 H. h cout<<"X";1 x# W2 {% h5 ~1 \, M8 x% f* ` for(i=0;i<s;i++), R4 k) U9 `9 g. T8 v cout<<i; / A; _& C8 Y c# |2 A' ^ cout<<"b\n"; + D; Z5 D' j- R% g7 v cout<<" "; # J2 }1 q2 J, J& s. } cout<<"\n";. \& G5 R, ^0 D2 r/ Z } % ]# u: J* A# O////////////////// # v( Q) ?) {- w. N' }1 S) xvoid Result() 3 [ a; z: v7 I# }0 R" T' Q0 S{ 5 f# J9 w& m1 V2 G" X- M/ r& F int i; d: V6 R' Z$ a cout<<"(";4 u% ^& \( z Z for(i=0;i<s;i++) % }5 N8 s! A3 k" y* m cout<<x;2 f' X1 J" d! L# T cout<<")";$ b" J- X# l' o$ K8 P# _8 E7 Q# T if(type==1), p! F# y5 W- B cout<<"Zmax="<<matrix[n];2 d/ J* R# Q7 }: K/ f else cout<<"Zmin="<<matrix[n];' A- _ o$ L+ ^# t }4 [% W) V8 K6 m, l2 [2 ? //////////////////////& B" B6 C2 b5 m1 s! M0 S void PrintResult(), m8 f# P5 h% L6 h {$ n8 u+ C5 |( T) S6 y# _" w6 o C/ g! y; c if(type==0) / O$ R% ?! X+ E" T% U: h cout<<"the Minimal:"<<matrix[n];9 z7 p( c6 c I7 f. y) p; J- w else cout<<"theMaximum:"<<matrix[n]; 7 F& c- G% q, n5 E9 o" z}# s" M; D9 H. ` k5 g ////////////////////////////////) c3 T$ F. c3 l void Merge(float nget[][100],float nlet[][100],float net[][100],float b[])//合并& r2 }4 e$ |3 Z7 Z8 I o2 M { 3 ^7 |1 f# j4 {8 Z4 T1 \ int i,j;; @3 ~" F% g! H: |; o# A, ]+ n for(i=0;i<n;i++)# `: J: s" H7 f8 \1 K! K {9 Z( ?4 [ |# \0 `# A; ]- m for(j=m;j<m+indexe;j++)# D8 i" e) l1 m4 a/ ]( i if(nget[j-m]!=-1)matrix[j]=0;+ j4 o$ o' y% y2 Q1 o8 _$ d else matrix[j]=-1; 8 I5 R2 V, {3 B& `% W! ^2 x4 q5 P for(j=m+indexe;j<m+indexe+indexl;j++) ( ~3 h3 @6 P' q% d) e$ n9 Z if(nlet[j-m-indexe]!=1)matrix[j]=0; : s5 q8 y6 E7 m8 {- V# z else matrix[j]=1;$ d7 |' d5 L) Q% o- z. A for(j=m+indexe+indexl;j<s;j++) ' x; |! z4 u7 x$ @5 G4 U if(net[j-m-indexe-indexl]!=1)matrix[j]=0;$ L4 T4 |$ k) F1 W0 o. w else matrix[j]=1; 6 W9 D1 q% w& ~" m8 r }5 m _- i! [. ^/ J G for(i=m;i<m+indexe+indexl;i++) + P, G5 x1 C: c* r5 N4 f* S matrix[n]=0; " t' F8 C8 ?' E6 I for(i=m+indexe+indexl;i<s;i++) & J0 _ ~1 T# s* C matrix[n]=100;; ^- J0 e/ m' S' b/ q5 u matrix[n]=0; 7 p: m+ ^, E+ m4 ]0 E}

" \. ^* X4 Z9 e3 m

/////////////////////////// 3 d. Y$ P0 I; T9 Dvoid ProcessA()//初始a[]+ G2 Y- L; T, m y3 U; C {" e3 K V6 c3 Y# y: j. Q! ^' |+ J, b int i;& k& X/ F K4 `2 e# Y for(i=0;i<m+indexe;i++) 6 i% g0 h+ j, D1 Z3 Q1 s a=0; 8 \# Y# {0 H! a- {7 ^ for(i=m+indexe;i<s;i++)3 \, s) a% K' r a=1; . Q; l' {( V0 [$ e1 e/ ~' a}

# H; p2 y! ~# l( T* J- y3 n

//////////////////////////////// ! W4 R7 {7 O( p; ^0 a$ Pvoid Input(float b[],int code[]) B: k' W. Q$ p# `5 W- d6 o) z{ : w" f+ C8 c P% n! q1 ] int i=0;int j=0;9 `( a6 ?- V' X cout<<"The equator variable and Restrictor\n";( J& h u0 P+ p1 M1 g" s$ m' | cin>>m>>n; " A: y3 I6 p) B! N2 Z for(i=0;i<n;i++) 0 Q4 `8 V1 F2 V, c {" l/ Y( g( |' ]6 a% ^9 Y cout<<"Inputb[] and Restrictor code0:<=1 1:= 2:>=\n"; . h5 ]. K3 U* N' [. V cin>>b>>code;3 l. @) Z. ~$ N" \ cout<<"The 系数 \n";! b: x/ i2 ]" }9 h: v; Q for(i=0;j<m;j++) " d) k0 E2 ?: c: x T5 V# @ cin>>matrix[j];& e( z1 e2 [' ?+ H* S }1 S8 c! @% F" L; ` cout<<"the type 0:Min 1:max\n"; / B9 C0 ?8 V# k' y- Z. U9 K* } do{ : ]- `& _# `1 R! E cin>>type;3 a. e- K8 K6 u3 v if(type!=0&&type!=1) 1 G2 _$ {4 N; R- T cout<<"error,ReInput!\n";3 B' Z. }/ l1 E3 P# r) b6 l- G }while(type!=0&&type!=1);* K5 ~8 i" B o* _$ L( X cout<<"the Z\n";* r/ {6 N2 \+ ~' k' H for(i=0;i<m;i++) / t+ o- }. S& D. H; S4 a cin>>matrix[n]; 1 O/ G+ O1 Y- W- H if(type==1) 4 b2 ? u( f2 d8 x& _% D! ~0 T for(i=0;i<m;i++) 5 U. O6 Q R% Z, n. ~ matrix[n]=-matrix[n]; 8 T7 ` U# l6 I& D+ m}

/ t8 |9 z6 J$ V, D! r

% `; U( |8 m: n+ W" x////////////////// : l) q& A3 l% D" L9 n2 \void Xartificial()//消去人工变量 ' U) @5 S+ I% J& l{ ?' b" E, A( Y8 K7 A int i,j,k;, M! z" ^& L" L2 c. T% |& ?9 m if(indexg!=0) $ J# Y# \: B8 v: G3 X! p { 8 d2 I7 P! j/ H! V8 b+ `, s for(i=m+indexe+indexl;i<s;i++) 9 q' q5 F _7 q! d9 F7 r {; u, h7 T& @8 S. K9 h+ L for(j=0;j<n;j++), Q( {$ b! \* D" E, k4 d if(matrix[j]==1) ! q( c8 V( w, A, z {! B0 v' K& Q5 H; O for(k=0;k<=s;k++) * q; F9 j {+ z$ U! C matrix[n][k]=matrix[n][k]-matrix[j][k]*100; % i% C, y# ^( A. x! ~" j- F! C, U j=n; 6 d$ X! I& H1 j( ]# p! G/ z, [3 M } + F8 u+ r) @# U- t: Y I } - g4 E% W# q1 c: h7 E! o }5 G. \9 T2 r( D1 @4 e }

2 l1 f" X# U* V& I

//////////////////////////////////////////////// ) ~0 i; z( I0 G' N5 Zvoid Process(float c[][100],int row,int vol)9 H+ P1 h0 c3 w! B2 s {* K- I5 H. M4 s& F2 t int i;0 U3 Q6 J3 x: h+ c for(i=0;i<n;i++)' e/ v- U. z, J& i, F if(i!=row)c[vol]=0;+ X2 s0 }. W8 T/ Z5 R6 c: i }5 F1 L4 p5 t/ z. [ //////////////////////( k: F8 P. C4 X8 i& c2 d void Start(float b[],int code[])8 ?6 z) n7 k( r; h( R4 f { v, ^$ `# |/ h" }$ s4 F+ R9 G3 b0 F int i; + _2 `. k4 H& o1 J& U- d. p float nget[100][100],nlet[100][100],net[100][100]; 4 P5 g/ G( [0 n+ g) C9 o indexe=indexl=indexg=0; * e# `, r6 ~! T6 E3 l3 h/ \ for(i=0;i<n;i++)' V9 r. G- p# k& M; W {4 M/ c c, D4 _ M1 C2 e if(code==0){nlet[indexl++]=1rocess(nlet,i,indexl-1);} : M; q$ ?+ g: Q if(code==1){net[indexl++]=1rocess(net,i,indexg-1);}' l) {" C% e1 v2 b; Z0 w9 o if(code==2){ $ h# _$ M5 p% U net[indexg++]=1;( y6 h k% i3 t/ c( C nget[indexe++]=-1; " ]' v9 C, g: z: }, m, g Process(net,i,indexg-1)rocess(nlet,i,indexe-1); i+ o" J: x$ } } ! j4 O' z! d4 l' | }( e" s4 e; v" F1 O- v s=indexe+indexl+indexg+m; / w5 g' Q9 W. n7 Z* f6 c* n% B) x Merge(nget,nlet,net,b);* V6 F' m1 S& D# h' Y# {7 w ProcessA();: I4 s! W+ O7 `2 N6 F6 ]* j InitPrint();! ^+ P; U2 `: A Xartificial(); ' u. v6 a$ G& c! d- y$ W2 e6 J$ ]}

P: X5 s5 I9 Z- W! h" w

void Simplix()//单纯形法 # f$ X5 ^+ S1 |{ 7 `) M" A! a2 l b& E int in,out,temp=0; - c( i$ g& @( K% Z( e: V while(1) " |7 m- [/ x" |' [( F# f: C {. b" F4 q3 s4 `3 A# k) p6 s3 |) J jckxj();) [, M( U' k6 A( L5 j Print();- s3 N$ _# V8 t+ E! c- @4 B Result(); & U8 ^4 `* t! x4 l2 o& |3 N1 r if(!rj()) in=Min();6 n* ]: e x5 W$ {4 N else{ d j3 V4 a+ q1 B" E if(indexg!=0) 6 @4 H" K' Y4 z) l$ X1 I JustArtificial();) i4 H* u* S/ {$ |+ j2 k4 J3 {2 A+ W) z PrintResult(); 6 R# D5 F6 g- U7 f return; 9 `/ v R. U8 ]! j }0 u( b5 d. x2 m9 q/ u if(Check(in))7 O$ w, u4 n( ~0 v Z2 S$ e { & [6 w2 S2 Y2 H: j cout<<"No Delimition\n"; ) \/ h9 O7 c( S B return; M& e' w* `- s7 O6 z3 d+ c }. n! v6 M+ T7 u7 z/ O! d out=SearchOut(&temp,in);6 v7 d, O( M! D4 D Mto(in,temp); " M$ o1 i( Y3 f+ V Be(temp,in);' u' C, x$ g6 W- _9 u7 T Achange(in,out); % `+ o% G/ [( o# O7 R; h0 c2 F0 m } , M! a! H: O+ L5 ]+ H* r}

8 O+ [/ V+ G2 _5 {* v5 _

void main() / @ a+ g0 r+ r{ g1 O, K, t1 ]' ? int code[100];//输入符号标记/ g4 r2 N2 L( y7 @8 a9 f) Z; e- c float b[100];+ _% c, W, J9 O) J2 D+ [/ \2 e: k5 R Input(b,code);//初始化 8 H; k4 k! Q/ L R Start(b,code);//标准化行3 i* N3 X7 m1 K- K, f7 ` Simplix();6 S: o @' t- U+ r+ n b, |$ f+ ^, K5 x }5 g d v" ~% ~, Z3 I' Y

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-8-6 23:32 , Processed in 0.794154 second(s), 117 queries .

    回顶部