"Precomputation" mathprog 中的矩阵

"Precomputation" of a matrix in 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 中的表达式是常量,从而可以预先计算整个事情,或者是否每次都重新计算表达式,我该如何写以更优雅的方式。

如果sqrt中的表达式不包含变量,那么它会在翻译阶段被评估并作为常量(系数x[f, c])发送给求解器。

是的,MathProg 'compiler' 足够聪明。它将预先计算仅包含参数的所有方程(然后创建一个每个单元格仅包含一个数值的计算矩阵)。如果您将变量放在非线性函数中,例如 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]);