用Python进行线性规划(Pulp) - 调度

时间:2013-09-13 17:12:28

标签: python linear-programming pulp

我正在尝试通过将其设计为(整数)线性问题来优化计划。我遇到了编码部分的一些问题(主要是由于纸浆),这与配方相当分开。

问题:

按照以下限制条件,在5年(按月计时)的时间内安排n艘船舶:

  • 每月只有一艘船必须在“本地巡逻”(州='C')
  • 每年只有一艘船必须进行“延长巡逻”(状态='A'),这是从7月到10月的四个月一揽子计划
  • 每艘船在5年期间(州='4')
  • 必须进行4个月的检查
  • 每艘船在5年期间必须有8个月的休息时间(州='8')
  • 每艘船必须每5个月进行一次定期维护(州='M')
  • 一艘船在某个月内只能进入一个州,但也可能没有州(开放/空置,'_')

目标函数表述:

定义松弛变量,计算计划偏离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)会产生错误。)

1 个答案:

答案 0 :(得分:0)

以下是一些建议:

  1. 采取绝对值

    在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
    
  2. 要查看“添加弹性”的解算器是否检查pulp.constants.LpStatusOptimal.的值如果此值为1,则问题解决为最优。 注意,典型的做法是添加虚拟松弛或剩余变量,在目标函数中给它一个小的惩罚。如果在解决方案中虚拟变量不为零,则意味着问题需要额外的“弹性”。

  3. 最后,我的主要建议是你从小开始,只有一个在PuLP中有效的最小例子。您甚至可以从case studies here之一开始。在每个步骤中,将LP写入文件并进行检查。这将立即告诉您哪些约束或变量已关闭,您可以更改它。

    class pulp.LpProblem(name='outfile.lp', sense=1)
    
  4. 希望这能让你前进。