我在MathProg中有一个域问题公式,其中成本函数使用几何距离。数据集仅包含X,Y坐标,而不包含实际距离。现在,我的公式直接计算距离:
minimize total: sum{(f, c) in S} x[f, c] * sqrt(((facilityXs[f] - customerXs[c])**2) + ((facilityYs[f] - customerYs[c])**2));
我想知道,MathProg编译器是否足够聪明,可以看到sqrt中的表达式是常量,因此可以预先计算整个事物,或者每次都重新计算表达式,以及如何将其写入更优雅的方式。
答案 0 :(得分:1)
如果sqrt
内的表达式不包含变量,那么它将在转换阶段进行评估,并作为常量(系数x[f, c]
)发送给求解器。
答案 1 :(得分:1)
是MathProg'编译器'很聪明。它将预先计算所有仅包含参数的方程(然后创建一个每个单元只包含一个数值的计算矩阵)。如果将变量放在非线性函数(如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]);