【问题标题】:Linear Programming with Python (Pulp) - Scheduling使用 Python (Pulp) 进行线性规划 - 调度
【发布时间】:2013-09-18 11:05:53
【问题描述】:

我正在尝试通过将时间表表述为(整数)线性问题来优化时间表。我在编码部分遇到了一些问题(主要是由于纸浆),这与公式完全不同。

问题:

在 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 等不同的求解器会产生错误)。

【问题讨论】:

    标签: python linear-programming pulp


    【解决方案1】:

    以下是一些建议:

    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)
      

    希望这能让你继续前进。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-26
    • 2023-01-11
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多