Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ТПР_109.docx
Скачиваний:
0
Добавлен:
28.12.2024
Размер:
391.5 Кб
Скачать

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 сильно возрастает – следствие дешевых перевозок.

В целом, все данные об изменениях можно проследить в выводе.