Исследование_Операций_ЛР3
.docxТаблица 2.4 – Вспомогательные расчеты для S1
S1 |
x1 |
φ1 |
S2 |
w2 |
w1=φ1+φ2 |
8 |
0 |
0 |
8 |
2,9 |
2,9 |
1 |
0,2 |
7 |
2,8 |
3 |
|
2 |
0,4 |
6 |
2,7 |
3,1 |
|
3 |
0,6 |
5 |
2,5 |
3,1 |
|
4 |
0,8 |
4 |
2,3 |
3,1 |
|
5 |
1 |
3 |
2,2 |
3,2 |
|
6 |
1,2 |
2 |
1,8 |
3 |
|
7 |
1,4 |
1 |
1 |
2,4 |
|
8 |
1,5 |
0 |
0 |
1,5 |
Таблица 2.5 – Сводная таблица по расчетам
S |
П4 |
П3 |
П2 |
П1 |
|||||||
x4 |
φ4 |
x3 |
w3 |
x2 |
w2 |
x1 |
w1 |
||||
1 |
1 |
1 |
0 |
1 |
0 |
1 |
|
|
|||
2 |
2 |
1 |
1 |
1,8 |
0 |
1,8 |
|
|
|||
3 |
3 |
1,1 |
2 |
1,9 |
1 |
2,2 |
|
|
|||
4 |
4 |
1,1 |
3 |
2,1 |
1,2 |
2,3 |
|
|
|||
5 |
5 |
1,2 |
4 |
2,3 |
1 |
2,5 |
|
|
|||
6 |
6 |
1,2 |
5 |
2,4 |
1 |
2,7 |
|
|
|||
7 |
7 |
1,3 |
6 |
2,5 |
1,2 |
2,8 |
|
|
|||
8 |
8 |
1,3 |
5,6,7 |
2,5 |
1,2,3 |
2,9 |
5 |
3,2 |
|||
Таблица 2.6 – Итоговое распределение ресурсов
План распределения ресурсов |
|||
X1 |
X2 |
X3 |
X4 |
5 |
1 |
1 |
1 |
Для решения данной задачи был написан программный код, приведенный в Приложении А. Исходные данные, записанные на отдельном листе в таблице Excel, загружаются в виде датасета при помощи библиотеки pandas. Далее реализован алгоритм, выполняющий те же шаги, что и в ручном способе. Для всей состояний создаются вспомогательные таблицы, в последней из которых определяется максимально-возможная выручка. Чтобы далее восстановить сколько ресурсов было выделено на каждой предприятие, и каждом выборе максимальной получившейся суммы, записывается выделенное число ресурсов, получившаяся сумма и предыдущая максимальная сумма. По данной сводной таблице начиная в обратном порядке по максимальной итоговой сумме находится выделенной число ресурсов, после чего сумма заменяется на предыдущую, и так пока не будут определены ресурсы для n-1 предприятий. Количество ресурсов, отданное последнему предприятию равняется разности максимального числа ресурсов и набранного.
На Рисунке 1 представлена excel таблица с исходными данными, которые взяты для решения задачи. Результат работы программы при загрузке данной таблице, в соответствии с Рисунком 2, совпадает с решением найденным ручным способом, рассмотренным ранее. Максимальная выручка составляет 3.2, при распределении ресурсов: 5, 1, 1, 1 для первого, второго, третьего и четвертого предприятия соответственно.
Рисунок 1 – Таблица с исходными данными
Рисунок 2 – Результат работы программы
Вывод:
В ходе выполнения лабораторной работы получены практические навыки решения задач распределения ресурсов при помощи динамического программирования.
В частности решена задача разгрузки при ограниченной грузоподъемности, а также задача о распределении ресурсов. Для решения второй задачи написан программный код, позволяющий динамически решать поставленную задачу.
Вместо прямого перебора всех возможных вариантов распределения, программа реализует продемонстрированный вручную способ нахождения максимальной выручки с предприятия, записывая предпринятые на разных шагах решения, после чего обратным путем определяет, сколько ресурсов нужно выделить, чтобы прийти к полученной сумме.
ПРИЛОЖЕНИЕ А. ПРОГРАММА ДЛЯ РЕШЕНИЯ ЗАДАЧИ
# -*- coding:cp1251 -*-
import pandas as pd
# Путь к файлу
file = r"C:\Users\anast\Desktop\6 семестр\Иследование операций\Lab3_2.xlsx"
# Загрузка excel файла
xl = pd.ExcelFile(file)
def compute_S(f1,f2):
max_g = len(f1)
w = []
w_prev = []
steps = []
for stage in range(1,max_g+1):
#print(f"Stage = {stage}")
max_w = 0
w_p = 0
s = 0
for step in range(0,stage+1):
if step == 0:
a = 0
b = f2[stage-1]
elif step == stage:
a = f1[stage-1]
b = 0
else:
a = f1[step-1]
b = f2[stage-step-1]
#print(f"a = {a}\tb = {b}")
if round(a+b,1) > max_w:
max_w = round(a+b,1)
global last_step
s = step
w_p = b
w_prev.append(w_p)
w.append(max_w)
steps.append(s)
return w, w_prev, steps
def solve_the_problem(df):
b = df[df.columns[-1]]
max_g = len(df)
pivot_table = []
for i in range(len(df.columns) - 2, 0, -1):
a = df[df.columns[i]]
b, w_prev, steps = compute_S(a, b)
pivot_table.append([b,w_prev,steps])
max_price = max(b)
result = []
for batch in pivot_table[::-1]:
i = batch[0].index(max_price)
max_price = batch[1][i]
result.append(batch[2][i])
result.append(max_g-sum(result))
print(f"Распределение по предприятиям: \t{result}")
print(f"Итоговая сумма\t{max(b)}")
df = xl.parse(f'Data0')
print(df)
solve_the_problem(df)
