"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]);
我在 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]);