我正在尝试通过将其设计为(整数)线性问题来优化计划。我遇到了编码部分的一些问题(主要是由于纸浆),这与配方相当分开。
问题:
按照以下限制条件,在5年(按月计时)的时间内安排n艘船舶:
目标函数表述:
定义松弛变量,计算计划偏离5个月('M')维护计划的次数(和数量)。
如果需要,我可以更多地解释设置,但是现在我有一些基本问题可能是我问题的根源。
这是我的一个约束(blockList存储每艘船的4个月和8个月块的开始):
# Each ship must have one 8block and one m4block in a 5 year schedule, which must be between 2 and 3 years apart
for n in ship_list:
prob += blockList[n][0] - blockList[n][1] >= 24
prob += blockList[n][0] - blockList[n][1] <= 36
我想取上述表达式的LHS的绝对值,但我不能因为对象被初始化为pulp.LpVariable。有关解决方法的任何建议吗?
无论如何,这可能会或可能不会解决我的问题。如果没有,我的下一个问题是任何熟悉纸浆的人。我如何知道解决方案是否正确,或者解决方案是否在背景中添加了某种弹性? (使用该约束运行代码会产生不正确的结果,并且使用不同的求解器(如GLPK)会产生错误。)
答案 0 :(得分:0)
以下是一些建议:
采取绝对值
在PuLP中,你可以依靠底层的Python命令来做到这一点。
有些事情:
if blockList[n][0] > blockList[n][1]:
prob += blockList[n][0] - blockList[n][1] >= 24
else:
prob += blockList[n][1] - blockList[n][0] >= 24
要查看“添加弹性”的解算器是否检查pulp.constants.LpStatusOptimal.
的值如果此值为1,则问题解决为最优。 注意,典型的做法是添加虚拟松弛或剩余变量,在目标函数中给它一个小的惩罚。如果在解决方案中虚拟变量不为零,则意味着问题需要额外的“弹性”。
最后,我的主要建议是你从小开始,只有一个在PuLP中有效的最小例子。您甚至可以从case studies here之一开始。在每个步骤中,将LP写入文件并进行检查。这将立即告诉您哪些约束或变量已关闭,您可以更改它。
class pulp.LpProblem(name='outfile.lp', sense=1)
希望这能让你前进。