ЛР-01: Ремонтно-обслуживающий склад#
Student notebook: military 02#
Этот notebook предназначен для самостоятельного заполнения. Готовых численных ответов и выполненного решателя здесь нет.
1. Зачем нужен этот кейс#
Склад решает, сколько комплектов для ремонта двигателей и сколько комплектов для связи подготовить за смену.
После этого notebook-а студент должен уметь:
выделять переменные, целевую функцию и ограничения;
находить вершины допустимой области вручную;
переводить задачу
maxв форматlinprog;проверять ответ через Python и объяснять его простыми словами.
2. Постановка задачи#
Обозначим:
\(x_1\) — количество комплектов для двигателя;
\(x_2\) — количество комплектов для связи.
Целевая функция:
Ограничения:
Числа из условия#
полезность комплекта двигателя:
11полезность комплекта связи:
8комплектующие:
2и3, лимит24слесарное время:
3и1, лимит21
3. Задание 1. Геометрическое решение#
Выполните по шагам:
Найдите по две опорные точки для каждой граничной прямой.
Постройте допустимую область.
Найдите все вершины допустимой области.
Вычислите целевую функцию в каждой вершине.
Сделайте вывод, какая вершина даёт оптимум.
# Сюда перенесите результаты ручного решения.
# Этот блок нужен как аккуратный черновик перед проверкой через Python.
vertices = None
objective_values = None
optimal_point = None
optimal_value = None
print('vertices =', vertices)
print('objective_values =', objective_values)
print('optimal_point =', optimal_point)
print('optimal_value =', optimal_value)
4. Задание 2. Проверка через linprog#
Здесь нужно вручную заполнить массивы для решателя.
Подсказка по порядку работы:
Сначала перепишите коэффициенты в
c,A_ub,b_ub.Затем проверьте, что вы правильно поменяли знак у целевой функции.
Только после этого запускайте решатель.
import numpy as np
from scipy.optimize import linprog
def describe_result(result) -> None:
"""Печатает найденный план в удобном для отчёта виде.
Args:
result: Объект результата от `linprog`.
"""
print('success =', result.success)
print('message =', result.message)
if result.success:
print('x =', result.x)
print('f_min =', result.fun)
print('z_max =', -result.fun)
# TODO: перепишите коэффициенты целевой функции для ЗАДАЧИ МИНИМИЗАЦИИ.
c = np.array([np.nan, np.nan], dtype=float)
# TODO: заполните матрицу ограничений A_ub @ x <= b_ub.
A_ub = np.array([
[np.nan, np.nan],
[np.nan, np.nan],
], dtype=float)
# TODO: заполните правые части ограничений.
b_ub = np.array([np.nan, np.nan], dtype=float)
bounds = [(0, None), (0, None)]
if np.isnan(c).any() or np.isnan(A_ub).any() or np.isnan(b_ub).any():
print('Сначала заполните c, A_ub и b_ub числами из постановки.')
else:
result = linprog(c, A_ub=A_ub, b_ub=b_ub, bounds=bounds, method='highs')
describe_result(result)
5. Что должно быть в отчёте#
Полная математическая постановка задачи.
Геометрическое решение с рисунком допустимой области.
Все вершины и значения целевой функции.
Проверка через
linprog.Пояснение, почему найденный план является оптимальным.
6. Контрольный чек-лист#
[ ] Я сам нашёл вершины допустимой области.
[ ] Я правильно выполнил переход
max -> min.[ ] Я осмысленно заполнил
c,A_ub,b_ub,bounds.[ ] Я не подставлял готовый ответ до собственной попытки решения.