Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 08bd1f76c0 | |||
| 95f9913c6f | |||
| 3312b4f4d2 | |||
| b817368d6c | |||
| 37103ea009 | |||
| 9dd4777138 | |||
| 291f874fde | |||
| 77e2fa1385 | |||
| 426c79e4b8 |
937
lab_10/lab10.ipynb
Normal file
937
lab_10/lab10.ipynb
Normal 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
BIN
lab_10/requirements.txt
Normal file
Binary file not shown.
2061
lab_12/lab12.ipynb
Normal file
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
BIN
lab_12/requirements.txt
Normal file
Binary file not shown.
424
lab_9/lab9.ipynb
Normal file
424
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