最適化計算のヒントになる情報っぽい各ファイルを比較
一度計算した最適解を次の計算でも使いたいな〜というのは誰しも思うものかと思いますが.gurobiのマニュアルを見ていると,mstやらsolやらhntやら,いくつか種類があってよくわかりません.
ですので,いろいろ試してみました.結論からいうと,
- write("~.sol) : 計算で得られた解を出力
- write("~.mst) : 計算で得られた解のうち整数変数の値を出力
- write("~.hnt) : 何も出力されない
という感じのようです.以下,ためした結果です.
solはsolutionの略でしょうから,変数のタイプに関わらず計算で得られた解が出てくるのは自然でしょう.
mstはMIP Startの略でしょうか,整数変数がいくつ?という情報です.ですので連続変数は無視されます.
そしてhntはヒントという意味で,変数ごとに値と優先順位を指定し,gurobiはそれを参考にして整数混合問題を解きます.(これは私の解釈ですが)mstやsolの場合は ”最適化の初期解" として解釈されるのに対して,こちらはあくまでヒントです.計算する前に「最適解はたぶんこんな値だと思うよ.その優先順位としてはこんな感じね」という情報を与えて,それを参考にしながらgurobiが計算することになるんだと,いうことのようです.
solをmodel.read( )すると,それが実行不可能(infeasible)だった場合に,無視されて普通に計算がなされますが,hntだと実行不可能だとしても参考くらいにはしてくれるのかな?
しかしhntファイルはgurobiではwriteで出力できないようですんで,手打ちするしかないのか?そんなバカな.いくら変数全部の情報を入力しなくてもいいとはいえ.(hntファイルはモデルに含まれるすべての変数の情報を与えなくてもgurobiはそれを参考にしてくれます.情報のない変数については無視され,普通に計算が始まります.)
なんとかならないかなっと思って強引にやったのがこちら.
我ながらひどいことをすると思います.
gurobiは拡張子を見てそのファイルがなんなのかを判断するようなので,拡張子だけ変えてしまえばsolファイルをhntファイルとしてreadしてくれるわけです.各ファイルの一行目に書いてあることはコメントであって無視されるのできっと大丈夫.
やってみて意味があったかどうか,今ちょっと時間がないので,後ほどレビューしたいと思います.ではまた.
ーーーーーーーーーーーー
追記
拡張子を変えてhntファイルとして読み込ませることには成功しました.
Found heuristic solution: objective ○○○
と出てきました.heuristic solutionを見つけた,ということは,ヒントをもとに実行可能解を見つけたということで,solファイルのように与えられた解をそのまま初期解として使いますよ,というのとは若干違うんじゃないかなと思います.
(すみません見間違えてました.)
hntファイルとsolファイルの違いについては,gurobiのこちらのサイトに詳しく記載がありました.
VarHintValというのは,変数のattributeで,変数のヒントの値のことですね.こちらによると,ざっくり言えば
solファイルとhntファイルは似てるように思うかもしれないけど,与えた後の振る舞いが違うよ,solファイルは初期解だけど,hntファイルは解き方に影響を与えるよ,だからいいhntだったら意味あるけどよくないhntだったらむしろ与えないほうがいいよ,
みたいな感じらしいです.(英語得意じゃないんで違ってたらごめんなさい)
ではまた.