我的环境是:Python的3.5.2,4.2.0蟒蛇(32位),Pyomo 4.4.1(VOTD)(上W7 CPython的3.5.2),男爵31年3月17日用Pyomo解决MINLP。有没有关于'开始可行的解决方案'的设置?
目前我做的Pyomo和Baron作为求解器进行优化。为了测试,使用minlp问题。我可以通过运行main.py代码来获得最佳解决方案,如下所示。每次运行代码时,在第一次运行后,我都会得到与第一次运行相同的解决方案。结果将会显示:
启动解决方案是为XXXXX
值可行的做本地搜索
解决边界LP
开始多启动本地搜索
与本地搜索完成
每次开始的可行解决方案都是一样的。
但是,在我重新启动内核(重新启动Spyder)并再次运行文件后,它可能会得到不同的解决方案。为什么?有什么方法可以重置优化过程吗?如何在不重新启动内核的情况下获得各种解决方案?
心中已经做了一些尝试:imp.reload(pyomo.environ),imp.reload(pyomo.opt)...等
请帮助。谢谢。
主文件main.py是如下:
from pyomo.environ import *
from pyomo.opt import SolverFactory
from minlp import model
instance = model.create_instance()
instance.dual = Suffix(direction=Suffix.IMPORT)
minlpopt = SolverFactory("baron")
results = minlpopt.solve(instance, tee=True)
print('Objective Fucntion: ' + str(instance.obj()))
模型文件minlp.py是如下:
from pyomo.environ import *
# SETS ========================================================================
model = ConcreteModel()
model.y1 = Var(within=Binary)
model.y2 = Var(within=Binary)
model.y3 = Var(within=Binary)
model.x1 = Var(within=PositiveReals, bounds=(0,2))
model.x2 = Var(within=PositiveReals, bounds=(0,2))
model.x3 = Var(within=PositiveReals, bounds=(0,1))
# RULE ========================================================================
def obj_rule(model):
return (5 * model.y1 + 6 * model.y2 + 8 * model.y3 + 10 * model.x1 \
- 7 * model.x3 - 18 * log(model.x2 + 1) \
- 19.2 * log(model.x1 - model.x2 + 1) + 10)
model.obj = Objective(rule=obj_rule, sense=minimize)
def c1_rule(model):
return (0.8 * log(model.x2 + 1) + 0.96 * log(model.x1 - model.x2 + 1) \
- 0.8 * model.x3) >= 0
model.c1 = Constraint(rule=c1_rule)
def c2_rule(model):
return (log(model.x2 + 1) + 1.2 * log(model.x1 - model.x2 + 1) - model.x3 \
- 2 * model.y3) >= -2
model.c2 = Constraint(rule=c2_rule)
def c3_rule(model):
return model.x2 - model.x1 <= 0
model.c3 = Constraint(rule=c3_rule)
def c4_rule(model):
return model.x2 - 2 * model.y1 <= 0
model.c4 = Constraint(rule=c4_rule)
def c5_rule(model):
return model.x1 - model.x2 - 2 * model.y2 <= 0
model.c5 = Constraint(rule=c5_rule)
def c6_rule(model):
return model.y1 + model.y2 <= 1
model.c6 = Constraint(rule=c6_rule)