Добавил:
t.me Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

lab3_IO_Zhovtyak

.docx
Скачиваний:
1
Добавлен:
27.08.2024
Размер:
1.22 Mб
Скачать

Цель работы

Найти решение задачи эвакуации и задачи распределения ресурсов.

Вариант

Вариант – 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)

Вывод

В ходе работы были изучен процесс решения задачи эвакуации и задачи распределения ресурсов.

Соседние файлы в предмете Исследование операций