我遇到了线性优化问题。最终目标是在几个项目和几周内获得最佳生产数量 (prod_qty)。
现在,问题如下: 作为优化问题的一部分,我知道每个项目和每周的需求。在求解 prod_qty 时,我想最小化过剩(prod_qty - 需求 > 0)和未满足的需求(需求- prod_qty > 0)。
这就是这变得困难的原因:我不希望我的求解器在我的求解范围内的给定一周后满足任何未满足的需求。本质上,当一周内我无法满足需求时,我只想在下一周忘记这一点。因此,在接下来的一周,在计算新的未满足需求或过剩时,我不会包括上周的未满足需求。但是,如果我在给定的一周内创造了过剩 - 在下周优化器必须“记住”过剩是可用的,因此将其包括在下周的过剩或未满足需求的计算中。
我遇到的问题是这个(使用cvxpy):
我设法创建了一个变量“excess”,就像这个本质上一样
max(0,(prod_qts[0,:] - net_dmd_mtrx_np[0, :]))
或max(0, (balance_pos[dte-1,:] + prod_qts[dte,:] - net_dmd_mtrx_np[dte, :]))
取决于我们查看的星期:
excess = cp.Variable(prod_qts.shape, nonneg=True)
for dte in range(prod_qts.shape[0]):
if dte == 0:
constraints.extend([excess [0,:] >= (prod_qts[0,:] - net_dmd_mtrx_np[0, :])])
else:
constraints.extend([excess [dte,:] >= (excess [dte-1,:] + prod_qts[dte,:] - net_dmd_mtrx_np[dte, :])])
我的目标函数看起来有点像这样:
objective = cp.Minimize( cp.sum(excess) )
用这个运行我的代码后,我成功地获得了正确的过剩(也就是说,正确地忽略了我们也应该最小化未满足的需求这一事实)。
我现在如何创建独立于多余列的第二个变量“未满足”,以便在最小化两者时不会遇到任何问题?我尝试以非常相似的方式添加它:
unmet = cp.Variable(prod_qts.shape, nonneg=True)
for dte in range(prod_qts.shape[0]):
if dte == 0:
constraints.extend([unmet[0,:] >= (net_dmd_mtrx_np[0, :] - prod_qts[0,:])])
else:
constraints.extend([unmet[dte,:] >= (net_dmd_mtrx_np[dte, :] - prod_qts[dte,:] - excess[dte-1,:]) ])
如果目标函数不变,则再次创建预期输出。但是,我实际上希望目标函数成为
objective = cp. Minimize( cp.sum(excess) + cp.sum(unmet)).
但是在将第二个和引入目标函数后,我现在在解决问题后没有收到预期的过剩和未满足。我认为这与以下事实有关,excess [dte,:] >= (excess [dte-1,:] + prod_qts[dte,:] - net_dmd_mtrx_np[dte, :])
并且unmet[dte,:] >= (net_dmd_mtrx_np[dte, :] - prod_qts[dte,:] - excess[dte-1,:])
清楚地表明了实际上我不想存在的未满足和过度之间的直接关系。
我一直在尝试引入虚拟变量的想法,例如 dummy_excess = 1 if extra = 1 to enforce unmet[dte,:] >= np.multiply((net_dmd_mtrx_np[dte, :] - prod_qts[dte,:] - excess[dte-1,:]), 1-dummy_excess)
。不幸的是,该术语np.multiply((net_dmd_mtrx_np[dte, :] - prod_qts[dte,:] - excess[dte-1,:]), 1-dummy_excess)
的曲率未知,因此不遵循凸优化的 dcp 规则。
欢迎任何有关如何作为线性优化框架的一部分解决此问题的建议。