lab3_IO_Zhovtyak
.docxЦель работы
Найти решение задачи эвакуации и задачи распределения ресурсов.
Вариант
Вариант – 14. Задание показано на рисунке 1.
Рисунок 1 – Условия по варианту
Ход работы
Вручную была посчитана задача эвакуации. На таблице 1 показано итоговое решение задачи, на таблице 2 – предварительная оптимизация, на таблицах 3-4 – примеры промежуточных расчетов для ячеек.
Таблица №1
Решение задачи эвакуации
-
П1
П2
П3
П4
g (вес)
2
3
4
4
C (цена)
30
35
40
50
x
1
0
1
1
Таблица предварительной оптимизации заполнялась следующим образом: предметы были расположены на эвакуацию в обратном порядке, чтобы самый маленький вес был в последней колонке; в последней колонке оставляем только две последние строки (так как вес П1 равен 2), так как подразумевается, что все ячейки мест выше уже заняты; таблица заполнялась слева на право; для каждого предмета, в зависимости от его цены и веса, было принято решение брать его или нет.
Ход решения:
1. Предмет 4 имеет вес 4 и цену 50. Следовательно, мы не можем его взять, пока доступная грузоподьемность (S) меньше, чем 4. При S равном 4 возможно взять предмет, поэтому в решение (x4) записывается 1 (берем), в общую ценность (ω4) цена предмета 50. При увеличении S предмет все также возможно взять.
2. Предмет 3 имеет вес 4 и цену 50. Следовательно, его можно взять только при S равном 4. Однако, в прошлой колонке при S равном 4 уже есть значение (предмет П4 взят). Так как места при S равном 4 только 4, то нужно определить, что выгодней взять – П3 или П4. П3 имеет цену лишь 40, а А4 50 – выгоднее взять П4. При этом, цена на данный момент будет равна цене взятого товара П4 (50) При увеличении S увеличивается и доступное место (при S = 5, раз берем П4, то свободно будет одно место) – следовательно, при S равном 8 будет уже 4 свободных мест (берем П4, который весит 4. 8-4=4). Таким образом, при s равном 8 можно взять предмет П3. Тогда цена на данный момент (ω3) будет равен весу П3+П4=40+50=90.
3. Предмет 2 имеет вес 3 и цену 35. Заполнение происходит аналогичным прошлому способу. Так, при 4 свободных местах данный товар не выгодно брать, а при 7 можно взять и П4 и П2. При s равном 8 уже нужно решить, что выгодней П4+П3 (90) или П4+П2(85). Первый вариант выгоднее, поэтому П2 не взят.
4. Предмет 1 весит 2 и стоит 30. Для определения берем\не берем применялась вспомогательная таблица (таблицы 3-4), так как вариантов прошлых действий достаточно много. В вспомогательной таблице мы рассматриваем два варианта: берем (x = 1) или не берем(x= 0). Также указываем цену (если берем, то она равна 30, если нет, то 0). После этого указываем какой вес из прошлой колонки доступен (когда проверяем s=9, то если не берем, то просматриваем прошлую колонку со значением 9, если берем, то доступный вес уменьшается и просматриваем уже 9-2=7 колонку). В следующем столбце указываем цену из прошлой колонки таблицы оптимизации при найденных S. В последней колонке вспомогательной матрице просто скалываем X1C1 и ω2 – где значение больше, то решение и принимаем.
5. Выделяем последнюю строку последнего столбца. Видим, что принято решение брать П1. П1 весит 2, поэтому дальше выделяем 10-2-8 строку. Видим, что принято решение не брать П2, поэтому просматриваем туже строку столбца для П3. Видим, что принято решение брать П3. Просматриваем столбец для П4 8-4=4. Выделяем клетку. Выделение клетки показывают решение – берем или не берем.
Таблица №2
Таблица предварительной оптимизации
-
S
П4
П3
П2
П1
x4
ω4
x3
ω3
x2
ω2
x1
ω1
1
0
0
0
0
0
0
2
0
0
0
0
0
0
3
0
0
0
0
1
35
4
1
50
0
50
0
50
5
1
50
0
50
0
50
6
1
50
0
50
0
50
7
1
50
0
50
1
85
8
1
50
1
90
0
90
9
1
50
1
90
0
90
1
115
10
1
50
1
90
0
90
1
120
Таблица №3
Пример промежуточных расчетов
X1 |
X1C1 |
S2 |
ω2 |
ω1 |
1 |
30 |
7 |
85 |
115 |
0 |
0 |
9 |
90 |
90 |
Таблица №4
Пример промежуточных расчетов
X1 |
X1C1 |
S2 |
ω2 |
ω1 |
1 |
30 |
8 |
90 |
120 |
0 |
0 |
10 |
90 |
90 |
Согласно полученным результатам, эвакуации подлежат: П1, П3 и П4.
Задача распределения ресурсов была при помощи программных средств. На рисунке 2 показана исходная задача, подаваемая в виде матрицы. Ответ, полученный на основе составленного кода, показан на рисунке 3.
Краткое описание кода: на основе имеющихся и получаемых значений образуются список для всех списков x и ω (рисунок 4). По итогу, если списки рассматривать вместе, то получаем ту же таблицу, что строили на лекции. После этого, подобно тому, как выбирали итоговое решение в таблице 2, выделяем решения в ней. После этого возвращаемся к исходной задаче (рисунок 1) и смотрим, какие значения для каждого П на выбранных местах x.
Рисунок 2 – Исходная задача
Рисунок 3 – Ответ на задачу распределения
Рисунок 4 – Значение списков x и ω и решение по ним
Листинг. Решение задачи распределения ресурсов
def mision_ressources(tableau):
#В матрице результатов значения матрицы перевернуты
matrice_res=[]
matrice_value=[]
for i in range(len(tableau[0])):
mass_res_une=[]
mass_res_une2=[]
for j in range(len(tableau)):
mass_res_une.append(0)
mass_res_une2.append(0)
matrice_res.append(mass_res_une)
matrice_value.append(mass_res_une2)
#Матрица значений результатов
#Заполняем первую строку
for i in range(len(matrice_res[0])):
matrice_value[0][i]=tableau[i][0]
matrice_res[0][i]=i+1
#Заполняем прочие строки
for i in range(1,len(matrice_res)):
for j in range(len(matrice_res[i])):
table_help=[]
#Создаем вспомогательную таблицу. число строк -
for k in range(j+2):
table_help_une=[]
for s in range(5):
table_help_une.append(0)
table_help.append(table_help_une)
#Заполняем полученную таблицу
for k in range(len(table_help)):
table_help[k][0]=k
if k!=0:
table_help[k][1]=tableau[k-1][i]
table_help[k][2]=len(table_help)-(k+1)
if table_help[k][2]!=0:
table_help[k][3]=matrice_value[i-1][table_help[k][2]-1]
table_help[k][4]=table_help[k][1]+table_help[k][3]
#Находим максимальный элемент
max=0
for k in range(len(table_help)):
if table_help[k][4]>max:
max=table_help[k][4]
max_index=k
matrice_value[i][j]=max
matrice_res[i][j]=max_index
#Создаем массив с выбраными φ
mass_res=[]
S=len(matrice_value[i])-1
for i in range(len(matrice_value)):
mass_res.append(matrice_res[len(matrice_value)-i-1][S])
S=S-matrice_res[len(matrice_value)-i-1][S]
mass_res=list(reversed(mass_res))
victoire=0
for i in range(len(mass_res)):
t=tableau[mass_res[i]-1][i]
victoire=victoire+tableau[mass_res[i]-1][i]
return(mass_res,round(victoire,2))
tabl=[[0.3,1.0,1.3,0.9],
[0.4,1.1,1.4,0.9],
[0.6,1.2,1.6,1.0],
[0.5,1.2,1.6,1.1],
[0.7,1.4,1.5,1.1],
[0.8,1.5,1.8,1.4],
[0.9,1.7,1.7,1.4]]
res,victoire = mision_ressources(tabl)
print('Максимальный доход - ', victoire)
print('При распределении - ', res)
Вывод
В ходе работы были изучен процесс решения задачи эвакуации и задачи распределения ресурсов.