Исходная библиотека LPSolve C ++ и IDE дают разные результаты решения задач LP

У меня есть задание 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

1

Решение

Итак, я разговаривал с каким-то парнем, который много раз использовал 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 тоже есть правильное решение.

Итак, прежде чем вы решите, что решатель пишет неправильное решение, вам нужно проверить модель, целевую функцию, уравнения и ограничения, и попытаться заменить значения результата на ограничения, чтобы получить удовлетворенные уравнения, или попытаться решить двойственную задачу.

В следующий раз я попытаюсь найти специальных констант в целевой функции. Может быть, это может кому-то помочь.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]