【问题标题】:Modifying Gurobi objective function for MIP scheduling problem in python在 python 中修改 MIP 调度问题的 Gurobi 目标函数
【发布时间】:2021-04-20 21:49:45
【问题描述】:

我开始使用 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]

我现在想扩展我的目标函数,以奖励 N 天的计划间隔(例如,每次计划相隔 4 天的事件都会产生 -20 的成本)。我可以用gap_array = days[:, np.newaxis] - days 列出所有可能的日程安排间隔。我是否通过蛮力循环,并且 gap_array 是我的目标差距的每个点都在目标中添加一个术语?

【问题讨论】:

    标签: python gurobi


    【解决方案1】:

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

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

    【讨论】:

    • 非常好的单线解决方案。看起来乘法必须在另一边才能使其工作,m.setObjective(sched@cost - sched[:6]@sched[4:]*10)
    猜你喜欢
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多