- •Лабораторная работа №1 разведочный анализ данных
- •Лабораторная работа №2 метод анализа иерархий
- •Лабораторная работа №3 группировка и агрегирование с помощью pandas
- •Лабораторная работа №4 регрессионный анализ
- •Лабораторная работа №5 программирование генетических алгоритмов на алгоритмическом языке python
- •Лабораторная работа №6 программирование лувенского алгоритма
Лабораторная работа №5 программирование генетических алгоритмов на алгоритмическом языке python
Целью лабораторной работы является освоение:
ключевых концепций и методов эволюционного моделирования;
построения (формулирования) генетического алгоритма;
приобретению навыков по программированию на языке Python генетического алгоритма;
библиотек Python для программирования генетического алгоритма;
этапов программирования генетического алгоритма;
и приобретение навыков по формированию функции приспособленности;
визуализации результатов работы генетического алгоритма.
Задание на выполнение и ход лабораторной работы:
В соответствии с выданным вариантом сформулировать генетический алгоритм:
Правило скрещивания:
Из популяции выбираются две самые сильные особи. Вместо первого предмета в первой особи ставится последний предмет второй особи;
Правило отбора:
Выбираются четыре самые сильные особи по ценности;
Правило мутации:
Последний предмет берется у четвертой особи из максимальной популяции;
а также фитнес-функцию (приспособленности) и условия выхода (прекращения) работы алгоритма:
Фитнес-функция: общий вес не превышает 50 кг и стоимость всего набора не превышает 23000 рублей;
Условие выхода: найден лучший набор, удовлетворяющий заданным условиям.
Разработать программу на алгоритмическом языке Python, которая в соответствии с п.I задания выполняет следующее:
Формирует начальную популяцию.
Решает задачу в соответствии с заданием, определенным вариантом.
Выводит результат со всеми необходимыми для пользователя поясняющими надписями.
Листинг:
import pandas as pd import openpyxl #вес не более 23 кг, стоимость не более 50к, набор состоит из 9 предметов #правила скрещивания: поменять местами первые элемнты из разных списков ls = [] pop = [] def Best(pop): value = [] four = [] for m in range(len(pop)): ls2 = [] ls2.append(m) vl = pop[m][3] + pop[m][7] + pop[m][11] + pop[m][15] ls2.append(vl) value.append(ls2) for m in range(len(value)): swapped = False for j in range(0, len(value) - m - 1): if value[j][1] < value[j + 1][1]: value[j], value[j + 1] = value[j + 1], value[j] swapped = True if (swapped == False): break for m in range(4): four.append(pop[value[m][0]]) return four def Crossing(): gen = Best(population) child = [] ind = 1 if gen[0] in was: for m in range(1, len(gen)): if gen[m] in was: continue else: ind = m break if ind == -1: return gen[0][3] + gen[0][7] + gen[0][11] + gen[0][15] was.append(gen[0]) was.append(gen[ind]) for m in range(12, 16): child.append(gen[ind][m]) for m in range(4, 12): child.append(gen[0][m]) for m in range(12, 16): child.append(gen[3][m]) population.append(child) return gen[0][3] + gen[0][7] + gen[0][11] + gen[0][15] ex = pd.read_excel("lab5bd.xlsx") ls2 = ["Палатка", "Спальный мешок", "Сменная одежда", "Аптечка", "Вода"] mass = [] for i in ls2: mainitems = ex[ex["Компоненты"] == i].index.tolist() mass.append(mainitems) print(mass) ss = 0 ff = 0 for i in mass: ff += ex["Стоимость, тыс руб"][i[0]] ss += ex["Вес, кг"][i[0]] print(ff) print(ss) imp = ex["Важность"].sort_values(ascending=False).index.tolist() print(imp) for i in mass: imp.remove(i[0]) population = [] was = [] print(imp) i = 0 while len(population) != 4: s = 0 f = 0 ls1 = [] for j in range(0, 4): s += ex["Вес, кг"][imp[j + i]] f += ex["Стоимость, тыс руб"][imp[j + i]] if s < 23 and f < 50000: for k in range(0, 4): ls1.append(ex["Компоненты"][imp[k + i]]) ls1.append(ex["Вес, кг"][imp[k + i]]) ls1.append(ex["Стоимость, тыс руб"][imp[k + i]]) ls1.append(ex["Важность"][imp[k + i]]) population.append(ls1) i+=1 iter = 0 mx = 0 while iter != 3: mxx = Crossing() if mxx != mx: mx = mxx else: iter += 1 mn = 50000 - ff w = 23 - ss print(population) for m in population: if m[3] + m[7] + m[11] + m[15] == mx and m[1] + m[5] + m[9] + m[13] < w: if m[2] + m[6] + m[10] + m[14] < mn: mn = m[2] + m[6] + m[10] + m[14] best = m print("Лучший набор:", best)
Вывод:
В первой строке выводятся индексы вещей, которые априори должны находится в любом из наборов (палатка, спальный мешок, сменная одежда, аптечка, вода).
Во второй и третьих строках выводятся стоимость априорного набора и его вес.
В четвертой строке выводится лист вещей, индексы которого отсортированы по важности.
В пятой строке выводится тот же лист, только без априорных предметов.
В шестой строке выводятся все возможные варианты комбинаций:
[['Средства личной гигиены', 0.7, 2000, 9, 'Фонарик', 0.5, 700, 9, 'Горелка', 0.4, 1200, 8, 'Термос', 0.6, 1500, 8], ['Фонарик', 0.5, 700, 9, 'Горелка', 0.4, 1200, 8, 'Термос', 0.6, 1500, 8, 'Зажигалка', 0.1, 100, 8], ['Горелка', 0.4, 1200, 8, 'Термос', 0.6, 1500, 8, 'Зажигалка', 0.1, 100, 8, 'Консервы', 1.5, 1500, 7], ['Термос', 0.6, 1500, 8, 'Зажигалка', 0.1, 100, 8, 'Консервы', 1.5, 1500, 7, 'Дождевик', 0.1, 350, 7], ['Зажигалка', 0.1, 100, 8, 'Фонарик', 0.5, 700, 9, 'Горелка', 0.4, 1200, 8, 'Дождевик', 0.1, 350, 7], ['Дождевик', 0.1, 350, 7, 'Фонарик', 0.5, 700, 9, 'Горелка', 0.4, 1200, 8, 'Консервы', 1.5, 1500, 7], ['Консервы', 1.5, 1500, 7, 'Фонарик', 0.5, 700, 9, 'Горелка', 0.4, 1200, 8, 'Консервы', 1.5, 1500, 7], ['Зажигалка', 0.1, 100, 8, 'Фонарик', 0.5, 700, 9, 'Горелка', 0.4, 1200, 8, 'Консервы', 1.5, 1500, 7]]
В седьмой строке выводится лучший претендент после скрещивания, мутации и отбора:
['Средства личной гигиены', 0.7, 2000, 9, 'Фонарик', 0.5, 700, 9, 'Горелка', 0.4, 1200, 8, 'Термос', 0.6, 1500, 8]
