This repository has been archived on 2021-10-31. You can view files and clone it, but cannot push or open issues or pull requests.
AICup/Lectures/Student_lecture 3.ipynb

256 lines
62 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {
"collapsed": true,
"pycharm": {
"name": "#%% md\n"
}
},
"source": [
"## Third Lab\n",
"\n",
"What we are going to do today:\n",
"- Introduce two optimizers for local search methods\n",
"- Use the optimizer with the methods defined before"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This cell below is simply importing some useful stuff for later"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import glob\n",
"import numpy as np\n",
"from matplotlib import pyplot as plt\n",
"from time import time as t"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Optimizers\n",
"### 2opt\n",
"As we saw last time, we have 12 problems and two have an optimal solution"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"\n",
"from src.utils import compute_length\n",
"\n",
"\n",
"def step2opt(solution, matrix_dist, distance):\n",
" seq_length = len(solution) - 1\n",
" tsp_sequence = np.array(solution)\n",
" uncrosses = 0\n",
" # TODO\n",
" for i in range(1, seq_length - 1):\n",
" \n",
" # END TODO\n",
" return tsp_sequence, distance, uncrosses\n",
"\n",
"\n",
"def swap2opt(tsp_sequence, i, j):\n",
" # TODO\n",
" \n",
" # END TODO\n",
" return new_tsp_sequence\n",
"\n",
"\n",
"def gain(i, j, tsp_sequence, matrix_dist):\n",
" old_link_len = (matrix_dist[tsp_sequence[i], tsp_sequence[i - 1]] + matrix_dist[\n",
" tsp_sequence[j], tsp_sequence[j + 1]])\n",
" changed_links_len = (matrix_dist[tsp_sequence[j], tsp_sequence[i - 1]] + matrix_dist[\n",
" tsp_sequence[i], tsp_sequence[j + 1]])\n",
" return - old_link_len + changed_links_len\n",
"\n",
"\n",
"def loop2opt(solution, instance, max_num_of_uncrosses=10000):\n",
" matrix_dist = instance.dist_matrix\n",
" new_len = compute_length(solution, matrix_dist)\n",
" new_tsp_sequence = np.copy(np.array(solution))\n",
" uncross = 0\n",
" # TODO\n",
" \n",
" # END TODO"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"#### Let's test it"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
"\n",
"#############################\n",
"name: eil76\n",
"nPoints: 76\n",
"best_sol: 538.0\n",
"exist optimal: True\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"from src.io_tsp import ProblemInstance\n",
"example_problem = \"../problems/eil76.tsp\"\n",
"p_inst = ProblemInstance(example_problem)\n",
"p_inst.print_info()\n",
"p_inst.plot_data()"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"from src.TSP_solver import TSPSolver\n",
"from src.constructive_algorithms import (\n",
" random_method,\n",
" nearest_neighbor,\n",
" best_nearest_neighbor,\n",
" multi_fragment_mf\n",
")\n",
"\n",
"available_solvers = {\n",
" \"random\": random_method,\n",
" \"nn\":nearest_neighbor,\n",
" \"best_nn\":best_nearest_neighbor,\n",
" \"multi_fragment\": multi_fragment_mf\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"### solving with ['nn'] ####\n",
"Error the solution of nn for problem eil76 is not valid\n",
"best solution with len 680.0 \n",
"with a total time of 0.0 seconds\n",
"solution found has a 26.39 % gap\n",
"0.08463191986083984\n"
]
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x576 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
},
{
"name": "stdout",
"output_type": "stream",
"text": [
" 7.43 % gap\n",
"with 23 number of uncrossed edges\n"
]
}
],
"source": [
"solver = TSPSolver(\"nn\", p_inst, available_solvers)\n",
"start = t()\n",
"solver.compute_solution(return_value=False, verbose=True)\n",
"end = t()\n",
"\n",
"solver.plot_solution()\n",
"print(f\"best solution with len {solver.found_length} \\nwith a total time of {np.round(end - start, 5)} seconds\")\n",
"print(f\"solution found has a {solver.gap} % gap\")\n",
"\n",
"start = t()\n",
"solution, new_length, uncross = loop2opt(solver.solution, p_inst)\n",
"end = t()\n",
"print(end - start)\n",
"solver.method = \"nn folowed by 2 opt\"\n",
"\n",
"assert solver.pass_and_check_if_solution_is_valid(solution), \"Solution non valid\"\n",
"solver.solved = True\n",
"solver.solution = solution\n",
"solver.plot_solution()\n",
"solver._gap()\n",
"print(f\" {solver.gap} % gap\")\n",
"print(f\"with {uncross} number of uncrossed edges\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 2.5opt\n",
"We will see it in the next Lecture"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "PyCharm (AI2020BsC)",
"language": "python",
"name": "pycharm-61970693"
},
"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.8.3"
}
},
"nbformat": 4,
"nbformat_minor": 1
}