自定义约束处理程序pyscipopt

问题描述

我有一个大的混合整数问题,它具有很多线性约束,并且在多个变量上都有一个非线性约束。实现非线性约束将直接导致IPOPT求解器的调用-比MILP的性能要慢得多。我当时在想,通过实现自定义约束处理程序,可以避免使用IPOPT,从而获得更好的解决方性能。但是,由于缺少有效的示例,即使使用自定义约束处理程序的非常简单的模型也无法正确运行。在具有非线性约束myconstraintMyConshdlr的简单示例中,有什么问题?

from pyscipopt import Model,Conshdlr,SCIP_RESULT

class MyConshdlr(Conshdlr):
    def __init__(self,variables):
        self.variables = variables

    def myconstraint(self,solution=None):
        x1 = self.variables[0]
        x2 = self.variables[1]
        x1_val = self.model.getSolVal(solution,x1)
        x2_val = self.model.getSolVal(solution,x2)
        return x1_val * x2_val - x1_val * x1_val + x2_val * x2_val >= 5

    def conscheck(self,constraints,solution,check_integrality,check_lp_rows,print_reason,completely,**results):
        if self.myconstraint(solution):
            return {"result": SCIP_RESULT.FEASIBLE}
        else:
            return {"result": SCIP_RESULT.INFEASIBLE}

    def consenfolp(self,n_useful_conss,sol_infeasible):

        if self.myconstraint():
            return {"result": SCIP_RESULT.FEASIBLE}
        else:
            return {"result": SCIP_RESULT.BRANCHED}

    def conslock(self,constraint,locktype,nlockspos,nlocksneg):
        pass

model = Model("Example")  # model name is optional
x = model.addVar("x")
y = model.addVar("y",vtype="INTEGER")
model.setobjective(x + y)
model.addCons(2*x + y >= 0)
model.addCons(x - 2*y >= 0)
conshdlr = MyConshdlr([x,y])
model.includeConshdlr(conshdlr,"my cons","my cons detail",needscons=True,chckpriority = -10)
model.addPyCons(model.createCons(conshdlr,"cons1name"))


model.optimize()
sol = model.getBestSol()
print("x: {}".format(sol[x]))
print("y: {}".format(sol[y]))

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)