【发布时间】:2019-10-06 21:41:37
【问题描述】:
我正在尝试使用 SciPy 解决一个非常基本的优化问题。问题受到约束并且具有可变界限,我很确定它是线性的。
当我运行以下代码时,执行失败并显示错误消息“LSQ 子问题中的奇异矩阵 C”。有谁知道问题可能是什么?提前致谢。
编辑:我将在此处添加代码应执行的简短说明。 我在代码的开头定义了一个“需求”向量。该向量描述了在一段时间内索引的某个产品的需求。我想弄清楚的是如何下一组订单,以便在一些约束下满足这个需求。这些约束是;
- 如果在某个时间点有需求,我们必须有库存商品(需求指数)
- 在下订单后的 4 个“时间单位”之前,我们不能再下订单
- 我们无法在最近 4 个时间单位下订单
这是我的代码;
from scipy.optimize import minimize
import numpy as np
demand = np.array([5, 10, 10, 7, 3, 7, 1, 0, 0, 0, 8])
orders = np.array([0.] * len(demand))
def objective(orders):
return np.sum(orders)
def items_in_stock(orders):
stock = 0
for i in range(len(orders)):
stock += orders[i]
stock -= demand[i]
if stock < 0.:
return -1.
return 0.
def four_weeks_order_distance(orders):
for i in range(len(orders)):
if orders[i] != 0.:
num_orders = (orders[i+1:i+5] != 0.).any()
if num_orders:
return -1.
return 0.
def four_weeks_from_end(orders):
if orders[-4:].any():
return -1.
else:
return 0.
con1 = {'type': 'eq', 'fun': items_in_stock}
con2 = {'type': 'eq', 'fun': four_weeks_order_distance}
con3 = {'type': 'eq', 'fun': four_weeks_from_end}
cons = [con1, con2, con3]
b = [(0, 100)]
bnds = b * len(orders)
x0 = orders
x0[0] = 10.
minimize(objective, x0, method='SLSQP', bounds=bnds, constraints=cons)
【问题讨论】:
-
如果模型是线性的,SLSQP 并不是一个很好的解决方案。线性模型的求解器将是更明显的选择。
-
感谢您的快速回复。我查看了 scipy 的 linprog 模块,但我很难定义我的一些约束。例如,“four_weeks_order_distance”方法施加了一个约束,基本上是说在任何其他订单后四个星期才能下订单。这种约束并不能很好地转化为矩阵形式,或者至少从我的经验水平来看。
-
计数通常使用二进制变量完成。支持二进制变量的线性求解器称为 MIP(混合整数规划)求解器。 Scipy 没有(但在 Python 环境中使用的 MIP 求解器很容易获得)。您所说的约束对 SLSQP 不利,因为它违反了平滑假设。
标签: python optimization scipy operations-research