"Предварительный расчет" матрицы в 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 ответа
Да, "компилятор" MathProg достаточно умен. Он будет предварительно вычислять все уравнения, содержащие только параметры (а затем создаст вычислительную матрицу, содержащую только одно числовое значение на ячейку). Если вы поместите переменные в нелинейные функции, такие как sqrt()
предварительное вычисление не удастся.
Более элегантный способ - сохранить линейный набор основных уравнений. Я часто использую отдельные параметры, рассчитанные по "преквациям", чтобы основные формулировки были чистыми и простыми.
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]);
Если выражение внутри sqrt
не содержит переменных, то он будет оценен на этапе перевода и отправлен решателю как константа (коэффициент x[f, c]
).