乙個簡單的整數規劃問題:
m ax
x+y+
2zs.
t.x+
2y+3
z≤4x
+y≥1
x,y,
zbin
ar
y\begin & max & \quad x+y+2z \\ & \\ & s.t. \quad & x+2y+3z \le 4 \\ & \quad & x+y \ge 1 \\ & \quad & x,y,z \quad binary \end
maxs.
t.x
+y+2
zx+2
y+3z
≤4x+
y≥1x
,y,z
bina
rypython**:
# coding=utf-8
from pulp import lpproblem, lpvariable, lpconstraint, lpconstraintle, lpconstraintge, lpmaximize, lpbinary, lpstatus
# create a new model
m = lpproblem(name=
"mip model"
, sense=lpmaximize)
# create variables
x = lpvariable(cat=lpbinary, name=
"x")
y = lpvariable(cat=lpbinary, name=
"y")
z = lpvariable(cat=lpbinary, name=
"z")
# add constraint: x + 2 y + 3 z <= 4
m += lpconstraint(e=
(x +
2* y +
3* z)
, sense=lpconstraintle, rhs=
4, name=
'c0'
)# add constraint: x + y >= 1
m += lpconstraint(e=
(x + y)
, sense=lpconstraintge, rhs=
1, name=
'c1'
)# set objective
m.setobjective(x + y +
2* z)
# calculate with the default cbc optimizer
status = m.solve(
)if lpstatus[status]
=='optimal'
:for v in m.variables():
print
('%s %g'
%(v.name, v.varvalue)
)print
('obj: %g'
% m.objective.value(
))
輸出:
x 1
y 0z 1
obj: 3
其中約束條件和目標函式的寫法可簡寫為:
# add constraint: x + 2 y + 3 z <= 4
m += x +
2* y +
3* z <=4,
'c0'
# add constraint: x + y >= 1
m += x + y >=1,
'c1'
# set objective
m += x + y +
2* z,
'obj'
pulp預設使用cbc優化器,如果想用其它的優化器:
from pulp.solvers import cplex, gurobi
# calculate with cplex or gurobi
m.solve(solver=cplex(
))
如果優化器未安裝,則會報pulp.solvers.pulpsolvererror: pulp: cannot execute cplex.exe
錯誤。如何查詢本地已安裝的優化器,請看這篇文章。 動態規劃例子
對於由從1到n 1 n 39 這n個連續的整數組成的集合來說,我們有時可以將集合分成兩個部分和相同的子集合。例如,n 3時,可以將集合 分為和。此時稱有一種方式 即與順序無關 n 7時,共有四種方式可以將集合 分為兩個部分和相同的子集合 和 和 和 和 輸入 程式從標準輸入讀入資料,只有一組測試用例...
動態規劃例子
演算法描述 已知多段圖的鄰接表,利用從後往前遞推的方法,先從最後一層往前保留當前的最短路徑長度,由子結構的最優解得到原問題的最優解。遞推公式是 cost i,j min 這裡為了節約空間,用一維陣列cost來儲存節點j到t的最短路徑長度。將所有節點按0 n 1進行編號,源點s為0,匯點t為n 1 向...
動態規劃經典例子
金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n元。於是,他把每件物品規定了乙個重要度,分為5...