次のシステムで示されるいくつかの変数と制約があるとしましょう:
灰色の線は、その上の範囲によって指定された量だけ伸縮できます。青い線は単なる終点であり、灰色の線がどのように相互作用するかを示しています。
私の目標:線形計画法を使用して、図のように灰色の線のサイズを均等に最大化したいと考えています。バネが付いた灰色の線がすべて均等に外側に押し出されていることが想像できます。悪い解決策は、すべての青い線をできるだけ片側に寄せることです。この説明には少し余裕があり、複数の解決策が可能であることに注意してください。必要なのは、それらが合理的に均等であり、1 つの値が他のすべてを押しつぶしてしまうような最大値にならないようにすることだけです。
私が試した目的関数は、単純に行のサイズの合計を最大化します。
maximize: (B - A) + (C - B) + (C - A) + (D - C) + (E - B) + (E - D) + (F - E) + (F - D) + (F - A)
項が相殺され、ある行の増加は別の行のそれを同じ量だけ減少させるため、これが良い解決策ではないことは私には明らかです。
また、各線の距離を中間の可能な範囲から最小限に抑えようとしました。lineB - A
の場合、その範囲の中央値(1,3)
は です2
。最初の項の目的は次のとおりです。
minimize: |(B - A) - 2| + ...
絶対値を実装するために、用語を次のように置き換え、U
追加の制約を追加しました。
minimize: U + ...
with: U <= (B - A - 2)
U <= -(B - A - 2)
これには他の目的と同じ問題があります。差は常に別の線の差の変化に比例します。差を2乗できればうまくいくと思いますが、線形ソルバーでは入力できません。
私が求めているものを達成する目的関数はありますか、それとも線形ソルバーはこれに適したツールではありませんか?
役立つ場合は、Google OR-Tools を使用しています。
ここに書き出された制約があります:
1 <= B - A <= 3
0 <= C - B <= 1
1 <= C - A <= 4
9 <= E - B <= 11
7 <= D - C <= 11
0 <= E - D <= 1
3 <= F - E <= 5
3 <= F - D <= 6
15 <= F - A < = 15