6

COIN-OR の CBC ソルバーを使用して、いくつかの数値最適化問題を解決しています。PuLP を介して Python で最適化問題を構築しています。

GUROBI や CPLEX などのソルバーがログ ファイルを作成することに気付きましたが、(オプティマイザーの進行状況を画面に出力するのではなく) CBC にログ ファイルを作成させる方法がわかりません。

ログファイルを設定するCBCのオプションを知っている人はいますか? すべての stdout をファイルにリダイレクトしてもうまくいきません。これは、多数の問題を並行して解決していて、それらのログ ファイルを分けておきたいからです。

ソルバーを呼び出す方法の例を次に示します。これはうまく機能し、進行状況を端末に出力します。

prob.solve(pulp.COIN_CMD(msg=1, options=['DivingVectorlength on','DivingSome on']))

これは、ソリューションをどのように構成する必要があると私が考えるかです (ただし、明らかにLogFileNameは有効な CBC オプションではありません)。

prob.solve(pulp.COIN_CMD(msg=1, options=['DivingVectorlength on', 'DivingSome on', 'LogFileName stats.log']))

これに関するヘルプは大歓迎です。私はこれを理解しようとして、インターネット、ドキュメント、および CBC のインタラクティブ セッションを何時間も調べてきました。

4

3 に答える 3

3

ソースコードを変更しないと解決できませんでしたがpulp、それでもよろしければ、次のルートをたどってください。

パルプ インストール ライブラリのディレクトリに移動し、solvers.pyファイルを確認します。

対象の関数はsolve_CBCクラスにありCOIN_CMDます。そのメソッドでは、引数が単一のコマンドに形成されてcbc-64ソルバー プログラムに渡され、subprocess.Popenメソッドを使用して呼び出されます。このstdoutメソッドの引数は、に設定されているNoneos.devnull、どちらもあまり役に立ちません。行 1340 でプロセス コールを確認できます (PuLP 1.5.6 の場合)。

cbc = subprocess.Popen((self.path + cmds).split(), stdout = pipe,
                     stderr = pipe)

このソースは、問題 (mps) ファイルと解決策 (sol) ファイルが/tmpディレクトリ (UNIX マシン上) に書き込まれ、ファイル名にpidそれを呼び出すインタープリターの が含まれていることも明らかにしています。この ID を使用してファイルを開き、その引数に渡します。このような:

logFilename = os.path.join(self.tmpDir, "%d-cbc.log" % pid)
logFile = open(logFilename, 'a')
cbc = subprocess.Popen((self.path + cmds).split(), stdout = logFile,
                     stderr = pipe)

案の定、/tmp実行後にディレクトリにログファイルが表示されます。log Nそこにある詳細なドキュメントについては、cbc ヘルプを参照して詳細度を設定できます。これにより、プロセス ID ごとに異なるファイルが作成されるため、複数のソルバーを並行して実行するという問題が解決されると思います。

于 2015-02-11T23:07:57.583 に答える