У меня есть задание LP. Проблема появилась внезапно. Я использую автоматизированный код для создания целевой функции, уравнений и ограничений из двух векторов узлов и линий, также я использую метод для создания кода моей задачи в формате LPSolve и записываю его в файл.
Например:
/* Objective function */
max: +y4 +y5 +y6;
/* Constraints */
n1: +x4 -y4 -z4_5_4 -z4_6_5 +z5_4_8 +z6_4_9 = 0;
n2: +x5 -y5 +z4_5_4 -z5_6_6 +z6_5_7 -z5_4_8 +z6_5_10 -z5_6_11 = 0;
n3: +x6 -y6 +z4_6_5 +z5_6_6 -z6_5_7 -z6_4_9 -z6_5_10 +z5_6_11 = 0;
/* Variable bounds */
x4 <= 16210;
x5 <= 16600;
x6 <= 17950;
y4 <= 15000;
y5 <= 15000;
y6 <= 15000;
z4_5_4 <= 2000;
z4_6_5 <= 2000;
z5_6_6 <= 1000;
z6_5_7 <= 1000;
z5_4_8 <= 2000;
z6_4_9 <= 2000;
z6_5_10 <= 1000;
z5_6_11 <= 1000;
После создания и записи уравнений в файл я выполняю решатель:
int result = solve(lp);
Обычно для задач со случайными значениями я получаю следующие результаты:
Var-s Result
45000
x4 15000
x5 15000
x6 15000
y4 15000
y5 15000
y6 15000
z4_5_4 0
z4_6_5 0
z5_4_8 0
z5_6_11 0
z5_6_6 0
z6_4_9 0
z6_5_10 0
z6_5_7 0
Но в LPSolve IDE у меня есть такие результаты (и я думаю, что это точные результаты):
Var-s Result
45000
x4 16210
x5 16600
x6 12190
y4 15000
y5 15000
y6 15000
z4_5_4 400
z4_6_5 810
z5_4_8 0
z5_6_11 1000
z5_6_6 1000
z6_4_9 0
z6_5_10 0
z6_5_7 0
На каком-то форуме я читал, что лучше использовать «1Е-5» вместо «0» а также «1000» вместо «1,0» в качестве коэффициентов в моей целевой функции. Я попытался сделать это, и я получил те же результаты в решающей среде и в моей программе, но результаты не были изменены для случайных значений в задаче.
Итак, мне нужно получить результаты, как в LPSolve IDE (в конце написано), но использовать мою программу. Если это возможно, пожалуйста, помогите мне.
Используемые версии LPSolve v-5.5.2.3, v-5.5.2.0
Итак, я разговаривал с каким-то парнем, который много раз использовал LPSolve и знает некоторые подводные камни. В моем вопросе у меня есть уравнения и ограничения, если мы заменим неизвестные значения x, y, z на полученное решение, уравнения будут удовлетворены.
/* Constraints */
n1: +x4 -y4 -z4_5_4 -z4_6_5 +z5_4_8 +z6_4_9 = 0;
n2: +x5 -y5 +z4_5_4 -z5_6_6 +z6_5_7 -z5_4_8 +z6_5_10 -z5_6_11 = 0;
n3: +x6 -y6 +z4_6_5 +z5_6_6 -z6_5_7 -z6_4_9 -z6_5_10 +z5_6_11 = 0;
/* satisfied equations */
n1: +15000 -15000 -0 -0 +0 +0 = 0;
n2: +15000 -15000 +0 -0 +0 -0 +0 -0 = 0;
n3: +15000 -15000 +0 +0 -0 -0 -0 +0 = 0;
LPSolve найдет оптимальное решение и напишет несколько разных решений в IDE, программе и т. д.
В этой ситуации, когда Y — это нагрузка, X — это генерация, Z — это потоки, а когда меньше — генерация нагрузки, нам не нужны потоки в систему балансировки, и в программе у меня есть решение, как в примере, но в IDE тоже есть правильное решение.
Итак, прежде чем вы решите, что решатель пишет неправильное решение, вам нужно проверить модель, целевую функцию, уравнения и ограничения, и попытаться заменить значения результата на ограничения, чтобы получить удовлетворенные уравнения, или попытаться решить двойственную задачу.
В следующий раз я попытаюсь найти специальных констант в целевой функции. Может быть, это может кому-то помочь.
Других решений пока нет …