Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 17d76352fa | |||
| 7793d647f5 | |||
| 989604c2ad | |||
| 0be7e6ca28 | |||
| 22dee5cc15 | |||
| 8f9919ff08 | |||
| 88297a575b | |||
| e5d5524046 | |||
| a875ff8f87 | |||
| 922dd601e8 | |||
| e0c9203e53 | |||
| 138cd76656 |
611
lab_10/lab10.ipynb
Normal file
611
lab_10/lab10.ipynb
Normal file
@@ -0,0 +1,611 @@
|
|||||||
|
{
|
||||||
|
"cells": [
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "3cd1445d",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"# Лабораторная работа №10. Задача оптимизации. Эволюционные алгоритмы.\n",
|
||||||
|
"\n",
|
||||||
|
"## Определение задачи об оптимизации\n",
|
||||||
|
"\n",
|
||||||
|
"**Задача о рюкзаке (Knapsack Problem)**:\n",
|
||||||
|
"Имеется набор предметов, каждый с весом и стоимостью. Цель — выбрать подмножество предметов, чтобы **максимизировать суммарную стоимость**, при этом суммарный вес не превышал заданной вместимости рюкзака.\n",
|
||||||
|
"\n",
|
||||||
|
"## Датасет с вариантами решений\n",
|
||||||
|
"\n",
|
||||||
|
"[**Ссылка**](https://www.kaggle.com/datasets/warcoder/knapsack-problem)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 8,
|
||||||
|
"id": "02d32865",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/html": [
|
||||||
|
"<div>\n",
|
||||||
|
"<style scoped>\n",
|
||||||
|
" .dataframe tbody tr th:only-of-type {\n",
|
||||||
|
" vertical-align: middle;\n",
|
||||||
|
" }\n",
|
||||||
|
"\n",
|
||||||
|
" .dataframe tbody tr th {\n",
|
||||||
|
" vertical-align: top;\n",
|
||||||
|
" }\n",
|
||||||
|
"\n",
|
||||||
|
" .dataframe thead th {\n",
|
||||||
|
" text-align: right;\n",
|
||||||
|
" }\n",
|
||||||
|
"</style>\n",
|
||||||
|
"<table border=\"1\" class=\"dataframe\">\n",
|
||||||
|
" <thead>\n",
|
||||||
|
" <tr style=\"text-align: right;\">\n",
|
||||||
|
" <th></th>\n",
|
||||||
|
" <th>Weights</th>\n",
|
||||||
|
" <th>Prices</th>\n",
|
||||||
|
" <th>Capacity</th>\n",
|
||||||
|
" <th>Best picks</th>\n",
|
||||||
|
" <th>Best price</th>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" </thead>\n",
|
||||||
|
" <tbody>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>0</th>\n",
|
||||||
|
" <td>[46 40 42 38 10]</td>\n",
|
||||||
|
" <td>[12 19 19 15 8]</td>\n",
|
||||||
|
" <td>40</td>\n",
|
||||||
|
" <td>[0. 1. 0. 0. 0.]</td>\n",
|
||||||
|
" <td>19.0</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>1</th>\n",
|
||||||
|
" <td>[11 31 4 6 7]</td>\n",
|
||||||
|
" <td>[ 2 8 18 16 3]</td>\n",
|
||||||
|
" <td>64</td>\n",
|
||||||
|
" <td>[1. 1. 1. 1. 1.]</td>\n",
|
||||||
|
" <td>47.0</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>2</th>\n",
|
||||||
|
" <td>[32 49 27 37 24]</td>\n",
|
||||||
|
" <td>[19 16 16 4 1]</td>\n",
|
||||||
|
" <td>87</td>\n",
|
||||||
|
" <td>[1. 0. 1. 0. 1.]</td>\n",
|
||||||
|
" <td>36.0</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>3</th>\n",
|
||||||
|
" <td>[20 35 22 23 16]</td>\n",
|
||||||
|
" <td>[19 17 19 9 1]</td>\n",
|
||||||
|
" <td>21</td>\n",
|
||||||
|
" <td>[1. 0. 0. 0. 0.]</td>\n",
|
||||||
|
" <td>19.0</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>4</th>\n",
|
||||||
|
" <td>[ 7 12 19 13 20]</td>\n",
|
||||||
|
" <td>[10 11 18 15 5]</td>\n",
|
||||||
|
" <td>50</td>\n",
|
||||||
|
" <td>[0. 1. 1. 1. 0.]</td>\n",
|
||||||
|
" <td>44.0</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" </tbody>\n",
|
||||||
|
"</table>\n",
|
||||||
|
"</div>"
|
||||||
|
],
|
||||||
|
"text/plain": [
|
||||||
|
" Weights Prices Capacity Best picks Best price\n",
|
||||||
|
"0 [46 40 42 38 10] [12 19 19 15 8] 40 [0. 1. 0. 0. 0.] 19.0\n",
|
||||||
|
"1 [11 31 4 6 7] [ 2 8 18 16 3] 64 [1. 1. 1. 1. 1.] 47.0\n",
|
||||||
|
"2 [32 49 27 37 24] [19 16 16 4 1] 87 [1. 0. 1. 0. 1.] 36.0\n",
|
||||||
|
"3 [20 35 22 23 16] [19 17 19 9 1] 21 [1. 0. 0. 0. 0.] 19.0\n",
|
||||||
|
"4 [ 7 12 19 13 20] [10 11 18 15 5] 50 [0. 1. 1. 1. 0.] 44.0"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 8,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"import pandas as pd\n",
|
||||||
|
"import os\n",
|
||||||
|
"\n",
|
||||||
|
"df = pd.read_csv(os.path.join('.', 'static', 'csv', 'knapsack_5_items.csv'))\n",
|
||||||
|
"df.head()"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "b98390ab",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Структура хромосомы и тип данных гена\n",
|
||||||
|
"\n",
|
||||||
|
"- **Хромосома**: бинарный вектор длины N (кол-во доступных предметов)\n",
|
||||||
|
"- Ген: 0 или 1 — включен ли предмет в рюкзак\n",
|
||||||
|
"\n",
|
||||||
|
"## Генерация начальной популяции"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 9,
|
||||||
|
"id": "104f6440",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"[[1, 0, 0, 1, 1],\n",
|
||||||
|
" [1, 0, 0, 1, 1],\n",
|
||||||
|
" [1, 0, 0, 1, 1],\n",
|
||||||
|
" [1, 1, 0, 1, 1],\n",
|
||||||
|
" [0, 1, 0, 1, 0],\n",
|
||||||
|
" [0, 0, 1, 1, 0],\n",
|
||||||
|
" [0, 0, 0, 1, 1],\n",
|
||||||
|
" [0, 1, 0, 0, 1],\n",
|
||||||
|
" [0, 1, 0, 1, 1],\n",
|
||||||
|
" [1, 0, 1, 0, 0],\n",
|
||||||
|
" [1, 0, 1, 0, 1],\n",
|
||||||
|
" [1, 1, 1, 0, 0],\n",
|
||||||
|
" [0, 1, 1, 1, 1],\n",
|
||||||
|
" [0, 1, 0, 0, 1],\n",
|
||||||
|
" [1, 1, 0, 0, 1],\n",
|
||||||
|
" [0, 0, 0, 0, 1],\n",
|
||||||
|
" [0, 0, 0, 1, 1],\n",
|
||||||
|
" [0, 1, 0, 0, 0],\n",
|
||||||
|
" [0, 1, 1, 0, 1],\n",
|
||||||
|
" [1, 1, 0, 0, 0]]"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 9,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"import random\n",
|
||||||
|
"\n",
|
||||||
|
"def create_individual(elements_num): \n",
|
||||||
|
" return [random.randint(0, 1) for _ in range(elements_num)]\n",
|
||||||
|
"\n",
|
||||||
|
"def create_population(population_size, elements_num): \n",
|
||||||
|
" return [create_individual(elements_num) for _ in range(population_size)]\n",
|
||||||
|
"\n",
|
||||||
|
"POPULATION_COUNT = 20\n",
|
||||||
|
"GENE_SIZE = 5\n",
|
||||||
|
"\n",
|
||||||
|
"create_population(POPULATION_COUNT, GENE_SIZE)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "69f3e8ca",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Фитнес функция"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 10,
|
||||||
|
"id": "7d9fe8c3",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"36"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 10,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"def calculate_fitness(individual, weights, prices, capacity):\n",
|
||||||
|
" total_value = total_weight = 0\n",
|
||||||
|
" for i in range(len(individual)):\n",
|
||||||
|
" if individual[i] == 1:\n",
|
||||||
|
" total_value += prices[i]\n",
|
||||||
|
" total_weight += weights[i]\n",
|
||||||
|
" if (total_weight <= capacity):\n",
|
||||||
|
" return total_value\n",
|
||||||
|
" return 0\n",
|
||||||
|
"\n",
|
||||||
|
"calculate_fitness([1, 0, 1, 0, 1], [32, 49, 27, 37, 24], [19, 16, 16, 4, 1], 87)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "c937fe2c",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Оператор кроссинговера\n",
|
||||||
|
"\n",
|
||||||
|
"В данном случае используется одноточечный метод:"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 11,
|
||||||
|
"id": "c55e4513",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/plain": [
|
||||||
|
"([0, 1, 1, 0, 0], [1, 0, 1, 1, 0])"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 11,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"def crossover(item1, item2):\n",
|
||||||
|
" point = random.randint(1, len(item1) - 1)\n",
|
||||||
|
" return (item1[:point] + item2[point:], item2[:point] + item1[point:])\n",
|
||||||
|
"\n",
|
||||||
|
"crossover([0, 1, 1, 1, 0], [1, 0, 1, 0, 0])"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "8f5f108e",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Операторы мутации\n",
|
||||||
|
"\n",
|
||||||
|
"1. **Битовая мутация** - каждый ген с небольшой вероятностью меняется на противоположный.\n",
|
||||||
|
"2. **Инверсия подотрезка** - выбирается случайный подотрезок, и его гены инвертируются (переворачиваются местами)."
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 12,
|
||||||
|
"id": "449075d4",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"name": "stdout",
|
||||||
|
"output_type": "stream",
|
||||||
|
"text": [
|
||||||
|
"Исходная: [1, 0, 1, 0, 1]\n",
|
||||||
|
"Битовая мутация: [1, 0, 1, 0, 1]\n",
|
||||||
|
"Инверсия: [1, 0, 1, 0, 1]\n"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"def bit_flip_mutation(individual, mutation_rate=0.1):\n",
|
||||||
|
" mutated = individual.copy()\n",
|
||||||
|
" for i in range(len(mutated)):\n",
|
||||||
|
" if random.random() < mutation_rate:\n",
|
||||||
|
" mutated[i] = 1 - mutated[i]\n",
|
||||||
|
" return mutated\n",
|
||||||
|
"\n",
|
||||||
|
"def inversion_mutation(individual, mutation_rate=0.1):\n",
|
||||||
|
" mutated = individual.copy()\n",
|
||||||
|
" a, b = sorted(random.sample(range(len(mutated)), 2))\n",
|
||||||
|
" mutated[a:b + 1] = mutated[a:b + 1][::-1]\n",
|
||||||
|
" return mutated\n",
|
||||||
|
"\n",
|
||||||
|
"individual = [1, 0, 1, 0, 1]\n",
|
||||||
|
"\n",
|
||||||
|
"print(\"Исходная:\", individual)\n",
|
||||||
|
"print(\"Битовая мутация:\", bit_flip_mutation(individual, mutation_rate=0.3))\n",
|
||||||
|
"print(\"Инверсия:\", inversion_mutation(individual))"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "468d80dd",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Генетический алгоритм\n",
|
||||||
|
"\n",
|
||||||
|
"Самостоятельно реализуем алгоритм без применения PyGAD:"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 13,
|
||||||
|
"id": "600ed1cc",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [],
|
||||||
|
"source": [
|
||||||
|
"def select_parents(population, weights, prices, capacity):\n",
|
||||||
|
" fitness_values = [calculate_fitness(ind, weights, prices, capacity) for ind in population]\n",
|
||||||
|
" total_fitness = sum(fitness_values)\n",
|
||||||
|
" \n",
|
||||||
|
" if total_fitness == 0:\n",
|
||||||
|
" return random.choice(population), random.choice(population)\n",
|
||||||
|
"\n",
|
||||||
|
" probabilities = [f / total_fitness for f in fitness_values]\n",
|
||||||
|
" return random.choices(population, weights=probabilities, k=2)\n",
|
||||||
|
"\n",
|
||||||
|
"\n",
|
||||||
|
"def genetic_algorithm(weights, prices, capacity, population_size=100, num_generations=10, mutation_rate=0.1, mutation_strategy=bit_flip_mutation):\n",
|
||||||
|
" elements_num = len(weights)\n",
|
||||||
|
" population = create_population(population_size, elements_num)\n",
|
||||||
|
"\n",
|
||||||
|
" for _ in range(num_generations):\n",
|
||||||
|
" new_population = []\n",
|
||||||
|
" for _ in range(population_size // 2):\n",
|
||||||
|
" p1, p2 = select_parents(population, weights, prices, capacity)\n",
|
||||||
|
" c1, c2 = crossover(p1, p2)\n",
|
||||||
|
" c1 = mutation_strategy(c1, mutation_rate)\n",
|
||||||
|
" c2 = mutation_strategy(c2, mutation_rate)\n",
|
||||||
|
" new_population.extend([c1, c2])\n",
|
||||||
|
" population = new_population\n",
|
||||||
|
"\n",
|
||||||
|
" best = max(population, key=lambda ind: calculate_fitness(ind, weights, prices, capacity))\n",
|
||||||
|
" best_value = calculate_fitness(best, weights, prices, capacity)\n",
|
||||||
|
" return best, best_value"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "76254693",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Сравнение с реальными данными\n",
|
||||||
|
"\n",
|
||||||
|
"Применим получившийся генетический алгоритм к набору данных и сравним реальные значения с полученными при помощи алгоритма:"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "code",
|
||||||
|
"execution_count": 14,
|
||||||
|
"id": "772643b1",
|
||||||
|
"metadata": {},
|
||||||
|
"outputs": [
|
||||||
|
{
|
||||||
|
"data": {
|
||||||
|
"text/html": [
|
||||||
|
"<div>\n",
|
||||||
|
"<style scoped>\n",
|
||||||
|
" .dataframe tbody tr th:only-of-type {\n",
|
||||||
|
" vertical-align: middle;\n",
|
||||||
|
" }\n",
|
||||||
|
"\n",
|
||||||
|
" .dataframe tbody tr th {\n",
|
||||||
|
" vertical-align: top;\n",
|
||||||
|
" }\n",
|
||||||
|
"\n",
|
||||||
|
" .dataframe thead th {\n",
|
||||||
|
" text-align: right;\n",
|
||||||
|
" }\n",
|
||||||
|
"</style>\n",
|
||||||
|
"<table border=\"1\" class=\"dataframe\">\n",
|
||||||
|
" <thead>\n",
|
||||||
|
" <tr style=\"text-align: right;\">\n",
|
||||||
|
" <th></th>\n",
|
||||||
|
" <th>Weights</th>\n",
|
||||||
|
" <th>Prices</th>\n",
|
||||||
|
" <th>Capacity</th>\n",
|
||||||
|
" <th>Best picks</th>\n",
|
||||||
|
" <th>Best price</th>\n",
|
||||||
|
" <th>algorithmPicks</th>\n",
|
||||||
|
" <th>algorithmPrice</th>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" </thead>\n",
|
||||||
|
" <tbody>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>0</th>\n",
|
||||||
|
" <td>[46 40 42 38 10]</td>\n",
|
||||||
|
" <td>[12 19 19 15 8]</td>\n",
|
||||||
|
" <td>40</td>\n",
|
||||||
|
" <td>[0. 1. 0. 0. 0.]</td>\n",
|
||||||
|
" <td>19.0</td>\n",
|
||||||
|
" <td>[0, 1, 0, 0, 0]</td>\n",
|
||||||
|
" <td>19</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>1</th>\n",
|
||||||
|
" <td>[11 31 4 6 7]</td>\n",
|
||||||
|
" <td>[ 2 8 18 16 3]</td>\n",
|
||||||
|
" <td>64</td>\n",
|
||||||
|
" <td>[1. 1. 1. 1. 1.]</td>\n",
|
||||||
|
" <td>47.0</td>\n",
|
||||||
|
" <td>[1, 1, 1, 1, 1]</td>\n",
|
||||||
|
" <td>47</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>2</th>\n",
|
||||||
|
" <td>[32 49 27 37 24]</td>\n",
|
||||||
|
" <td>[19 16 16 4 1]</td>\n",
|
||||||
|
" <td>87</td>\n",
|
||||||
|
" <td>[1. 0. 1. 0. 1.]</td>\n",
|
||||||
|
" <td>36.0</td>\n",
|
||||||
|
" <td>[1, 0, 1, 0, 1]</td>\n",
|
||||||
|
" <td>36</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>3</th>\n",
|
||||||
|
" <td>[20 35 22 23 16]</td>\n",
|
||||||
|
" <td>[19 17 19 9 1]</td>\n",
|
||||||
|
" <td>21</td>\n",
|
||||||
|
" <td>[1. 0. 0. 0. 0.]</td>\n",
|
||||||
|
" <td>19.0</td>\n",
|
||||||
|
" <td>[1, 0, 0, 0, 0]</td>\n",
|
||||||
|
" <td>19</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>4</th>\n",
|
||||||
|
" <td>[ 7 12 19 13 20]</td>\n",
|
||||||
|
" <td>[10 11 18 15 5]</td>\n",
|
||||||
|
" <td>50</td>\n",
|
||||||
|
" <td>[0. 1. 1. 1. 0.]</td>\n",
|
||||||
|
" <td>44.0</td>\n",
|
||||||
|
" <td>[0, 1, 1, 1, 0]</td>\n",
|
||||||
|
" <td>44</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>9995</th>\n",
|
||||||
|
" <td>[18 12 11 49 32]</td>\n",
|
||||||
|
" <td>[12 3 17 19 7]</td>\n",
|
||||||
|
" <td>41</td>\n",
|
||||||
|
" <td>[1. 1. 1. 0. 0.]</td>\n",
|
||||||
|
" <td>32.0</td>\n",
|
||||||
|
" <td>[1, 1, 1, 0, 0]</td>\n",
|
||||||
|
" <td>32</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>9996</th>\n",
|
||||||
|
" <td>[20 2 24 7 7]</td>\n",
|
||||||
|
" <td>[17 12 4 3 8]</td>\n",
|
||||||
|
" <td>17</td>\n",
|
||||||
|
" <td>[0. 1. 0. 1. 1.]</td>\n",
|
||||||
|
" <td>23.0</td>\n",
|
||||||
|
" <td>[0, 1, 0, 1, 1]</td>\n",
|
||||||
|
" <td>23</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>9997</th>\n",
|
||||||
|
" <td>[43 43 5 15 23]</td>\n",
|
||||||
|
" <td>[15 5 7 2 7]</td>\n",
|
||||||
|
" <td>62</td>\n",
|
||||||
|
" <td>[1. 0. 1. 0. 0.]</td>\n",
|
||||||
|
" <td>22.0</td>\n",
|
||||||
|
" <td>[1, 0, 1, 0, 0]</td>\n",
|
||||||
|
" <td>22</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>9998</th>\n",
|
||||||
|
" <td>[49 9 15 21 39]</td>\n",
|
||||||
|
" <td>[11 15 3 12 19]</td>\n",
|
||||||
|
" <td>65</td>\n",
|
||||||
|
" <td>[0. 1. 1. 0. 1.]</td>\n",
|
||||||
|
" <td>37.0</td>\n",
|
||||||
|
" <td>[0, 1, 1, 0, 1]</td>\n",
|
||||||
|
" <td>37</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" <tr>\n",
|
||||||
|
" <th>9999</th>\n",
|
||||||
|
" <td>[25 36 42 19 39]</td>\n",
|
||||||
|
" <td>[15 12 7 18 12]</td>\n",
|
||||||
|
" <td>79</td>\n",
|
||||||
|
" <td>[1. 0. 0. 1. 0.]</td>\n",
|
||||||
|
" <td>33.0</td>\n",
|
||||||
|
" <td>[1, 0, 0, 1, 0]</td>\n",
|
||||||
|
" <td>33</td>\n",
|
||||||
|
" </tr>\n",
|
||||||
|
" </tbody>\n",
|
||||||
|
"</table>\n",
|
||||||
|
"</div>"
|
||||||
|
],
|
||||||
|
"text/plain": [
|
||||||
|
" Weights Prices Capacity Best picks \\\n",
|
||||||
|
"0 [46 40 42 38 10] [12 19 19 15 8] 40 [0. 1. 0. 0. 0.] \n",
|
||||||
|
"1 [11 31 4 6 7] [ 2 8 18 16 3] 64 [1. 1. 1. 1. 1.] \n",
|
||||||
|
"2 [32 49 27 37 24] [19 16 16 4 1] 87 [1. 0. 1. 0. 1.] \n",
|
||||||
|
"3 [20 35 22 23 16] [19 17 19 9 1] 21 [1. 0. 0. 0. 0.] \n",
|
||||||
|
"4 [ 7 12 19 13 20] [10 11 18 15 5] 50 [0. 1. 1. 1. 0.] \n",
|
||||||
|
"9995 [18 12 11 49 32] [12 3 17 19 7] 41 [1. 1. 1. 0. 0.] \n",
|
||||||
|
"9996 [20 2 24 7 7] [17 12 4 3 8] 17 [0. 1. 0. 1. 1.] \n",
|
||||||
|
"9997 [43 43 5 15 23] [15 5 7 2 7] 62 [1. 0. 1. 0. 0.] \n",
|
||||||
|
"9998 [49 9 15 21 39] [11 15 3 12 19] 65 [0. 1. 1. 0. 1.] \n",
|
||||||
|
"9999 [25 36 42 19 39] [15 12 7 18 12] 79 [1. 0. 0. 1. 0.] \n",
|
||||||
|
"\n",
|
||||||
|
" Best price algorithmPicks algorithmPrice \n",
|
||||||
|
"0 19.0 [0, 1, 0, 0, 0] 19 \n",
|
||||||
|
"1 47.0 [1, 1, 1, 1, 1] 47 \n",
|
||||||
|
"2 36.0 [1, 0, 1, 0, 1] 36 \n",
|
||||||
|
"3 19.0 [1, 0, 0, 0, 0] 19 \n",
|
||||||
|
"4 44.0 [0, 1, 1, 1, 0] 44 \n",
|
||||||
|
"9995 32.0 [1, 1, 1, 0, 0] 32 \n",
|
||||||
|
"9996 23.0 [0, 1, 0, 1, 1] 23 \n",
|
||||||
|
"9997 22.0 [1, 0, 1, 0, 0] 22 \n",
|
||||||
|
"9998 37.0 [0, 1, 1, 0, 1] 37 \n",
|
||||||
|
"9999 33.0 [1, 0, 0, 1, 0] 33 "
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"execution_count": 14,
|
||||||
|
"metadata": {},
|
||||||
|
"output_type": "execute_result"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source": [
|
||||||
|
"import re\n",
|
||||||
|
"import ast\n",
|
||||||
|
"\n",
|
||||||
|
"POPULATION_SIZE = 100\n",
|
||||||
|
"GENERATIONS_NUM = 10\n",
|
||||||
|
"MUTATION_RATE = 0.1\n",
|
||||||
|
"\n",
|
||||||
|
"picks = []\n",
|
||||||
|
"best_prices = []\n",
|
||||||
|
"\n",
|
||||||
|
"def fix_list_string(s):\n",
|
||||||
|
" # Удалить пробел сразу после [ и сразу перед ]\n",
|
||||||
|
" s = re.sub(r'\\[\\s*', '[', s)\n",
|
||||||
|
" s = re.sub(r'\\s*\\]', ']', s)\n",
|
||||||
|
" # Заменить все группы пробелов на запятую\n",
|
||||||
|
" s = re.sub(r'\\s+', ',', s)\n",
|
||||||
|
" return s\n",
|
||||||
|
"\n",
|
||||||
|
"for _, row in df.iterrows():\n",
|
||||||
|
" weights = ast.literal_eval(fix_list_string(row['Weights']))\n",
|
||||||
|
" prices = ast.literal_eval(fix_list_string(row['Prices']))\n",
|
||||||
|
" capacity = row['Capacity']\n",
|
||||||
|
"\n",
|
||||||
|
" best_individual, best_value = genetic_algorithm(\n",
|
||||||
|
" weights,\n",
|
||||||
|
" prices,\n",
|
||||||
|
" capacity,\n",
|
||||||
|
" POPULATION_SIZE,\n",
|
||||||
|
" GENERATIONS_NUM,\n",
|
||||||
|
" mutation_rate=0.1,\n",
|
||||||
|
" mutation_strategy=bit_flip_mutation\n",
|
||||||
|
" )\n",
|
||||||
|
" \n",
|
||||||
|
" picks.append(best_individual)\n",
|
||||||
|
" best_prices.append(best_value)\n",
|
||||||
|
"\n",
|
||||||
|
"df['algorithmPicks'] = picks\n",
|
||||||
|
"df['algorithmPrice'] = best_prices\n",
|
||||||
|
"\n",
|
||||||
|
"pd.concat([df.head(5), df.tail(5)])"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cell_type": "markdown",
|
||||||
|
"id": "82f2e49d",
|
||||||
|
"metadata": {},
|
||||||
|
"source": [
|
||||||
|
"## Вывод\n",
|
||||||
|
"\n",
|
||||||
|
"Генетический алгоритм успешно справился с задачей рюкзаке. Для всех протестированных входных данных результат совпал с эталонными оптимальными решениями из датасета. Это подтверждает корректность реализации фитнес-функции, операторов кроссинговера и мутаций. Алгоритм продемонстрировал высокую сходимость и эффективность даже при небольшом количестве поколений."
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"metadata": {
|
||||||
|
"kernelspec": {
|
||||||
|
"display_name": "aimenv",
|
||||||
|
"language": "python",
|
||||||
|
"name": "python3"
|
||||||
|
},
|
||||||
|
"language_info": {
|
||||||
|
"codemirror_mode": {
|
||||||
|
"name": "ipython",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
"file_extension": ".py",
|
||||||
|
"mimetype": "text/x-python",
|
||||||
|
"name": "python",
|
||||||
|
"nbconvert_exporter": "python",
|
||||||
|
"pygments_lexer": "ipython3",
|
||||||
|
"version": "3.12.10"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"nbformat": 4,
|
||||||
|
"nbformat_minor": 5
|
||||||
|
}
|
||||||
BIN
lab_10/requirements.txt
Normal file
BIN
lab_10/requirements.txt
Normal file
Binary file not shown.
10001
lab_10/static/csv/knapsack_5_items.csv
Normal file
10001
lab_10/static/csv/knapsack_5_items.csv
Normal file
File diff suppressed because it is too large
Load Diff
648
lab_11/lab11.ipynb
Normal file
648
lab_11/lab11.ipynb
Normal file
File diff suppressed because one or more lines are too long
BIN
lab_11/requirements.txt
Normal file
BIN
lab_11/requirements.txt
Normal file
Binary file not shown.
1967
lab_12/lab12.ipynb
Normal file
1967
lab_12/lab12.ipynb
Normal file
File diff suppressed because one or more lines are too long
BIN
lab_12/requirements.txt
Normal file
BIN
lab_12/requirements.txt
Normal file
Binary file not shown.
1246
lab_7/lab7.ipynb
Normal file
1246
lab_7/lab7.ipynb
Normal file
File diff suppressed because one or more lines are too long
BIN
lab_7/requirements.txt
Normal file
BIN
lab_7/requirements.txt
Normal file
Binary file not shown.
319796
lab_7/static/csv/heart_2020_cleaned.csv
Normal file
319796
lab_7/static/csv/heart_2020_cleaned.csv
Normal file
File diff suppressed because it is too large
Load Diff
675
lab_9/lab9.ipynb
Normal file
675
lab_9/lab9.ipynb
Normal file
File diff suppressed because one or more lines are too long
BIN
lab_9/requirements.txt
Normal file
BIN
lab_9/requirements.txt
Normal file
Binary file not shown.
Reference in New Issue
Block a user