a
b
c
d
x
y
z
AC
i
Randomize
Про калькулятор динамічного програмування
Розв'яжіть задачі розподілу інвестицій методом динамічного програмування онлайн з таблицею F*/K* та детальним покроковим розв'язком. з повним, детальним, покроковим описом розв'язань, що розв'язує задачі лінійного програмування розміром до 20×20 з коефіцієнтами таких типів: десяткові числа та дроби.
Щоб почати обчислення, спочатку необхідно ввести розміри задачі у поля вводу у верхній частині екрана, а також вибрати потрібну операцію з бічного меню.
Нижче знаходиться вікно вводу, де за допомогою клавіатури потрібно ввести коефіцієнти, обмеження та значення правих частин. Тут також розташована панель керування вводом, яка спрощує роботу із задачами ЛП і містить такі елементи керування:
- Перший елемент дозволяє розгорнути вікно вводу. Це може бути особливо корисно, коли таблиця не вміщається повністю на екрані. Якщо таблиця все ще не повністю видна після розгортання вікна, можна змінити масштаб за допомогою кнопок + / -;
- Другий елемент копіює поточні вхідні дані задачі до буфера пам'яті. Це може бути корисно, коли ви часто розв'язуєте ту саму задачу ЛП або потрібно переносити дані між операціями;
- Останній елемент вставляє раніше скопійовані вхідні дані, що дозволяє відновити дані задачі лише кількома кліками замість повторного введення вручну;
Далі внизу знаходиться панель інструментів, яка дозволяє налаштувати калькулятор та спростити роботу з ним. Вона візуально розділена на три частини, кожна з яких відповідає за таку функціональність:
- Перша частина дозволяє вибрати формат чисел при відображенні результату розв'язання. Також можна вимкнути покрокові коментарі, якщо ви вже розумієте метод і потребуєте лише перевірки власних обчислень, або приховати покрокове розв'язання повністю, якщо потрібна лише кінцева відповідь;
- Друга частина містить кнопки для зміни розмірів таблиці вводу, очищення окремих коефіцієнтів або всього вводу, а також головну кнопку зі знаком рівності, що переводить на екран розв'язання. Всі ці кнопки продубльовані клавіатурними скороченнями. Наведіть курсор на кнопку, щоб побачити відповідну клавішу у підказці. Також можна використовувати клавіші зі стрілками для переміщення курсора між полями вводу;
- Остання частина дозволяє вибрати кількість знаків після коми для округлення нецілих результатів. Попередній перегляд показує, як виглядатимуть округлені значення;
Що таке динамічне програмування?
Динамічне програмування — це метод оптимізації, що розв'язує складні задачі шляхом розбиття їх на простіші перекриваючі підзадачі та збереження проміжних результатів для уникнення надлишкових обчислень. У задачі розподілу інвестицій мета полягає в тому, щоб розподілити фіксований бюджет між кількома підприємствами для максимізації загального прибутку, використовуючи принцип оптимальної підструктури: оптимальний розподіл для етапів 1–k можна побудувати на основі оптимального розподілу для етапів 1–(k-1).
Як розв'язати задачу розподілу інвестицій методом динамічного програмування?
Складіть поетапну таблицю F*/K*, де кожна клітинка F*(q, x) містить максимальний прибуток, досяжний при інвестуванні x одиниць у перші q підприємств. Починайте з останнього підприємства і рухайтеся в зворотному напрямку: для кожного етапу q і кожного можливого рівня загальних інвестицій x переберіть усі допустимі розподіли між підприємством q і рештою етапів та запишіть найкращий. Оптимальний загальний прибуток зчитується з F*(n, total_budget), а оптимальний розподіл відновлюється шляхом відстеження рішень K* назад по таблиці.
Приклад розв'язання задачі розподілу інвестицій методом динамічного програмування
| x3 | x3 = 0 | x3 = 1 | x3 = 2 | x3 = 3 | x3 = 4 | F*3 | K*3 | F*4 |
|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | ||||
| 1 | 0 | 3 | 3 | 1 | 0 | |||
| 2 | 0 | 3 | 4 | 4 | 2 | 0 | ||
| 3 | 0 | 3 | 4 | 7 | 7 | 3 | 0 | |
| 4 | 0 | 3 | 4 | 7 | 11 | 11 | 4 | 0 |
| x2 | x2 = 0 | x2 = 1 | x2 = 2 | x2 = 3 | x2 = 4 | F*2 | K*2 | F*3 |
|---|---|---|---|---|---|---|---|---|
| 0 | 0 | 0 | 0 | 0 | ||||
| 1 | 3 | 6 | 6 | 1 | 3 | |||
| 2 | 4 | 9 | 9 | 9 | 1 | 4 | ||
| 3 | 7 | 10 | 12 | 11 | 12 | 2 | 7 | |
| 4 | 11 | 13 | 13 | 14 | 13 | 14 | 3 | 11 |
| x1 | x1 = 0 | x1 = 1 | x1 = 2 | x1 = 3 | x1 = 4 | F*1 | K*1 | F*2 |
|---|---|---|---|---|---|---|---|---|
| 4 | 14 | 20 | 19 | 17 | 12 | 20 | 1 | 0 |
| 1 | 6 | |||||||
| 2 | 9 | |||||||
| 3 | 12 | |||||||
| 4 | 14 |
Часті запитання
Яку задачу розв'язує цей калькулятор динамічного програмування?
Він знаходить оптимальний розподіл обмеженого ресурсу — наприклад інвестиційного капіталу — між кількома підприємствами для максимізації загального прибутку, використовуючи поетапне динамічне програмування.
Як динамічне програмування знаходить оптимум?
Воно розбиває розподіл на етапи, по одному підприємству за раз, і застосовує принцип оптимальності Беллмана: обчислює найкращий прибуток для кожного рівня залишкового бюджету та поєднує результати етапів у глобальний оптимум.
Чому перший рядок відповідає нульовій інвестиції?
Рядок 0 — це базовий варіант, коли не виділяється нічого, що завжди дає нульовий прибуток. Збереження його в явному вигляді дає змогу рекурентному співвідношенню порівнювати «інвестувати тут» з «не інвестувати тут» на кожному етапі.
Як читати оптимальний розподіл?
Підсумкова таблиця показує для повного бюджету, скільки виділити кожному підприємству та який отримується загальний прибуток — розподіл, який не може перевершити жоден інший варіант.