2017-06-14 5 views
0

私の環境は次のとおりです。私は現在やっているのPython 3.5.2、4.2.0アナコンダ(32ビット)、Pyomo 4.4.1(VOTD)(W7にCPythonと3.5.2)、バロン17.3.31PyomoでMINLPを解く。 「実行可能な解決策を開始する」という設定はありますか?

PyomoとBaronをソルバーとして最適化する。テストの場合、minlp問題が使用されます。 main.pyコードを次のように実行して最適な解決策を得ることができます。コードを実行するたびに、最初の実行後に、初めての実行と同じ解決策が得られます。結果が表示されます:ローカル検索で完了

出発溶液は、xxxxxは
の値を持つ可能であるスタートLP
境界ローカル検索
解決行うマルチをスタート局所探索

開始可能な解決策は毎回同じです。

しかし、カーネルを再起動して(Spyderを再起動して)ファイルを再度実行すると、別の解決策が得られる可能性があります。どうして?最適化プロセスをリセットする方法はありますか?カーネルを再起動せずにさまざまな解決策を得るにはどうすればよいですか?など

助けてください... imp.reload(pyomo.environ)、imp.reload(pyomo.opt):

I'vは、いくつかの試みを行って。ありがとうございました。

メインファイル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

あなたはsolve()コールにkeepfiles=Trueを追加した場合、それが印刷されますBaronに送信される一時ファイル.barを出力します(BaronのNLファイルインターフェイスもサポートしています(baron_amplソルバーが必要です)。また、symbolic_solver_labels=Trueを追加すると、モデル上のオブジェクトの元の名前を使用してファイルを書き込むことで、このファイルを少し読みやすくなります。

異なる実行ごとにこれらのファイルを繰り返し処理することをお勧めします。たとえば、最初の反復で.barファイルが2つの異なる実行で同じであるが、その反復の後で解が異なる場合、非決定論的な振る舞いがBaronの内部にあることを意味します(おそらく、これを制御するBaronオプションがあります) 。それ以外の場合は、コード内で反復順序が実行ごとに変わる可能性のある場所を探します。これにより、特定の操作(辞書のキーを繰り返し処理する場所など)によって結果が異なる場合があります。

Pyomoソルバーのデフォルトの動作では、通常、同等のモデルの出力ファイルが同じに見えるようになります。そうでない場合は、オブジェクトが同じ順序で親ブロックに追加されていない可能性があります。この場合、ファイルベースのソルバーの呼び出しをsolve()に追加すると、file_determinism=3を追加できます。これにより、ファイルが書き込まれる前にいくつかのソートが追加され、出力ファイルが常に同じに見えるようになります。