Python 向PYSCIPOPT添加约束?

Python 向PYSCIPOPT添加约束?,python,optimization,scip,Python,Optimization,Scip,我创建了一个模型,但在理解如何列出公式、检索LP文件、约束列表以及理解是否正确输入了约束表达式时遇到了困难?优化在纸浆中有效,但在PYSCIPOPT中无效。请参阅下文: model = Model('name') shift_starts = {} load = {} capacity = {} unmet_demand = {} for zone in zones: for timeslot in timeslots: load[zone,timeslot] =

我创建了一个模型,但在理解如何列出公式、检索LP文件、约束列表以及理解是否正确输入了约束表达式时遇到了困难?优化在纸浆中有效,但在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()

我的约束设置是否正确?

请注意,由于某些变量尚未定义,现在无法执行代码。语法似乎还可以,但很抱歉,我们不会为您检查模型的正确性。我建议您使用model.writeProblemmodel.cip将模型导出为*.cip格式。这种格式是可读的,可以让您在代码中发现问题

谢谢,我觉得这个包的文档不是很清楚。创建.cip文件使我能够轻松地查看约束,发现一个小问题并加以纠正。这个模型现在似乎是正确的。有没有办法从.lp或.mps文件加载模型?还是保存为这些格式?我没有在文档中看到它。是的,您可以使用类似于m=Model的东西来阅读问题,然后使用m.readProblemmymodel.lp。