"预计算" mathprog中的矩阵

时间:2016-04-06 20:43:38

标签: ampl glpk mathprog

我在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中的表达式是常量,因此可以预先计算整个事物,或者每次都重新计算表达式,以及如何将其写入更优雅的方式。

2 个答案:

答案 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]);