- •1. Задача о найме персонала 4
- •Введение
- •Задача о найме персонала
- •Условие задачи
- •1.2 Формализация задачи
- •1.3 Решение задачи
- •2. Задача о покрытии
- •2.1 Условие задачи
- •2.2 Формализация задачи
- •2.3 Решение задачи
- •3. Задача о сенсоре
- •3.1. Условие задачи
- •3.2. Формализация задачи
- •3.3. Решение задачи
- •Заключение
- •Список использованных источников
1.3 Решение задачи
Код выглядит следующим образом:
import numpy as np
from scipy.optimize import linprog
# Исходные данные
costs = np.array([
[7, 9, 10, 10, 8],
[6, 10, 10, 7, 5],
[6, 6, 5, 6, 7]
])
H = [53, 30, 47, 40, 57]
adv_effect = np.array([
[0.3, 0.4, 0.4, 0.5, 0.6],
[0.2, 0.3, 0.3, 0.4, 0.5],
[0.1, 0.2, 0.2, 0.3, 0.4]
])
supply = [125, 136, 143]
# Функция для решения задачи
def solve_transportation_problem(costs):
num_vars = 20
c = list(costs.flatten()) + [1] * 5
A_eq = [
[1 if j // 5 == i else 0 for j in range(15)] + [0] * 5 for i in range(3)
]
b_eq = supply
A_ub = []
b_ub = []
for i in range(5):
for k in range(3):
coeff = [0] * 20
coeff[i] = 1
coeff[i + 5] = 1
coeff[i + 10] = 1
coeff[15 + i] = -adv_effect[k][i]
if k == 0:
b_ub.append(H[i])
elif k == 1:
b_ub.append(H[i] + 40 * (adv_effect[0][i] - adv_effect[1][i]))
elif k == 2:
b_ub.append(H[i] + 40 * adv_effect[0][i] + 60 * adv_effect[1][i] - 100 * adv_effect[2][i])
A_ub.append(coeff)
bounds = [(0, None) for _ in range(num_vars)]
result = linprog(c, A_ub=A_ub, b_ub=b_ub, A_eq=A_eq, b_eq=b_eq, bounds=bounds, method='highs')
return result
# Решение исходной задачи
result = solve_transportation_problem(costs)
# Пункт 2: Определение максимального и минимального рекламного бюджета
advertising_budgets = result.x[15:20]
min_budget = min(advertising_budgets)
max_budget = max(advertising_budgets)
min_budget_store = np.argmin(advertising_budgets) + 1
max_budget_store = np.argmax(advertising_budgets) + 1
print("Рекламные бюджеты для каждого магазина:")
for i, budget in enumerate(advertising_budgets, 1):
print(f"Магазин {i}: {budget:.2f}")
print(f"\nМинимальный рекламный бюджет: {min_budget:.2f} у магазина {min_budget_store}")
print(f"Максимальный рекламный бюджет: {max_budget:.2f} у магазина {max_budget_store}")
# Пункт 3: Анализ чувствительности
print("\nАнализ чувствительности при изменении стоимости перевозки между складом 2 и населенным пунктом 3:")
# Увеличение стоимости перевозки в цикле
initial_cost = costs[1, 2]
increment = 1 # значение, на которое будем увеличивать стоимость
num_steps = 10 # количество шагов
for step in range(num_steps):
costs_sensitivity = costs.copy()
costs_sensitivity[1, 2] = initial_cost + step * increment
result_sensitivity = solve_transportation_problem(costs_sensitivity)
print(f"\nШаг {step + 1}: стоимость перевозки {costs_sensitivity[1, 2]}")
print(f"Минимальная стоимость: {result_sensitivity.fun:.2f}")
# Вывод оптимальных значений переменных в удобочитаемом формате
print("Оптимальные значения переменных:")
for i in range(3):
for j in range(5):
print(f"x[{i+1},{j+1}] = {result_sensitivity.x[i*5 + j]:.2f}", end=" ")
print()
for j in range(5):
print(f"y[{j+1}] = {result_sensitivity.x[15 + j]:.2f}", end=" ")
print()
Результат работы программы:
Минимальная стоимость – 2822.50
Минимальный бюджет – у магазина 2, он вообще не требует затрат на рекламу. Максимальный – у магазина 5, он равен 312.50.
Анализ чувствительности
Оптимальная стратегия зависит от изменений стоимости перевозки между складом 2 и населенным пунктом 3 следующим образом:
В каждой итерации стоимость увеличивалась на единицу, минимальная стоимость будет оставаться без изменений. Было опробовано увеличение итераций до ста, и минимальная стоимость осталась такой же.
При увеличении стоимости перевозки оптимальная стратегия не меняется и остается той же. Поэтому можно пойти в обратную сторону:
При уменьшении стоимости, цена вложений в рекламу в городе 3 сильно возрастает – следствие дешевых перевозок.
В целом, все данные об изменениях можно проследить в выводе.
