ソルバー基盤を使用して次の問題を解決しようとしています:
指定:範囲: {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 よりも優れたソフトウェア ソリューションがありますか。