线性规划问题,成本最低

问题描述

一家建筑公司有6个项目,每个项目都需要$d_i$个工人。在项目1的开始阶段,公司没有工人。

每位新工人必须参加一次安全培训,费用为300,每位工人另加50。 如果没有新工人,就没有课程。

解雇一名工人不会花费任何金钱,也无法再雇用该工人。

鉴于每个项目的工人工资为100,提出了一个线性规划问题,该问题使工人的成本最小化。

我尝试过的事情:

$x_i$是项目$i$的新工人数。

$y_i$为先前项目到项目$i$为止的剩余旧工人数(所有雇用的工人-所有被解雇的工人)

$z_i$成为指标,使$z_i =0 \iff x_i>0$

我要解决功能是:

$\min(\sum_{i=1}^6 150x_i + 300(1-z_i) + 100y_i)$

s.t:

\begin{align}
x_i,y_i,z_i &\ge 0 \\
z_i &\ge 1-x_i \\
y_i + x_i &\ge d_i \\
y_i &\ge y_{i-1} + x_i
\end{align}

我觉得有些不对劲。主要原因是我尝试使用matlab解决此问题,但失败了。

我做错了什么?我该如何解决这个问题?

解决方法

当我正确看到这一点时,您在约束中就有两个小错误。

当您使用z_i >= 1-x_i时,第一个出现。这允许z_i始终取值为1,这将永远不会给您带来300的额外开销。您需要对z_i进行上限,以使拥有{{1 }}。对于此约束,您需要一个名为big M的东西。对于足够大的x_i>0,您可以使用M。这样,当z_i <= 1-x_i/M可以有x_i=0时,否则右侧小于1,并且由于完整性z_i=1必须为零。请注意,您通常希望选择尽可能紧凑的z_i。因此,在您的情况下,M可能是一个不错的选择。

第二个小错误在于d_i。这样,您可以将y_i >= y_{i-1} + x_i增加到y_i,而不必设置任何y_{i-1}。要强制x_i增加,需要消除不平等。此外,通过您定义x_i的方式,该不等式应参考y_i。因此,您应该以{{1​​}}结尾。另外,您需要注意一些极端的情况(即x_{i-1}

我认为通过这两个更改,它应该可以工作。让我知道它是否对您有帮助。如果仍然无法正常工作,我可能已经错过了一些东西。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...