回答

收藏

python求解带约束的优化问题(python 约束求解)

知识点 知识点 77 人阅读 | 0 人回复 | 2023-02-12

帖子摘要:带约束的优化问题可被定义为  在python中可以使用scipy的optimize包进行求解具体求解函数为linprog下面举例说明求解方法 假设问题被定义为  首先求解最大值问题我们可以通过取负转换......9 y4 I1 P& T5 @& i8 a
& n2 @" \+ G# A. J- n# x
大家好,欢迎来到Java吧(www.java8.com),交流、学习Java技术、获取Java资源无任何套路,今天说一说:“python求解带约束的优化问题”3 \+ a- i1 R, j# A8 @

% R1 }- L- ^2 ]& f9 l' c, S- o  |/ W1 G
        
5 @$ N6 ^  w/ w' W7 _7 `- |( \2 S+ x/ }                * }- N0 R5 Y( D* `. R
                    
, e$ B  p: A7 R; H                        , a2 N0 w' W; C4 X% e6 O# ?8 m4 _
                    : g5 s4 n  d& k
                    带约束的优化问题可被定义为: g# @/ v$ J& {' ?: }9 m- C
4 r4 J  p& d5 B6 Q1 A
. H! p) u! ^0 F" x7 y, K
在python中可以使用
  1. scipy
复制代码
  1. optimize
复制代码
包进行求解具体求解函数为
  1. linprog
复制代码
下面举例说明求解方法% b; a* d7 _9 l& \7 z& R

+ L1 N5 `8 x( y7 F; H- s- g3 e假设问题被定义为- ^0 V: z( q0 m1 O) d: i+ Z" B2 j

) Z; u9 {9 d- W
, C. h) y$ n6 q8 I, k 首先求解最大值问题我们可以通过取负转换为求解最小值问题包括不等式约束也是如此那么该问题的python求解代码如下
2 f% i) G: H9 C2 R 5 S* L5 F! E7 ^, @0 A# b( i' {
  1. import numpy as np
  2. from scipy.optimize import linprog
  3. fun = np.array([-29.0, -45.0, 0.0, 0.0]) 5 }" D+ D, p& ~6 l
  4. A_ub = np.array([[1.0, -1.0, -3.0, 0.0], 9 n: Z3 s; f( \
  5.                 [-2.0, 3.0, 7.0, -3.0]]) 2 W& b) Z1 u6 S( O- s6 j; @
  6. b_ub = np.array([5.0, -10.0])
  7. A_eq = np.array([[2.0, 8.0, 1.0, 0.0],
  8.                 [4.0, 4.0, 0.0, 1.0]]) % G4 y! J+ q9 T' N! w3 }
  9. b_eq = np.array([60.0, 60.0]) 3 X4 S6 y# x2 v6 {
  10. x0_bounds = (0, None)
  11. x1_bounds = (0, 5.0) 3 {- A" c& ~2 V; [4 {5 K2 w# m
  12. x2_bounds = (-np.inf, 0.5)  # +/- np.inf can be used instead of None # z* U- a4 p4 M+ @# ?
  13. x3_bounds = (-3.0, None) + A0 z) P' {; T8 {7 r) u
  14. bounds = [x0_bounds, x1_bounds, x2_bounds, x3_bounds] 0 t! B" J- q+ @7 I6 j& G; o
  15. result = linprog(fun, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=bounds) / F- @+ Y0 T8 P' P) g5 s: i5 B3 ]
  16. print(result.message) , k0 f( V3 `7 e/ C+ ~+ Q9 z& a
复制代码
6 X0 P# V- s. i# u
上述代码会显示
2 n* P. s1 c: G7 [! P   w! y% _' ?4 ?: Y/ `
4 _; U" M% s  l1 x9 A8 s5 N7 Q
The problem is infeasible. (HiGHS Status 8: model_status is Infeasible; primal_status is At lower/fixed bound)
% M; ^# e; ^+ N. ?2 O5 k; I( W0 L ' s" m! R6 ^* R6 d1 y  z% i

7 @+ a3 }: H) I5 @3 A" _这说明问题无解重新调整x1边界范围后继续执行
2 K) z9 ^, u& `% [. i' v 9 J  O3 K) W6 m. P& ~) G. K+ k
  1. x1_bounds = (0, 6)
  2. bounds = [x0_bounds, x1_bounds, x2_bounds, x3_bounds]
  3. result = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=bounds) - v! h: `8 V, P5 ~" `5 R! m3 {
  4. print(result.message) ' D' o3 ^' z  P$ I2 u. D! E
  5. print(result.x) + j1 \7 D+ Q- ?* f1 @
  6. print(result.fun) - B$ B" V! k& `) ]5 w
复制代码

  x/ b, N3 M# p$ ?; o: |! ~! u终端显示7 ?5 @! W" |! W# k1 Z2 j: j% v0 C

5 U- z' n" m4 C
* @1 S" ?$ \) J1 j, o Optimization terminated successfully.
8 U9 Z0 w2 c" H, k+ M  s [ 9.41025641 5.17948718 -0.25641026 1.64102564]
* H1 A' t. j4 T -505.97435889013434
( x* ^% s) T' z+ {- x0 i. U
3 R* J9 v8 D. C: s) K. F

- w( Z" @4 e4 c6 j" P2 O这说明问题求解成功当
* s! U" D" [; M   
0 y. K1 y/ o  k. o( \$ p; v9 I     # @' w5 |8 B  L& r6 W
      
4 x; J) s- w4 v% _1 y7 ~       ) n3 R7 b# n1 v6 w
        
9 N; v/ ~" R" v4 E8 g9 h+ ~         x" K5 e" |! L$ O! u' Q& ?+ U3 f
        ! d" r+ f/ U2 R  S4 U
        
$ {' N! ^2 w( F! L         1
# o3 e2 D( h0 p" G  o        
0 b6 K' ~8 M* g      
5 L3 w; ?. a! s, Y7 e# e+ A      
  G) z6 t2 M2 ~3 ~; @2 k1 h9 a" z        =- d8 P& v1 f2 V: K5 }6 }2 q* o
       6 q9 E  u8 b, O
       " Y0 Y8 y; z# i" h4 Z2 t
        9.41025641: G& R( S, k3 u' Y( T
       * d9 u/ v8 J; ^2 W+ h! Q
      
4 t! X- R5 W: r3 K        ,! q4 \8 Y  K7 l
      
: Q* t/ q4 n7 G! S# T* _; Y       8 _6 @' {! H; Q0 f5 e6 f
        " R3 d5 u$ ^6 h6 K3 e
         x
+ `7 `3 n( X0 `! [9 f        5 U6 y. z6 [! }7 L! V- o0 l
        ' o5 J+ U% Z: Q- {' `, f
         26 L# q1 U  F, e, |$ q
        
4 B4 o$ \, m; A. x" g  @0 c       ' ?8 n5 n0 f9 z, Y0 Z( i  ]
       / c( V* [* k7 ?+ |6 m4 r) l+ s
        =/ y4 k4 L$ H7 C* v  R# `8 o6 q8 H( N
       1 s5 Y2 z/ P3 M( n3 h' O8 R
       1 j  B3 X- B) A- |8 J
        5.17948718
. p7 D  e! u7 K1 ~* V9 o6 p# p      
! p0 u, X- U" l- b. [      
: N, M: R/ y! E. S$ n% @1 V        ,
6 d, p6 J9 _0 X: u: \9 b      
  l- H" k7 m; N+ k9 r3 B9 G  w      
5 x; _/ U9 t! a3 I* K) F* C3 j  q        9 J# I; m+ Y0 O2 M( V
         x
, s3 ^6 i: i9 _; [) J        
  }+ l9 D' b+ `  N2 m        
& N) S" C/ S: ^5 X  }) [         3
  @3 ]* ^8 k9 P! O" ]        
0 ^* i4 Q" }6 A# Z& q      
, K9 \$ Y7 x3 ]! m% V  Y8 ^3 ?5 H& G       ( n- \( c) K) T3 _! j" L1 _# H
        =4 j& d" C. J. B- [
       $ r/ \# H- o/ D0 V" h" @
       " l; b- u: x  `7 J/ _) }  T
        ?
! @  H; [. n, V% e  h1 ^3 ~9 L       ' ~- A$ t1 H$ h  Q. S
       ' }* y/ c6 y! _6 O+ i5 q5 j$ U
        0.25641026
3 T4 y* r  `8 O0 B( _0 b      
# p# S4 A2 s4 U6 P! t4 @       " @! g( ^% f$ \- {/ w0 y8 t
        ,! r" M5 f; o5 B: q, T8 R* _. k
      
# c+ T* g  V" H2 q       3 ?* n/ ~6 |  v1 i3 h6 s
        
0 V* p6 @0 ^# }& Y         x
3 W  k; Q9 T! E& ]        0 v; p* I8 |% j
        
% a# N8 S# \: n" y" U3 y$ M         4
- X# Z) \) W: y% W( b2 z! x        7 L  m2 [8 _' b. E( D* X
      
1 a: o0 b8 \( L' t* F! Z# s# Z. M       # e. F) x# K1 A% h) T+ }
        =% e0 d/ x# W" }3 b5 E6 V3 Y) e  Z
       ; X' R- b3 L# _
       1 L" x  d( T* y% D$ j
        1.64102564! L) x$ _/ X5 y6 Q/ h
      
4 F7 f) _2 v- f$ P      
! Z6 u$ c) c8 D2 n3 t& e/ n5 U7 m' ~/ F        n! |* \+ R9 J2 o5 i, N
       x_1=9.41025641,x_2=5.17948718,x_3=-0.25641026,x_4=1.641025641 m) ]* R# q  ?) X. y
      $ Q- X9 |6 G- C% G' k& |
     
7 b) d# }/ {9 c7 ]# z    x1?=9.41025641,x2?=5.17948718,x3?=?0.25641026,x4?=1.64102564 目标函数取最大值最大值为
* Z1 m) [9 ~% x2 a( G& e    ! J* ]2 m" D2 \1 [" ^' u0 j! M2 y
     
3 z) a6 r1 t2 W7 d5 M      ; \" i# e7 a* R# M
      
. R' B9 C. I. L2 a        505.97435889013434
6 d/ M' k: O3 K, `. l* @/ }       ' J3 z# [$ k0 \$ }  P% L
      
+ J( K; _- z' N0 D      " h$ e. r/ A4 a" b7 d
       505.97435889013434
: W& \% f0 B6 @9 O$ h+ m      8 x9 }$ a; |# ^5 W9 d0 p% F6 l
     : H& ^/ m- z- D  S8 h) F/ N& r7 h) `
    505.97435889013434.
- d2 u4 _2 Y: [, i0 d6 t
& ?  _: Y; [, p+ r2 W 0 ~5 z. H" y( I9 s) V: c
注意将最大值优化问题转换为最小值优化问题时结果要再取反* L6 W4 `4 @# Y0 ]4 v( W- |

' r- A4 A; n6 B+ `) z

. B' W$ O& C$ y, l3 ?1 g: y ' g' H) t  [1 U( |) {
参考文献5 j! [! h, M' T  ]4 F& \
! d) X/ W) H' e2 j* z. r
  • https://docs.scipy.org/doc/scipy/tutorial/optimize.html#linear-programming-linprog! h  y: {/ x0 I/ l1 Q( }' b- @+ p. {
                    & `* c% q* k! m9 F% e; X
                    $ l3 v! x5 `0 F  o1 {
                      r- ]& B1 ~% O1 X0 p) r
    本文来源csdn,由Java吧转载发布,观点不代表Java吧的立场,转载请标明来源出处:https://www.java8.com
  • 分享到:
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    27565 积分
    7055 主题
    热门推荐