2017-06-14 40 views
0

我的环境是: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) 

回答

1

如果添加keepfiles=Truesolve()调用,它将打印输出发送给Baron的临时.bar文件(请注意,我们也支持到Baron的NL文件界面,这需要求解器baron_ampl)。另外,通过使用模型上的对象的原始名称来编写文件,添加symbolic_solver_labels=True将使该文件更容易阅读。

我会推荐在每次迭代中对这些文件进行不同的运行。例如,如果第一次迭代的.bar文件对于两次不同的运行是相同的,但在迭代之后解决方案是不同的,这意味着非确定性行为在Baron内部(也许有一个Baron选项来控制它) 。否则,请在您的代码中查找迭代顺序可能会从运行变为运行的地方,这可能会导致某些操作(例如,遍历字典键的位置)的不同结果。

Pyomo解算器的默认行为通常足以使输出文件对于等效模型看起来相同。如果不是这种情况,那很可能是因为对象没有以相同的顺序添加到父块中。在这种情况下,您可以尝试将file_determinism=3添加到调用基于文件的求解器的solve()。这会在文件写入之前发生一些额外的排序,这可确保输出文件始终看起来相同。

相关问题