下記問題が発生しました。
x1, x2,x3.. 等の定義順とソルバの定義順が異なるので、変換テーブルが必要になる。この後の操作で、いちいち変換テーブル参照が必要となりバグの温床になる。
https://schedule-nurse.blogspot.com/2026/02/cnf2lp.html
原因
Highs/COPT等では、出現順に変数を設定してしまう
解決策
目的関数記述時に全変数をなめる。
Minimize
obj: 0 x1 + 0 x2 + 0 x3 + 0 x4 + 0 x5 + 0 x6 + 0 x7 + 0 x8 + 0 x9 + 0 x10 + 0 x11 + 0 x12 + 0 x13 + 0 x14 + 0 x15 + 0 x16 + 0 x17 + 0 x18 + 0 x19 + 0 x20 + 0 x21 + 0 x22 + 0...
のような感じです。これで変換テーブルが必要なくなり、LPファイルを読み込ませた後のAPI操作が楽になります。
void writeToFile(const std::string& filename) {
std::ofstream out(filename);
// 1. 目的関数ですべての変数を順番に「宣言」する
out << "Minimize\n obj: ";
for (int i = 1; i <= max_idx; ++i) {
double coeff = 0.0;
if (weights.count(i)) {
coeff = weights[i];
}
// 符号と項の出力
if (i > 1) {
out << (coeff >= 0 ? " + " : " - ");
} else if (coeff < 0) {
out << "- ";
}
out << std::abs(coeff) << " " << getVarName(i);
}
out << "\n";
// 2. 制約式
out << "Subject To\n";
// ... (以下略) ...
}
0 件のコメント:
コメントを投稿