6 Commits

Author SHA1 Message Date
08bd1f76c0 minor design changes 2025-05-12 15:46:01 +04:00
95f9913c6f lab 12 done 2025-05-12 15:26:05 +04:00
3312b4f4d2 Merge pull request 'lab_10' (#9) from lab_10 into main
Reviewed-on: #9
2025-04-12 10:48:55 +04:00
b817368d6c Merge pull request 'lab_9' (#8) from lab_9 into main
Reviewed-on: #8
2025-04-12 10:48:49 +04:00
37103ea009 add requirements for lab 10 2025-04-12 10:03:19 +04:00
9dd4777138 lab 10 done 2025-04-12 09:59:20 +04:00
4 changed files with 2998 additions and 0 deletions

937
lab_10/lab10.ipynb Normal file
View File

@@ -0,0 +1,937 @@
{
"cells": [
{
"cell_type": "markdown",
"id": "ae6b4270",
"metadata": {},
"source": [
"# Лабораторная работа 10"
]
},
{
"cell_type": "markdown",
"id": "b4b9ee35",
"metadata": {},
"source": [
"В качестве задачи оптимизации была выбрана классическая вариация задачи о рюкзаке: дан набор предметов, каждый с определенным весом и ценностью. Требуется определить, какие предметы взять с собой в рюкзак, чтобы их суммарная ценность была максимальной, а суммарный вес не превышал заданную грузоподъемность рюкзака. При этом каждый предмет можно взять только один раз или не брать вовсе (0/1).\n",
"\n",
"Используем соответствующий датасет, в котором имеется большое число вариантов задачи с различными параметрами: https://www.kaggle.com/datasets/warcoder/knapsack-problem?select=knapsack_5_items.csv"
]
},
{
"cell_type": "code",
"execution_count": 70,
"id": "80d638c3",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.microsoft.datawrangler.viewer.v0+json": {
"columns": [
{
"name": "index",
"rawType": "int64",
"type": "integer"
},
{
"name": "Weights",
"rawType": "object",
"type": "string"
},
{
"name": "Prices",
"rawType": "object",
"type": "string"
},
{
"name": "Capacity",
"rawType": "int64",
"type": "integer"
},
{
"name": "Best picks",
"rawType": "object",
"type": "string"
},
{
"name": "Best price",
"rawType": "float64",
"type": "float"
}
],
"conversionMethod": "pd.DataFrame",
"ref": "f950228b-7bd0-4f67-b42e-48be43e881b9",
"rows": [
[
"0",
"[46 40 42 38 10]",
"[12 19 19 15 8]",
"40",
"[0. 1. 0. 0. 0.]",
"19.0"
],
[
"1",
"[11 31 4 6 7]",
"[ 2 8 18 16 3]",
"64",
"[1. 1. 1. 1. 1.]",
"47.0"
],
[
"2",
"[32 49 27 37 24]",
"[19 16 16 4 1]",
"87",
"[1. 0. 1. 0. 1.]",
"36.0"
],
[
"3",
"[20 35 22 23 16]",
"[19 17 19 9 1]",
"21",
"[1. 0. 0. 0. 0.]",
"19.0"
],
[
"4",
"[ 7 12 19 13 20]",
"[10 11 18 15 5]",
"50",
"[0. 1. 1. 1. 0.]",
"44.0"
],
[
"9995",
"[18 12 11 49 32]",
"[12 3 17 19 7]",
"41",
"[1. 1. 1. 0. 0.]",
"32.0"
],
[
"9996",
"[20 2 24 7 7]",
"[17 12 4 3 8]",
"17",
"[0. 1. 0. 1. 1.]",
"23.0"
],
[
"9997",
"[43 43 5 15 23]",
"[15 5 7 2 7]",
"62",
"[1. 0. 1. 0. 0.]",
"22.0"
],
[
"9998",
"[49 9 15 21 39]",
"[11 15 3 12 19]",
"65",
"[0. 1. 1. 0. 1.]",
"37.0"
],
[
"9999",
"[25 36 42 19 39]",
"[15 12 7 18 12]",
"79",
"[1. 0. 0. 1. 0.]",
"33.0"
]
],
"shape": {
"columns": 5,
"rows": 10
}
},
"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",
" <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",
" </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",
" </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",
" </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",
" </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",
" </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 \n",
"0 19.0 \n",
"1 47.0 \n",
"2 36.0 \n",
"3 19.0 \n",
"4 44.0 \n",
"9995 32.0 \n",
"9996 23.0 \n",
"9997 22.0 \n",
"9998 37.0 \n",
"9999 33.0 "
]
},
"execution_count": 70,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import pandas as pd\n",
"\n",
"df = pd.read_csv(\"..//..//static//csv//knapsack_5_items.csv\")\n",
"\n",
"pd.concat([df.head(5), df.tail(5)])"
]
},
{
"cell_type": "markdown",
"id": "884f0cd1",
"metadata": {},
"source": [
"### Структура хромосомы и тип данных гена\n",
"\n",
"В данном случае хромосома будет представлять из себя список длины n (количество предметов в конкректной задаче), который представляет собой решение задачи рюкзака — то есть указывает, какие предметы включить в рюкзак.\n",
"\n",
"Пример: [1, 0, 1, 0, 0]. В примере выбраны первый и третий предметы.\n",
"\n",
"Ген же — это одно значение в хромосоме. \n",
"\n",
"Тип данных: int.\n",
" \n",
"Возможные значения:\n",
"* 1 — предмет в рюкзаке;\n",
"* 0 — предмет не в рюкзаке."
]
},
{
"cell_type": "markdown",
"id": "92661ad8",
"metadata": {},
"source": [
"### Реализация функции генерации начальной популяции и ее тест:"
]
},
{
"cell_type": "code",
"execution_count": 71,
"id": "9a7b0970",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"[[0, 1, 0, 0, 0],\n",
" [1, 0, 0, 0, 1],\n",
" [1, 0, 0, 0, 0],\n",
" [1, 0, 1, 0, 1],\n",
" [1, 1, 1, 1, 0],\n",
" [0, 1, 0, 0, 1],\n",
" [1, 0, 1, 1, 1],\n",
" [1, 0, 0, 0, 1],\n",
" [1, 0, 1, 1, 0],\n",
" [1, 1, 0, 1, 1]]"
]
},
"execution_count": 71,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import random\n",
"\n",
"def create_individual(elements_num): \n",
" # Генерирует случайную двоичную строку той же длины, что и список элементов\n",
" return [random.randint(0, 1) for _ in range(elements_num)]\n",
"\n",
"def create_population(elements_num, population_size): \n",
" return [create_individual(elements_num) for _ in range(population_size)]\n",
"\n",
"create_population(5, 10)"
]
},
{
"cell_type": "markdown",
"id": "bc114201",
"metadata": {},
"source": [
"### Реализация фитнес-функции и ее тест:"
]
},
{
"cell_type": "code",
"execution_count": 72,
"id": "0809a0b1",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"44"
]
},
"execution_count": 72,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def evaluate_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",
" # Если общий вес превышает вместимость ранца, устанавливается значение 0 (неверное решение)\n",
" return total_value if total_weight <= capacity else 0\n",
"\n",
"evaluate_fitness([0, 1, 1, 1, 0], [7, 12, 19, 13, 20], [10, 11, 18, 15, 5], 50)"
]
},
{
"cell_type": "markdown",
"id": "cccc6557",
"metadata": {},
"source": [
"### Реализация оператора кроссинговера и его тест:"
]
},
{
"cell_type": "code",
"execution_count": 73,
"id": "4d5a13d7",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"([0, 1, 1, 0, 0], [1, 0, 1, 1, 0])"
]
},
"execution_count": 73,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# одноточечный кроссинговер\n",
"def crossover(parent1, parent2):\n",
" point = random.randint(1, len(parent1) - 1)\n",
" return (parent1[:point] + parent2[point:], parent2[:point] + parent1[point:])\n",
"\n",
"crossover([0, 1, 1, 1, 0], [1, 0, 1, 0, 0])"
]
},
{
"cell_type": "markdown",
"id": "08c626b5",
"metadata": {},
"source": [
"### Реализация двух операторов мутации и их тест:"
]
},
{
"cell_type": "code",
"execution_count": 74,
"id": "66021b53",
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0, 1, 1, 1, 0]\n",
"================\n",
"[0, 1, 0, 1, 0]\n",
"================\n",
"[0, 0, 0, 1, 1]\n"
]
}
],
"source": [
"# Мутация 1: побитовая замена\n",
"def mutate_flip_bits(individual, mutation_rate):\n",
" for i in range(len(individual)):\n",
" # Сработает с некоторой вероятностью\n",
" if random.random() < mutation_rate:\n",
" individual[i] = 1 - individual[i]\n",
"\n",
"# Мутация 2: случайный свап двух генов\n",
"def mutate_swap_genes(individual, mutation_rate):\n",
" if random.random() < mutation_rate:\n",
" i, j = random.sample(range(len(individual)), 2)\n",
" individual[i], individual[j] = individual[j], individual[i]\n",
"\n",
"individual = [0, 1, 1, 1, 0]\n",
"print(individual)\n",
"mutate_flip_bits(individual, 0.5)\n",
"print(\"================\")\n",
"print(individual)\n",
"print(\"================\")\n",
"mutate_swap_genes(individual, 1)\n",
"print(individual)"
]
},
{
"cell_type": "markdown",
"id": "d199e789",
"metadata": {},
"source": [
"### И наконец реализуем сам генетический алгоритм:"
]
},
{
"cell_type": "code",
"execution_count": 79,
"id": "17093d62",
"metadata": {},
"outputs": [],
"source": [
"# Параметры алгоритма\n",
"population_size = 100\n",
"num_generations = 10\n",
"mutation_rate = 0.1\n",
"mutation_strategy = 'flip'\n",
"\n",
"# Выбор участников кроссинговера с помощью селекции на основе рулетки\n",
"def select_parents(population, weights, prices, capacity):\n",
" fitness_values = [evaluate_fitness(ind, weights, prices, capacity) for ind in population]\n",
" total_fitness = sum(fitness_values)\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",
"def genetic_algorithm(weights, prices, capacity, population_size = 100, num_generations = 10, mutation_rate = 0.1, mutation_strategy='flip'):\n",
" elements_num = len(weights)\n",
" population = create_population(elements_num, population_size)\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",
" if mutation_strategy == 'flip':\n",
" mutate_flip_bits(c1, mutation_rate)\n",
" mutate_flip_bits(c2, mutation_rate)\n",
" elif mutation_strategy == 'swap':\n",
" mutate_swap_genes(c1, mutation_rate)\n",
" mutate_swap_genes(c2, mutation_rate)\n",
" new_population.extend([c1, c2])\n",
" population = new_population\n",
"\n",
" best = max(population, key=lambda ind: evaluate_fitness(ind, weights, prices, capacity))\n",
" best_value = evaluate_fitness(best, weights, prices, capacity)\n",
" return best, best_value"
]
},
{
"cell_type": "markdown",
"id": "f241602a",
"metadata": {},
"source": [
"Применим его для всех случаев из датасета:"
]
},
{
"cell_type": "code",
"execution_count": 80,
"id": "9ef718ac",
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.microsoft.datawrangler.viewer.v0+json": {
"columns": [
{
"name": "index",
"rawType": "int64",
"type": "integer"
},
{
"name": "Weights",
"rawType": "object",
"type": "string"
},
{
"name": "Prices",
"rawType": "object",
"type": "string"
},
{
"name": "Capacity",
"rawType": "int64",
"type": "integer"
},
{
"name": "Best picks",
"rawType": "object",
"type": "string"
},
{
"name": "Best price",
"rawType": "float64",
"type": "float"
},
{
"name": "algorithmPicks",
"rawType": "object",
"type": "unknown"
},
{
"name": "algorithmPrice",
"rawType": "int64",
"type": "integer"
}
],
"conversionMethod": "pd.DataFrame",
"ref": "767fbcfd-78f3-4b7e-a80d-6735c17b7fbd",
"rows": [
[
"0",
"[46 40 42 38 10]",
"[12 19 19 15 8]",
"40",
"[0. 1. 0. 0. 0.]",
"19.0",
"[0, 1, 0, 0, 0]",
"19"
],
[
"1",
"[11 31 4 6 7]",
"[ 2 8 18 16 3]",
"64",
"[1. 1. 1. 1. 1.]",
"47.0",
"[1, 1, 1, 1, 1]",
"47"
],
[
"2",
"[32 49 27 37 24]",
"[19 16 16 4 1]",
"87",
"[1. 0. 1. 0. 1.]",
"36.0",
"[1, 0, 1, 0, 1]",
"36"
],
[
"3",
"[20 35 22 23 16]",
"[19 17 19 9 1]",
"21",
"[1. 0. 0. 0. 0.]",
"19.0",
"[1, 0, 0, 0, 0]",
"19"
],
[
"4",
"[ 7 12 19 13 20]",
"[10 11 18 15 5]",
"50",
"[0. 1. 1. 1. 0.]",
"44.0",
"[0, 1, 1, 1, 0]",
"44"
],
[
"9995",
"[18 12 11 49 32]",
"[12 3 17 19 7]",
"41",
"[1. 1. 1. 0. 0.]",
"32.0",
"[1, 1, 1, 0, 0]",
"32"
],
[
"9996",
"[20 2 24 7 7]",
"[17 12 4 3 8]",
"17",
"[0. 1. 0. 1. 1.]",
"23.0",
"[0, 1, 0, 1, 1]",
"23"
],
[
"9997",
"[43 43 5 15 23]",
"[15 5 7 2 7]",
"62",
"[1. 0. 1. 0. 0.]",
"22.0",
"[1, 0, 1, 0, 0]",
"22"
],
[
"9998",
"[49 9 15 21 39]",
"[11 15 3 12 19]",
"65",
"[0. 1. 1. 0. 1.]",
"37.0",
"[0, 1, 1, 0, 1]",
"37"
],
[
"9999",
"[25 36 42 19 39]",
"[15 12 7 18 12]",
"79",
"[1. 0. 0. 1. 0.]",
"33.0",
"[1, 0, 0, 1, 0]",
"33"
]
],
"shape": {
"columns": 7,
"rows": 10
}
},
"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": 80,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import ast\n",
"import re\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(weights, prices, capacity, population_size, num_generations, mutation_rate, mutation_strategy)\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": "72958862",
"metadata": {},
"source": [
"По полученным результатам видно, что ответы алгоритма совпадают с теми ответами, которые уже имелись в наборе данных. Поэтому, можно сказать, что для таких условий задачи алгоритм работает успешно даже с 10 поколениями"
]
}
],
"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.5"
}
},
"nbformat": 4,
"nbformat_minor": 5
}

BIN
lab_10/requirements.txt Normal file

Binary file not shown.

2061
lab_12/lab12.ipynb Normal file

File diff suppressed because one or more lines are too long

BIN
lab_12/requirements.txt Normal file

Binary file not shown.