我正在尝试将排班优化为一个(整数)线性问题来进行公式化。我遇到了一些编码问题(主要是由于Pulp),这与公式化相当分离。
问题如下:
在五年期间内(每月时间步长),安排n艘船只,受以下限制约束:
- 每月必须有一条船只处于“本地巡逻”状态(state = 'C') - 每年必须有一条船只进行“扩展巡逻”(state = 'A'),持续四个月,从7月到10月结束 - 每艘船只在五年期间内必须进行4个月的检查(state = '4') - 每艘船只在五年期间内必须有8个月的休息(state = '8') - 每艘船只大约每5个月需要进行常规维护(state = 'M') - 船只在特定月份只能处于一种状态,但它也可以没有状态(开放/空置,'_')
目标函数公式:
定义松弛变量来计算排班偏离5个月(“M”)维护计划的次数和数量。
如果需要,我可以解释设置,但现在我有一些基本问题可能是我的问题源头。
这是我的一个限制条件之一(blockList存储每艘船只的4个月和8个月块的开始时间):
我希望对上述表达式的左侧取绝对值,但我无法这样做,因为对象被初始化为pulp.LpVariable。有没有解决方法?
无论如何,这可能会或可能不会解决我的问题。如果不能解决,下一个问题是针对熟悉pulp的任何人。如何知道解决方案是否正确,或者求解器在后台添加了某种弹性?(使用该约束条件运行代码会导致错误结果,并且使用不同的求解器(如GLPK)会导致错误)。
问题如下:
在五年期间内(每月时间步长),安排n艘船只,受以下限制约束:
- 每月必须有一条船只处于“本地巡逻”状态(state = 'C') - 每年必须有一条船只进行“扩展巡逻”(state = 'A'),持续四个月,从7月到10月结束 - 每艘船只在五年期间内必须进行4个月的检查(state = '4') - 每艘船只在五年期间内必须有8个月的休息(state = '8') - 每艘船只大约每5个月需要进行常规维护(state = '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
我希望对上述表达式的左侧取绝对值,但我无法这样做,因为对象被初始化为pulp.LpVariable。有没有解决方法?
无论如何,这可能会或可能不会解决我的问题。如果不能解决,下一个问题是针对熟悉pulp的任何人。如何知道解决方案是否正确,或者求解器在后台添加了某种弹性?(使用该约束条件运行代码会导致错误结果,并且使用不同的求解器(如GLPK)会导致错误)。