x1
+x2
+x3
+x4
x1
+x2
+x3
+x4
x1
+x2
+x3
+x4
x1
+x2
+x3
+x4
x1
+x2
+x3
+x4
a
b
c
d
x
y
z
AC
i
Randomize
Про калькулятор двоїстого симплекс-методу
Розв'яжіть задачі лінійного програмування двоїстим симплекс-методом онлайн з симплекс-таблицею та детальним покроковим розв'язком. з повним, детальним, покроковим описом розв'язань, що розв'язує задачі лінійного програмування розміром до 20×20 з коефіцієнтами таких типів: десяткові числа та дроби.
Щоб почати обчислення, спочатку необхідно ввести розміри задачі у поля вводу у верхній частині екрана, а також вибрати потрібну операцію з бічного меню.
Нижче знаходиться вікно вводу, де за допомогою клавіатури потрібно ввести коефіцієнти, обмеження та значення правих частин. Тут також розташована панель керування вводом, яка спрощує роботу із задачами ЛП і містить такі елементи керування:
- Перший елемент дозволяє розгорнути вікно вводу. Це може бути особливо корисно, коли таблиця не вміщається повністю на екрані. Якщо таблиця все ще не повністю видна після розгортання вікна, можна змінити масштаб за допомогою кнопок + / -;
- Другий елемент копіює поточні вхідні дані задачі до буфера пам'яті. Це може бути корисно, коли ви часто розв'язуєте ту саму задачу ЛП або потрібно переносити дані між операціями;
- Останній елемент вставляє раніше скопійовані вхідні дані, що дозволяє відновити дані задачі лише кількома кліками замість повторного введення вручну;
Далі внизу знаходиться панель інструментів, яка дозволяє налаштувати калькулятор та спростити роботу з ним. Вона візуально розділена на три частини, кожна з яких відповідає за таку функціональність:
- Перша частина дозволяє вибрати формат чисел при відображенні результату розв'язання. Також можна вимкнути покрокові коментарі, якщо ви вже розумієте метод і потребуєте лише перевірки власних обчислень, або приховати покрокове розв'язання повністю, якщо потрібна лише кінцева відповідь;
- Друга частина містить кнопки для зміни розмірів таблиці вводу, очищення окремих коефіцієнтів або всього вводу, а також головну кнопку зі знаком рівності, що переводить на екран розв'язання. Всі ці кнопки продубльовані клавіатурними скороченнями. Наведіть курсор на кнопку, щоб побачити відповідну клавішу у підказці. Також можна використовувати клавіші зі стрілками для переміщення курсора між полями вводу;
- Остання частина дозволяє вибрати кількість знаків після коми для округлення нецілих результатів. Попередній перегляд показує, як виглядатимуть округлені значення;
Що таке двоїстий симплекс-метод?
Двоїстий симплекс-метод розв'язує задачі лінійного програмування, використовуючи двоїсте співвідношення до стандартного симплексу. Він особливо корисний, коли пряма задача починається недопустимою, але двоїсто допустимою — ситуація, що виникає природно після додавання нових обмежень до вже розв'язаної ЗЛП або при мінімізації задачі, де всі праві частини від'ємні. На відміну від прямого симплексу, який підтримує пряму допустимість протягом усього процесу, двоїстий симплекс підтримує двоїсту допустимість і спрямовує таблицю до прямої допустимості.
Як розв'язати задачу лінійного програмування двоїстим симплекс-методом?
Починайте з таблиці, що є двоїсто допустимою (всі скорочені витрати невід'ємні для задачі мінімізації), але не обов'язково прямо допустимою (деякі базисні змінні можуть бути від'ємними). На кожній ітерації спочатку застосовуйте правило вибору вихідної змінної: оберіть найбільш від'ємну базисну змінну як вихідну. Потім застосуйте правило вхідної змінної: серед усіх стовпців з від'ємним коефіцієнтом у вихідному рядку оберіть той із найменшим абсолютним відношенням скороченої вартості до цього коефіцієнта. Виконайте поворот і повторюйте, доки всі базисні змінні не стануть невід'ємними, отримуючи оптимальний прямо допустимий розв'язок.
Приклад розв'язання задачі лінійного програмування двоїстим симплекс-методом
| B | Cb | P | x1 | x2 | x3↓ | x4 | x5 | x6 | x7 | x8 | x9 | Q |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 600 | 225 | 1000 | -150 | 0 | 0 | 0 | M | M | ||||
| x8← | M | 3 | 2 | 0 | 5 | 0 | 0 | -1 | 0 | 1 | 0 | 35 |
| x9 | M | 4 | 1 | 0 | 4 | -2 | 0 | 0 | -1 | 0 | 1 | 1 |
| min | 7M | 3M-600 | -225 | 9M-1000 | -2M+150 | 0 | -M | -M | 0 | 0 | ||
Елементи стовпця базису (B)
Переносимо до таблиці базисні елементи, які були визначені на попередньому етапі:
B1 = x8;
B2 = x9;
Елементи стовпця Cb
Кожна клітинка цього стовпця дорівнює коефіцієнту, який відповідає базисній змінній у відповідному рядку.
Cb1 = M;
Cb2 = M;
Значення вільних змінних і стовпця P
На цьому етапі обчислень не потрібно, просто переносимо значення з попереднього етапу до відповідних клітинок таблиці:
P1 = 3;
P2 = 4;
x1,1 = 2;
x1,2 = 0;
x1,3 = 5;
x1,4 = 0;
x1,5 = 0;
x1,6 = -1;
x1,7 = 0;
x1,8 = 1;
x1,9 = 0;
x2,1 = 1;
x2,2 = 0;
x2,3 = 4;
x2,4 = -2;
x2,5 = 0;
x2,6 = 0;
x2,7 = -1;
x2,8 = 0;
x2,9 = 1;
Значення цільової функції
Обчислюємо значення цільової функції шляхом поелементного множення стовпця Cb на стовпець P та підсумовування результатів добутків.
MinP = (Cb1 * P1) + (Cb2 * P2) = (M * 3) + (M * 4) = 7M;
Оцінки керованих змінних
Обчислюємо оцінки для кожної керованої змінної шляхом поелементного множення значень зі стовпця змінної на значення зі стовпця Cb, підсумовування результатів добутків та віднімання коефіцієнта цільової функції з їх суми для цієї змінної.
Minx1 = ((Cb1 * x1,1) + (Cb2 * x2,1)) - kx1 = ((M * 2) + (M * 1)) - 600 = 3M-600;
Minx2 = ((Cb1 * x1,2) + (Cb2 * x2,2)) - kx2 = ((M * 0) + (M * 0)) - 225 = -225;
Minx3 = ((Cb1 * x1,3) + (Cb2 * x2,3)) - kx3 = ((M * 5) + (M * 4)) - 1000 = 9M-1000;
Minx4 = ((Cb1 * x1,4) + (Cb2 * x2,4)) - kx4 = ((M * 0) + (M * -2)) - -150 = -2M+150;
Minx5 = ((Cb1 * x1,5) + (Cb2 * x2,5)) - kx5 = ((M * 0) + (M * 0)) - 0 = 0;
Minx6 = ((Cb1 * x1,6) + (Cb2 * x2,6)) - kx6 = ((M * -1) + (M * 0)) - 0 = -M;
Minx7 = ((Cb1 * x1,7) + (Cb2 * x2,7)) - kx7 = ((M * 0) + (M * -1)) - 0 = -M;
Minx8 = ((Cb1 * x1,8) + (Cb2 * x2,8)) - kx8 = ((M * 1) + (M * 0)) - M = 0;
Minx9 = ((Cb1 * x1,9) + (Cb2 * x2,9)) - kx9 = ((M * 0) + (M * 1)) - M = 0;
Елементи стовпця Q
Оскільки серед оцінок керованих змінних є додатні значення, поточна таблиця ще не має оптимального розв'язку. Тому до базису вводимо змінну з найбільшою додатною оцінкою.
Кількість змінних у базисі завжди стала, тому необхідно вибрати, яку змінну виводити з базису, для чого обчислюємо Q.
Елементи стовпця Q обчислюються шляхом ділення значень зі стовпця P на значення зі стовпця, що відповідає змінній, яка вводиться до базису:
Q1 = P1x1,3 = 35 = 35;
Q2 = P2x2,3 = 44 = 1;
Виводимо з базису змінну з найменшим додатним значенням Q.
На перетині рядка, що відповідає змінній, яка виводиться з базису, і стовпця, що відповідає змінній, яка вводиться до базису, знаходиться розв'язуючий елемент.
Цей елемент дозволить нам обчислити елементи таблиці наступної ітерації.
| B | Cb | P | x1 | x2 | x3 | x4 | x5 | x6↓ | x7 | x8 | x9 | Q |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 600 | 225 | 1000 | -150 | 0 | 0 | 0 | M | M | ||||
| x3 | 1000 | 35 | 25 | 0 | 1 | 0 | 0 | -15 | 0 | 15 | 0 | ∞ |
| x9← | M | 135 | -35 | 0 | 0 | -2 | 0 | 45 | -1 | -45 | 1 | 2 |
| min | 135M+600 | -35M-200 | -225 | 0 | -2M+150 | 0 | 45M-200 | -M | -145M+200 | 0 | ||
Елементи стовпця базису (B)
За результатами обчислень попередньої ітерації виводимо змінну з базису x8 та ставимо на її місце x3. Всі інші клітинки залишаються незмінними.
Елементи стовпця Cb
Кожна клітинка цього стовпця дорівнює коефіцієнту, який відповідає базисній змінній у відповідному рядку.
Cb1 = 1000;
Cb2 = M;
Значення вільних змінних і стовпця P
(Дані з попередньої ітерації беруться як вхідні дані)
Заповнюємо нулями всі клітинки, що відповідають змінній, яка щойно введена до базису:
(Розв'язуючий елемент залишається незмінним)
x2,3 = 0;
Переносимо рядок з розв'язуючим елементом із попередньої таблиці до поточної, поелементно поділивши його значення на розв'язуючий елемент:
x1,1 = x1,1x1,3 = 25 = 25;
x1,2 = x1,2x1,3 = 05 = 0;
x1,3 = x1,3x1,3 = 55 = 1;
x1,4 = x1,4x1,3 = 05 = 0;
x1,5 = x1,5x1,3 = 05 = 0;
x1,6 = x1,6x1,3 = -15 = -15;
x1,7 = x1,7x1,3 = 05 = 0;
x1,8 = x1,8x1,3 = 15 = 15;
x1,9 = x1,9x1,3 = 05 = 0;
P1 = P1x1,3 = 35 = 35;
Решта порожніх клітинок, крім рядка оцінок та стовпця Q, обчислюються методом прямокутника відносно розв'язуючого елемента:
x2,1 = (x2,1 * x1,3) - (x2,3 * x1,1)x1,3 = (1 * 5) - (4 * 2)5 = -35;
x2,2 = (x2,2 * x1,3) - (x2,3 * x1,2)x1,3 = (0 * 5) - (4 * 0)5 = 0;
x2,4 = (x2,4 * x1,3) - (x2,3 * x1,4)x1,3 = (-2 * 5) - (4 * 0)5 = -2;
x2,5 = (x2,5 * x1,3) - (x2,3 * x1,5)x1,3 = (0 * 5) - (4 * 0)5 = 0;
x2,6 = (x2,6 * x1,3) - (x2,3 * x1,6)x1,3 = (0 * 5) - (4 * -1)5 = 45;
x2,7 = (x2,7 * x1,3) - (x2,3 * x1,7)x1,3 = (-1 * 5) - (4 * 0)5 = -1;
x2,8 = (x2,8 * x1,3) - (x2,3 * x1,8)x1,3 = (0 * 5) - (4 * 1)5 = -45;
x2,9 = (x2,9 * x1,3) - (x2,3 * x1,9)x1,3 = (1 * 5) - (4 * 0)5 = 1;
P2 = (P2 * x1,3) - (x2,3 * P1)x1,3 = (4 * 5) - (4 * 3)5 = 135;
Значення цільової функції
Обчислюємо значення цільової функції шляхом поелементного множення стовпця Cb на стовпець P та підсумовування результатів добутків.
MinP = (Cb1 * P1) + (Cb2 * P2) = (1000 * 35) + (M * 135) = 135M+600;
Оцінки керованих змінних
Обчислюємо оцінки для кожної керованої змінної шляхом поелементного множення значень зі стовпця змінної на значення зі стовпця Cb, підсумовування результатів добутків та віднімання коефіцієнта цільової функції з їх суми для цієї змінної.
Minx1 = ((Cb1 * x1,1) + (Cb2 * x2,1)) - kx1 = ((1000 * 25) + (M * -35)) - 600 = -35M-200;
Minx2 = ((Cb1 * x1,2) + (Cb2 * x2,2)) - kx2 = ((1000 * 0) + (M * 0)) - 225 = -225;
Minx3 = ((Cb1 * x1,3) + (Cb2 * x2,3)) - kx3 = ((1000 * 1) + (M * 0)) - 1000 = 0;
Minx4 = ((Cb1 * x1,4) + (Cb2 * x2,4)) - kx4 = ((1000 * 0) + (M * -2)) - -150 = -2M+150;
Minx5 = ((Cb1 * x1,5) + (Cb2 * x2,5)) - kx5 = ((1000 * 0) + (M * 0)) - 0 = 0;
Minx6 = ((Cb1 * x1,6) + (Cb2 * x2,6)) - kx6 = ((1000 * -15) + (M * 45)) - 0 = 45M-200;
Minx7 = ((Cb1 * x1,7) + (Cb2 * x2,7)) - kx7 = ((1000 * 0) + (M * -1)) - 0 = -M;
Minx8 = ((Cb1 * x1,8) + (Cb2 * x2,8)) - kx8 = ((1000 * 15) + (M * -45)) - M = -145M+200;
Minx9 = ((Cb1 * x1,9) + (Cb2 * x2,9)) - kx9 = ((1000 * 0) + (M * 1)) - M = 0;
Елементи стовпця Q
Оскільки серед оцінок керованих змінних є додатні значення, поточна таблиця ще не має оптимального розв'язку. Тому до базису вводимо змінну з найбільшою додатною оцінкою.
Кількість змінних у базисі завжди стала, тому необхідно вибрати, яку змінну виводити з базису, для чого обчислюємо Q.
Елементи стовпця Q обчислюються шляхом ділення значень зі стовпця P на значення зі стовпця, що відповідає змінній, яка вводиться до базису:
Q1 = P1x1,6 = 35-15 = ∞;
Q2 = P2x2,6 = 13545 = 2;
Виводимо з базису змінну з найменшим додатним значенням Q.
На перетині рядка, що відповідає змінній, яка виводиться з базису, і стовпця, що відповідає змінній, яка вводиться до базису, знаходиться розв'язуючий елемент.
Цей елемент дозволить нам обчислити елементи таблиці наступної ітерації.
| B | Cb | P | x1 | x2 | x3 | x4 | x5 | x6 | x7 | x8 | x9 | Q |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 600 | 225 | 1000 | -150 | 0 | 0 | 0 | M | M | ||||
| x3 | 1000 | 1 | 14 | 0 | 1 | -12 | 0 | 0 | -14 | 0 | 14 | |
| x6 | 0 | 2 | -34 | 0 | 0 | -212 | 0 | 1 | -114 | -1 | 114 | |
| min | 1000 | -350 | -225 | 0 | -350 | 0 | 0 | -250 | -M | -M+250 | ||
Елементи стовпця базису (B)
За результатами обчислень попередньої ітерації виводимо змінну з базису x9 та ставимо на її місце x6. Всі інші клітинки залишаються незмінними.
Елементи стовпця Cb
Кожна клітинка цього стовпця дорівнює коефіцієнту, який відповідає базисній змінній у відповідному рядку.
Cb1 = 1000;
Cb2 = 0;
Значення вільних змінних і стовпця P
(Дані з попередньої ітерації беруться як вхідні дані)
Заповнюємо нулями всі клітинки, що відповідають змінній, яка щойно введена до базису:
(Розв'язуючий елемент залишається незмінним)
x1,6 = 0;
Переносимо рядок з розв'язуючим елементом із попередньої таблиці до поточної, поелементно поділивши його значення на розв'язуючий елемент:
x2,1 = x2,1x2,6 = -3545 = -34;
x2,2 = x2,2x2,6 = 045 = 0;
x2,3 = x2,3x2,6 = 045 = 0;
x2,4 = x2,4x2,6 = -245 = -212;
x2,5 = x2,5x2,6 = 045 = 0;
x2,6 = x2,6x2,6 = 4545 = 1;
x2,7 = x2,7x2,6 = -145 = -114;
x2,8 = x2,8x2,6 = -4545 = -1;
x2,9 = x2,9x2,6 = 145 = 114;
P2 = P2x2,6 = 13545 = 2;
Решта порожніх клітинок, крім рядка оцінок та стовпця Q, обчислюються методом прямокутника відносно розв'язуючого елемента:
x1,1 = (x1,1 * x2,6) - (x1,6 * x2,1)x2,6 = (25 * 45) - (-15 * -35)45 = 14;
x1,2 = (x1,2 * x2,6) - (x1,6 * x2,2)x2,6 = (0 * 45) - (-15 * 0)45 = 0;
x1,3 = (x1,3 * x2,6) - (x1,6 * x2,3)x2,6 = (1 * 45) - (-15 * 0)45 = 1;
x1,4 = (x1,4 * x2,6) - (x1,6 * x2,4)x2,6 = (0 * 45) - (-15 * -2)45 = -12;
x1,5 = (x1,5 * x2,6) - (x1,6 * x2,5)x2,6 = (0 * 45) - (-15 * 0)45 = 0;
x1,7 = (x1,7 * x2,6) - (x1,6 * x2,7)x2,6 = (0 * 45) - (-15 * -1)45 = -14;
x1,8 = (x1,8 * x2,6) - (x1,6 * x2,8)x2,6 = (15 * 45) - (-15 * -45)45 = 0;
x1,9 = (x1,9 * x2,6) - (x1,6 * x2,9)x2,6 = (0 * 45) - (-15 * 1)45 = 14;
P1 = (P1 * x2,6) - (x1,6 * P2)x2,6 = (35 * 45) - (-15 * 135)45 = 1;
Значення цільової функції
Обчислюємо значення цільової функції шляхом поелементного множення стовпця Cb на стовпець P та підсумовування результатів добутків.
MinP = (Cb1 * P1) + (Cb2 * P2) = (1000 * 1) + (0 * 2) = 1000;
Оцінки керованих змінних
Обчислюємо оцінки для кожної керованої змінної шляхом поелементного множення значень зі стовпця змінної на значення зі стовпця Cb, підсумовування результатів добутків та віднімання коефіцієнта цільової функції з їх суми для цієї змінної.
Minx1 = ((Cb1 * x1,1) + (Cb2 * x2,1)) - kx1 = ((1000 * 14) + (0 * -34)) - 600 = -350;
Minx2 = ((Cb1 * x1,2) + (Cb2 * x2,2)) - kx2 = ((1000 * 0) + (0 * 0)) - 225 = -225;
Minx3 = ((Cb1 * x1,3) + (Cb2 * x2,3)) - kx3 = ((1000 * 1) + (0 * 0)) - 1000 = 0;
Minx4 = ((Cb1 * x1,4) + (Cb2 * x2,4)) - kx4 = ((1000 * -12) + (0 * -212)) - -150 = -350;
Minx5 = ((Cb1 * x1,5) + (Cb2 * x2,5)) - kx5 = ((1000 * 0) + (0 * 0)) - 0 = 0;
Minx6 = ((Cb1 * x1,6) + (Cb2 * x2,6)) - kx6 = ((1000 * 0) + (0 * 1)) - 0 = 0;
Minx7 = ((Cb1 * x1,7) + (Cb2 * x2,7)) - kx7 = ((1000 * -14) + (0 * -114)) - 0 = -250;
Minx8 = ((Cb1 * x1,8) + (Cb2 * x2,8)) - kx8 = ((1000 * 0) + (0 * -1)) - M = -M;
Minx9 = ((Cb1 * x1,9) + (Cb2 * x2,9)) - kx9 = ((1000 * 14) + (0 * 114)) - M = -M+250;
Відповідь
Оскільки серед оцінок керованих змінних немає додатних значень, поточна таблиця має оптимальний розв'язок.
Значення цільової функції:
F* = 1000;
Змінні, що присутні в базисі, дорівнюють відповідним клітинкам стовпця P, всі інші змінні дорівнюють нулю:
x1 = 0;
x2 = 0;
x3 = 1;
x4 = 0;
x5 = 0;
Часті запитання
Що таке двоїстий симплекс-метод?
Двоїстий симплекс-метод зберігає виконання умови оптимальності, водночас відновлюючи допустимість — на противагу прямому симплекс-методу, який зберігає допустимість і прямує до оптимальності. Він корисний, коли початковий базис є оптимальним, але недопустимим.
Коли слід використовувати двоїстий симплекс-метод замість прямого?
Він найефективніший, коли у вас уже є двоїсто-допустимий (оптимальний, але недопустимий) базис — наприклад, після додавання обмеження до розв'язаної задачі або під час аналізу чутливості — оскільки він може повторно оптимізувати без перезапуску з нуля.
Як двоїстий симплекс-метод пов'язаний з прямою задачею?
Кожна задача лінійного програмування має двоїсту. Двоїстий симплекс-метод працює з таблицею прямої задачі, але виконує перетворення відповідно до двоїстої допустимості. В оптимумі значення цільових функцій прямої та двоїстої задач збігаються (сильна двоїстість).
Чи дає двоїстий симплекс-метод той самий оптимум, що й прямий симплекс-метод?
Так. Для задачі зі скінченним оптимумом обидва методи досягають одного й того самого оптимального значення цільової функції та оптимального розв'язку; вони відрізняються лише шляхом, пройденим через таблиці.