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