2016-04-06 18 views
1

コスト関数で幾何学的距離を使用するMathProgにドメイン問題の定式化があります。データセットにはX、Y座標のみが含まれ、実際の距離は含まれません。mathprogの行列の "事前計算"

minimize total: sum{(f, c) in S} x[f, c] * sqrt(((facilityXs[f] - customerXs[c])**2) + ((facilityYs[f] - customerYs[c])**2)); 

そしてMathProgコンパイラはsqrtの内部表現は、一定のため、全体のことを事前に計算することができ、またはかどうかであることを確認するために十分にスマートであるかどうか私は、知りたい:今、私の製剤は、直接距離を計算しますそれは毎回式を再計算し、どのようにすればより洗練された方法で書くことができます。

答えて

1

はいMathProg「コンパイラ」は十分にスマートです。パラメータだけを含むすべての方程式を事前計算します(1つのセルにつき1つの数値だけを含む計算行列を作成します)。 sqrt()のような非線形関数に変数を入れると、事前計算は失敗します。

よりエレガントな方法は、コアの一連の式を線形に保つことです。私はしばしば、 'prequations'で計算された別々のパラメータを使用して、主要な処方をきれいでシンプルに保ちます。

param distance{(f,c) in S} := sqrt(((facilityXs[f] - customerXs[c])**2) + ((facilityYs[f] - customerYs[c])**2); 

minimize total: sum{(f, c) in S} x[f, c] * distance[f,c]); 
+0

距離「行列」を作成する方法を示すために受け入れられました。 (私はそれを間もなく考え出したにもかかわらず) – Xarn

1

sqrtの式に変数が含まれていない場合は、変換ステージで評価され、定数(係数:x[f, c])としてソルバーに送信されます。