【问题标题】:Adding constraints to PYSCIPOPT?向 PYSCIPOPT 添加约束?
【发布时间】:2020-02-07 20:06:01
【问题描述】:

我创建了一个模型,但无法理解如何列出我的公式(检索 LP 文件、约束列表)以及理解我是否正确输入了约束表达式?优化适用于 PULP,但不适用于 PYSCIPOPT。请看下面:

model = Model('name')

shift_starts = {}
load = {}
capacity = {}
unmet_demand = {}

for zone in zones:

    for timeslot in timeslots:

        load[zone,timeslot] = model.addVar(vtype="C",name="load(%s,%s)" % (zone,timeslot), lb=0.0)
        capacity[zone,timeslot] = model.addVar(vtype="C",name="capacity(%s,%s)" % (zone,timeslot), lb=0.0)
        unmet_demand[zone,timeslot] = model.addVar(vtype="C",name="unmet_demand(%s,%s)" % (zone,timeslot), lb=0.0)


        for length in shift_lengths:

            shift_starts[zone,length,timeslot] = model.addVar(vtype="I",name="shift_starts(%s,%s,%s)" % (zone,length,timeslot), lb=0) 


for zone in zones:

    for timeslot in timeslots[:11]:

        rhs = Expr()

        for length in shift_lengths:

            if length - timeslot > 1:


                rhs += quicksum(shift_starts[zone, length, timeslot2] for timeslot2 in timeslots[timeslot-length+1:])

                rhs += quicksum(shift_starts[zone, length, timeslot2] for timeslot2 in timeslots[:timeslot+1])

            else:

                rhs += quicksum(shift_starts[zone, length, timeslot2] for timeslot2 in timeslots[timeslot-length+1:timeslot+1])

        model.addCons(capacity[zone,timeslot] <= rhs*productivity[zone][0], name="capacity(%s,%s)" % (zone,timeslot))

for zone in zones:

    for timeslot in timeslots[12:]:

        rhs = Expr()

        for length in shift_lengths:

            rhs += quicksum(shift_starts[zone, length, timeslot2] for timeslot2 in timeslots[timeslot-length+1:timeslot+1])

        model.addCons(capacity[zone,timeslot] <= rhs*productivity[zone][0], name="capacity(%s,%s)" % (zone,timeslot))

for zone in zones:

    for timeslot in timeslots:

        model.addCons(unmet_demand[zone, timeslot] >= load[zone, timeslot] - capacity[zone, timeslot], name="unmet_demand(%s,%s)" % (zone,timeslot))

for zone in zones:

    model.addCons(load[zone,0] >= unmet_demand[zone,(t-1)] + arrivals[zone][0], name="load(%s,%s)" % (zone,timeslot))

    for timeslot in timeslots[1:]:

        model.addCons(load[zone,timeslot] >= unmet_demand[zone,timeslot-1] + arrivals[zone][timeslot], name="load(%s,%s)" % (zone,timeslot))

rhs = Expr()

for length in shift_lengths:

    model.addCons(quicksum(shift_starts[zone, length, timeslot] for zone in zones for timeslot in timeslots) <= max_shifts[length-1], name="shifts(%s)" % (length))

    rhs += quicksum(shift_starts[zone, length, timeslot] for zone in zones for timeslot in timeslots) * length

model.setObjective(quicksum(shift_starts[zone,length,timeslot]  for (zone, length, timeslot) in shift_starts), "minimize")

model.optimize()

我的约束设置是否正确?

【问题讨论】:

    标签: python optimization scip


    【解决方案1】:

    请注意,现在无法执行您的代码,因为一些变量尚未定义。语法似乎没问题,但很抱歉,我们不会为您检查模型的正确性。我建议您使用model.writeProblem("model.cip") 将您的模型导出为 *.cip 格式。这种格式是人类可读的,可能允许您在代码中发现问题。

    【讨论】:

    • 谢谢,我没有找到关于这个包的文档很清楚。创建 .cip 文件使我可以轻松地查看约束,发现一个小问题并加以纠正。该模型现在似乎是正确的。有没有办法从 .lp 或 .mps 文件加载模型?或保存为这些格式?我没有在文档中看到它。
    • 是的,您可以使用m = Model()m.readProblem("mymodel.lp") 之类的方式阅读问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 2013-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多