线性规划与Python(纸浆)-调度

线性规划与Python(纸浆)-调度,python,linear-programming,pulp,Python,Linear Programming,Pulp,我试图通过将日程安排表述为一个(整数)线性问题来优化日程安排。我在编码部分遇到了一些问题(主要是由于纸浆),它与配方相当分离 问题: 附表n在5年内装运(以月为单位的时间步长),受以下限制: 每月必须有一艘且仅有一艘船舶在“本地巡逻”(州=‘C’) 每年只有一艘船只必须进行“延长巡逻”(州为“A”),即从7月到10月为期四个月的封锁 每艘船舶必须在5年内进行一次为期4个月的检查(状态为“4”) 每艘船舶在5年期间必须有一次8个月的休息(状态='8') 每艘船舶必须大约每5个月进行一次定期维护(

我试图通过将日程安排表述为一个(整数)线性问题来优化日程安排。我在编码部分遇到了一些问题(主要是由于纸浆),它与配方相当分离

问题:

附表n在5年内装运(以月为单位的时间步长),受以下限制:

  • 每月必须有一艘且仅有一艘船舶在“本地巡逻”(州=‘C’)
  • 每年只有一艘船只必须进行“延长巡逻”(州为“A”),即从7月到10月为期四个月的封锁
  • 每艘船舶必须在5年内进行一次为期4个月的检查(状态为“4”)
  • 每艘船舶在5年期间必须有一次8个月的休息(状态='8')
  • 每艘船舶必须大约每5个月进行一次定期维护(状态='M')
  • 一艘船在一个月内只能处于一种状态,但也可以没有状态(打开/空闲,'.''.'状态)
目标函数公式:

定义计算进度计划偏离5个月(“M”)维护计划次数(和数量)的松弛变量

如果需要的话,我可以解释更多的设置,但是现在我有一些基本的问题可能是我的问题的根源

以下是我的一个限制条件(区块列表存储每艘船4个月和8个月区块的开始):

#在5年的计划中,每艘船必须有一个8舱和一个M4舱,间隔必须在2到3年之间
对于ship_列表中的n:
prob+=块列表[n][0]-块列表[n][1]>=24

prob+=blockList[n][0]-blockList[n][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
    
  • 要查看解算器是否需要“添加弹性”,您需要检查
    纸浆.常量.LpStatusOptimal.
    的值。如果该值为1,则问题被解决为最优注意典型的做法是添加一个虚拟松弛或剩余变量,在目标函数中给它一个小的惩罚。如果在解决方案中,虚拟变量不是零,这意味着问题需要额外的“弹性”

  • 最后,我的主要建议是从小事做起,用一个在纸浆中起作用的最小的例子。你甚至可以从其中一个开始。在每一步中,将您的LP写入一个文件并检查它。这将立即告诉您哪些约束或变量处于禁用状态,您可以对此进行更改

    class pulp.LpProblem(name='outfile.lp', sense=1)
    

  • 希望这能让你进步。

    谢谢你,拉姆,我最终还是用案例让它发挥作用。但我无法使用通用的“>”操作。嗨@Ram。请回答这个问题
    class pulp.LpProblem(name='outfile.lp', sense=1)