2

ソルバー基盤を使用して次の問題を解決しようとしています:

指定:範囲: {x | x から double} とポイント: {(x,y) | x,y from double}

区分線形関数を見つける - { (a,b) | a,b from double} ここで:

  • 描画された直線は範囲からの x の間にあります。
  • すべてのポイントを網羅しています。
  • グラフの下の最小領域。

例:範囲: {1, 2, 3} , ポイント {(1,40), (1.5,40), (2.5,70)}

ここに画像の説明を入力

私の解決策:

シンプレックスで次の問題を最小限に抑えます。

foreach i 範囲追加:

var ai = new Decision(Domain.RealRange(0, 100), null);
var bi = new Decision(Domain.RealRange(0, 100), null);
model.AddDecisions(a, b);

i 範囲に入るポイントからの foreach ポイント 制約を追加

model.AddConstraints("c{0}".F(pointIdx), a * point.x + b >= point.y);

次に、目標を追加します。

model.AddGoal("area", GoalKind.Minimize, goal);

そして解決策を得る:

var solution = context.Solve(new SimplexDirective());

解決策は正しい答えを与えてくれますが、130ミリ秒かかる単純なケースでは時間がかかります。私が間違っていることを教えていただけますか?どこで最適化できますか? この場合、Simplex 法は適切ですか? 最適化のための SolverFoundation よりも優れたソフトウェア ソリューションがありますか。

4

1 に答える 1

1

OML 文字列からモデルを読み込んでみてください。シンプレックス ソルバーを強制して、問題が LP かどうかを確認してください。

于 2013-12-04T05:32:27.000 に答える