最小成本的线性规划问题

linear programming problem for minimum cost

一家建筑公司有 6 个项目,每个项目需要 $d_i$ 名工人。项目一开始公司没有工人

每个新工人必须参加安全课程,费用为 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 这样 z_i 不会是 1 当你有 x_i>0。对于这个约束,你需要一个叫做 big M 的东西。对于足够大的 M,您将使用 z_i <= 1-x_i/M。这样当 x_i=0 你可以有 z_i=1,否则右侧小于 1 并且由于完整性 z_i 必须为零。请注意,您通常希望选择 M 尽可能紧。所以在你的情况下 d_i 可能是一个不错的选择。

第二个小错误在y_i >= y_{i-1} + x_i。这样你就可以在 y_{i-1} 的基础上增加 y_i 而无需设置任何 x_i。要强制 x_i 增加,您需要翻转不平等。此外,按照您定义 y_i 的方式,此不等式应指代 x_{i-1}。因此你应该以 y_i <= y_{i-1} + x_{i-1} 结束。此外,您需要处理极端情况(即 y_1 = 0

我认为通过这两个更改应该可以。让我知道它是否对您有帮助。如果它仍然不起作用,我可能错过了一些东西。