我有一个二进制/整数程序,我试图在 Python 中使用 milp 来解决它。图片下方和下方是我迄今为止的代码。当我运行它时,我得到
`bounds.lb` and `bounds.ub` must contain reals and be broadcastable to `c.shape`.
我相信我解释了“bounds”变量的上限和下限。但显然不是。缺少什么?
from scipy.optimize import linprog
import numpy as np
from scipy.optimize import milp, LinearConstraint, Bounds
c = [3, 5, 7, 9, 2, 8, 6, 4, 1] # x1 to x9 (office setup cost multipliers)
c = c + [0]*36
A = [
[1700, 3600, 2100, 2500, 3100, 2700, 4100, 3400, 4100] + [24.3]*9 + [32.4]*9 + [28.9]*9+[26]*9, # Setup and transfer costs
[0, 0, 0, -1, 0, -1, 1, 0, 0] + [0]*36, # x7 <= x4 + x6
[1, 0, 0, 0, 0, 1, 0, 0, 0] + [0]*36, # x1 + x6 <= 1
[0]*9 + [1]*9 + [0]*27, # Chicago
[0]*18 + [1]*9 + [0]*18, # Charlotte
[0]*27 + [1]*9 + [0]*9, # Pittsburgh
[0]*36 + [1]*9 # Houston
]
b = [
14000,
0,
1,
29,
22,
19,
27,
]
# Define bounds for each variable (0 <= xi <= 1 for binary variables, 0 <= yij)
x_bounds = [(0, 1)] * 9 # Bounds for the x variables
y_bounds = [(0, None)] * 36 # Bounds for the y variables (unbounded upper limit)
# Combine bounds
bounds = x_bounds + y_bounds
integrality = ([1]) * 45
milp(c, integrality = integrality,
bounds = Bounds(bounds),
constraints = LinearConstraint(A, b))
您的代码有两个问题。首先,要禁用边界或定义“无界边界”,应使用
np.inf
或 -np.inf
而不是 None
。
其次,您当前向
scipy.optimize.Bounds
提供了一个元组列表,这不起作用,相反,您应该提供下限列表和上限列表。
要解决这些问题,您可以将代码的最后部分更改为:
# Define bounds for each variable (0 <= xi <= 1 for binary variables, 0 <= yij)
x_bounds = [(0, 1)] * 9 # Bounds for the x variables
y_bounds = [(0, np.inf)] * 36 # Bounds for the y variables (unbounded upper limit)
# Combine bounds
bounds = x_bounds + y_bounds
integrality = ([1]) * 45
l_bounds = [x for (x,y) in bounds]
u_bounds = [y for (x,y) in bounds]
milp(c, integrality = integrality,
bounds = Bounds(l_bounds, u_bounds),
constraints = LinearConstraint(A, b))