1

我在 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 内部的表达式是常量,因此可以预先计算整个事情,或者它是否每次都重新计算表达式,我怎样才能把它写得更优雅方式。

4

2 回答 2

1

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

于 2016-04-07T15:26:49.820 回答
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]);
于 2016-04-07T19:07:29.500 回答