如何解决线性规划问题,成本最低
一家建筑公司有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}
)
我认为通过这两个更改,它应该可以工作。让我知道它是否对您有帮助。如果仍然无法正常工作,我可能已经错过了一些东西。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。