帖子摘要: 带约束的优化问题可被定义为 在python中可以使用scipy的optimize包进行求解具体求解函数为linprog下面举例说明求解方法 假设问题被定义为 首先求解最大值问题我们可以通过取负转换......
d2 ?3 U) i* C) _8 X
2 d0 n% v$ P9 s3 l 大家好,欢迎来到Java吧(www.java8.com),交流、学习Java技术、获取Java资源无任何套路,今天说一说:“python求解带约束的优化问题”
& [- h c" s8 ]. } 1 p2 f8 C n5 ^( \/ Q) T
6 r3 P) J2 C; e- U) C/ T6 k6 n) V
' ~. a6 T7 u; ^0 e 3 X, n$ B. F u
; n( a9 P: I* A7 b5 ~# I
4 E \. U6 }1 _( t. n& s0 P. r2 N2 V
# ?/ a$ `0 R2 j* d, B0 C. T- F# F2 c( c
带约束的优化问题可被定义为
| V& c+ _+ d. m6 t6 ~' v
3 h( ?) Y0 T6 s! \( v
: W! j/ g3 l+ m' t4 F1 T, A, \. k4 J 在python中可以使用
复制代码
的复制代码
包进行求解具体求解函数为复制代码
下面举例说明求解方法3 u- c) u$ n: V9 p0 i3 N
) m d/ b/ u/ h# N
假设问题被定义为( h' G# h0 ?& y9 F
/ p7 E* D& O7 U2 S4 E# [2 _
0 W+ F8 ^ [. B' {- x. V
首先求解最大值问题我们可以通过取负转换为求解最小值问题包括不等式约束也是如此那么该问题的python求解代码如下* N# p( H: V0 ], B# g" l! Q7 J
1 N5 W, _* ]/ s7 C
import numpy as np
5 ~8 |" E% Y! z5 C+ L6 \ from scipy.optimize import linprog
fun = np.array([-29.0, -45.0, 0.0, 0.0])
A_ub = np.array([[1.0, -1.0, -3.0, 0.0],
[-2.0, 3.0, 7.0, -3.0]])
b_ub = np.array([5.0, -10.0])
8 Q! c" |# r* J/ s A_eq = np.array([[2.0, 8.0, 1.0, 0.0],
[4.0, 4.0, 0.0, 1.0]])
5 b t" ~8 h. X7 G7 i$ j; U* U b_eq = np.array([60.0, 60.0])
x0_bounds = (0, None)
/ r- K) D8 B, [' E! }. P x1_bounds = (0, 5.0)
7 d; k6 l0 ~9 w" U x2_bounds = (-np.inf, 0.5) # +/- np.inf can be used instead of None
x3_bounds = (-3.0, None)
bounds = [x0_bounds, x1_bounds, x2_bounds, x3_bounds]
result = linprog(fun, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=bounds)
$ a7 g" `( E, N' j& [) Q print(result.message)
复制代码
9 Q1 Z+ U7 L, @$ z6 T8 }' Q8 |
上述代码会显示
" }/ Q5 X7 S0 S6 D ' W! g& n. g" p, J: W5 ~
6 E& _" i, u! X& S
The problem is infeasible. (HiGHS Status 8: model_status is Infeasible; primal_status is At lower/fixed bound)" U; S8 d3 U m# ^9 e
/ O: X* M5 `+ ?5 B) s r/ ?7 a) _3 ~; Y% b6 z$ j; b8 `$ Q9 D
这说明问题无解重新调整x1边界范围后继续执行
$ ~" V6 w# ~' r) q1 `: S/ r5 Z
$ R( H6 K& f' k x1_bounds = (0, 6)
bounds = [x0_bounds, x1_bounds, x2_bounds, x3_bounds]
+ U+ o9 `9 I; o6 O( m9 K result = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=bounds)
print(result.message)
print(result.x)
print(result.fun)
复制代码
5 C4 u( w: v0 }# T" R' C/ ?$ j 终端显示
; c' g, r# I6 e# r5 g# r% k9 T6 f ) `8 c" H( s. q. K, Z
, U& v: C1 p( p/ Y7 I3 @
Optimization terminated successfully.4 Y/ e4 K( ?7 l. z
[ 9.41025641 5.17948718 -0.25641026 1.64102564]! t# U V- S7 ]
-505.97435889013434" K! {5 U+ i% S, y% e3 d
; t5 E# Z1 w8 Z. L
- r) x1 L* p0 z8 G" H
这说明问题求解成功当6 F3 p, t3 }( i
+ O4 b: c+ X* v F
. V# O" P+ X2 G; F 4 v% B9 G! I+ r3 _! ^1 P) J Q! |( M
$ k# F% g1 }2 f* z! q * ~# r* p4 ^- p6 T# q
x
, C% z9 n5 E7 P/ {; A
, S% S2 D z9 z: ^ X8 q5 @( O# X2 F
1
4 S% e2 N$ Q9 d0 E) {( K- D9 @* ]7 f$ H - j$ t) V# B D
1 c1 y: E+ j& q- p$ i: a% l$ |# I% E
+ m% j8 I! S. K& f8 X =% t4 z; Y! z7 k; P) o. s
/ D- S/ h3 x3 }
& s+ E9 a+ c9 ^! }# @) Z9 Q 9.41025641, {% \$ u% \" A; z& _* Q
4 _; h: k8 d0 y6 \/ u: ?5 f
$ P. W" R8 g5 A& l. J& ^8 p0 [ ,( j3 X( O0 d1 ^+ y( c9 ]
- g, s- t2 _5 f* ]( C7 m
4 y- Z& Q; V& P5 }
7 m( q, g [( a# j$ q/ [* Q x/ U5 o: S- W/ G' r' X& K
( v# N) m; l* z( y. E9 \# Q# t4 M
1 J. V5 N1 q- [ 26 z1 ~; G: m+ c" V \
& ^2 M) [% j( g7 k2 D
4 V' r& [5 x$ y& N4 @7 ~" s" l - ]* r; k" ~5 C2 P+ _6 Z+ F$ ~- _
=
5 |7 q+ P# c: o
& g( i4 d; B0 E( R 1 v5 Q9 {/ {) a7 k9 {& S" ~6 z0 M8 k
5.17948718
' b* l+ p' k; N* S) F( V& G k- K ' f9 a" B( Z: E( _) z
7 h3 J7 I% q" ]7 P) I
,
! X$ A% R- H0 E- x + n) ]' e# p: }- Q3 I' X. M" j
8 G' m- V- C' @5 w) s+ x
0 W) M9 a" W+ M& B8 o n; X8 v
x7 a8 n" ]3 g( K* R0 a
/ v% ]/ L+ N) K, @0 v$ `
/ |1 a5 F# i0 v* {6 J/ ?( |3 L1 a( @ 3
* X+ h$ @2 Z r4 _ ( s2 S% D/ g0 ~" d
+ k' [& q# e8 U U% a8 ]0 @1 E# _
T/ ~0 K) S2 S' f4 Q
=' [- P& W5 k5 x
h8 W7 R9 B: I% l1 `% [
" Q) l5 D9 V" e8 r) ~; M
?' S. v- P' v0 F# c
8 Z5 q7 ~8 Y& E8 h. U * o7 ]( I7 ]/ D4 @% |- W% B- v/ t
0.25641026
4 K* _2 Q! c/ }% I& s4 [ * I% T' U4 P* T* x3 M
: @ a1 p7 D. K4 t1 O/ K: ?; t ,* F& a% p- S% k7 E: t
% o% `1 D n# M4 t0 V* U* s6 i
. M: D) H2 h+ i7 C, O1 j( S' C
" S& ?& `# }4 j+ `& @# ?) P( d x0 h9 a3 ], M9 r( g
1 x* s' R+ R" \. b! n1 S% o k2 G + ~8 G& ~& A4 V; b/ x0 Z s: x$ I2 E
4( j S J% }$ z, x3 q! M$ l- V" J
! R# L8 H& ^1 k' I- k, M- e3 c
. b/ A$ f1 r3 m" M* E! B
! Y. M, h9 h. h+ K- s8 f. c# n =6 D j* u% Z/ Q* \& c
: g" {9 ]: ] H
, r6 y- ]0 \: a. X: i+ B- D 1.64102564
" U6 t/ g, [5 \! t* M# q
1 U. u0 G- S& q$ P4 m# {9 t
$ ^# Q1 O8 ~2 W8 l0 a; G * g1 q9 b5 k$ t, g9 h/ @; Z3 T" p
x_1=9.41025641,x_2=5.17948718,x_3=-0.25641026,x_4=1.64102564) j& g, ^* Z$ Y; V2 O
: U& n$ T- ^! f( E+ B: \2 S8 r # @. U/ r7 j& j9 m
x1?=9.41025641,x2?=5.17948718,x3?=?0.25641026,x4?=1.64102564 目标函数取最大值最大值为
7 [' B4 V) e) B/ z1 O" ~+ ] 4 s+ z, |$ K# D) x% j0 @
' K4 b, j/ B. U9 K/ r
. d8 n. S1 B4 Q- S& O 5 ^/ z1 D. O& Y+ U
505.97435889013434
" i) ~1 s4 V$ c( ^6 O' [ % w T! V# }; v' ?5 i1 S1 i
# B8 N( K- D! h# k3 m
6 z0 p- o8 E! X 505.97435889013434
9 X$ L! ~2 ^: ~, m: R2 z2 a% C ' A, e1 g7 T2 _' G
9 k/ I0 c! \4 z3 y 505.97435889013434.2 s* K; d$ T1 `
$ `- s5 q% T' ?8 m1 N. E* g) L( G + @# B$ P: m$ t) [( \; d
注意将最大值优化问题转换为最小值优化问题时结果要再取反2 O$ p0 T/ l5 h# p6 ]' D- r& z, T; G
! Z) ^* T e6 w, ?* W& k* e
6 x5 x( O7 B" r( d/ r* K
: e# V8 z! j; ], P8 d B 参考文献 7 h t7 a5 h9 z5 D
( @# |2 C& V7 u* X$ q
https://docs.scipy.org/doc/scipy/tutorial/optimize.html#linear-programming-linprog + q, v8 `' M' g0 w3 j
! m2 S/ V a3 ?$ D( a$ M5 ^
/ D# i! J& R4 X5 t6 a( Z 5 x) z& _- `3 B d+ ~
本文来源csdn,由Java吧转载发布,观点不代表Java吧的立场,转载请标明来源出处:https://www.java8.com