针对 python 中的 MIP 调度问题修改 Gurobi objective 函数

Modifying Gurobi objective function for MIP scheduling problem in python

我开始使用 Gurobi 优化器进行调度,需要一些帮助才能使事情变得更复杂。

这是一个安排 3 个事件的工作示例,其约束条件是事件不能在连续的时隙中并且成本随时间线性上升。

import numpy as np
import gurobipy as gp
from gurobipy import GRB

m = gp.Model("example")
days = np.arange(10)
sched = m.addMVar(10, vtype=GRB.BINARY)
# Demand 3 scheduled events
m.addConstr(sched.sum() == 3)
# Constrain that can't schedule consecutive time slots
m.addConstrs(sched[i+1] @ sched[i] == 0 for i in range(9))
# Cost increases linearly with time
cost = np.arange(1, 11)
# Objective function
m.setObjective(sched @ cost, GRB.MINIMIZE)
m.optimize()
print(m.X)

这给出了正确的结果:[1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0]

我现在想扩展我的 objective 功能以奖励 N 天的时间间隔(例如,每次间隔 4 天安排活动的费用为 -20)。我可以用 gap_array = days[:, np.newaxis] - days 制作一个包含所有可能的时间表差距的数组。我是否会用暴力循环遍历那个 gap_array 是我的目标差距的每个点,并在 objective 中添加一个术语?

您需要为 N 天的每个组合测量一些东西。例如,对于 4 天的差异,您需要一个术语 (0,4)、(1,5)、(2,6)、(3,7)、(4,8) 和 (5,9)。在内部,求解器将为这些组合中的每一个添加一个新的二进制变量,但是您可以通过编写如下内容来保持当前样式:

m.setObjective(sched@cost -10 * sched[:6]@sched[4:])