{ "cells": [ { "cell_type": "markdown", "id": "3d21f91a-a0b6-47d8-8096-408733598cc2", "metadata": { "deletable": true, "editable": true, "frozen": false }, "source": [ "# 3.1 Sparsified vs. complete graphs as search space" ] }, { "cell_type": "markdown", "id": "833ef04c-0db6-4592-bcd1-c05ee0290184", "metadata": { "deletable": true, "editable": true, "frozen": false }, "source": [ "This is used in the paper **Flexible cable routing framework for wind farm collection system optimization**." ] }, { "cell_type": "code", "execution_count": 1, "id": "d1034bcc-96af-41fa-a3d2-ead116bdafe1", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [ "import fnmatch\n", "from itertools import chain, pairwise, accumulate\n", "from pathlib import Path\n", "import urllib.request\n", "import networkx as nx\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 2, "id": "8d9d606d-ac9b-4352-84a4-f046c8c7b2c5", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [ "from optiwindnet.svg import svgplot\n", "from optiwindnet.interarraylib import G_from_S, L_from_site\n", "from optiwindnet.mesh import make_planar_embedding" ] }, { "cell_type": "code", "execution_count": 3, "id": "4caf3f04-bcca-43a1-8803-8fba37473e25", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [ "# Additional python packages needed\n", "import py7zr\n", "import vrplib" ] }, { "cell_type": "code", "execution_count": 4, "id": "b8a31ffc-8537-4592-a5a0-40d3567dcc0a", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [ "import matplotlib.pyplot as plt\n", "\n", "%config InlineBackend.figure_formats = ['svg']\n", "plt.rcParams['svg.fonttype'] = 'none'\n", "\n", "style = Path('mplstyles/jupyter_dark.mplstyle')\n", "style.is_file() and plt.style.use(style)" ] }, { "cell_type": "markdown", "id": "6de2a586-04d9-42cf-b2d3-f178b36045b8", "metadata": { "deletable": true, "editable": true, "frozen": false }, "source": [ "## Data download" ] }, { "cell_type": "markdown", "id": "c783317b-0eae-45eb-a6e6-6900c401872a", "metadata": { "deletable": true, "editable": true, "frozen": false }, "source": [ "Queiroga, E., Sadykov, R., Uchoa, E., & Vidal, T. (2021, November 24). 10,000 optimal CVRP solutions for testing machine learning based heuristics. AAAI-22 Workshop on Machine Learning for Operations Research (ML4OR). https://openreview.net/forum?id=yHiMXKN6nTl" ] }, { "cell_type": "code", "execution_count": 5, "id": "bde1396d-78f5-4a5c-a66a-77605d00d9e4", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [ "# previously at: http://vrp.galgos.inf.puc-rio.br/media/com_vrp/instances/Vrp-Set-XML100.zip'\n", "file_name = 'XML.7z'\n", "# repository URL\n", "url = 'https://galgos.inf.puc-rio.br/cvrplib/uploads/files/xml100/' + file_name" ] }, { "cell_type": "code", "execution_count": 6, "id": "389ad434-e702-4aaa-8f34-97aa82c211c8", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [ "dir_instances = Path('XML/instances/')\n", "dir_solutions = Path('XML/solutions/')" ] }, { "cell_type": "code", "execution_count": 7, "id": "5a2e1dbe-d952-4e91-9e63-e330ce25e0c7", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [ "if dir_instances.is_dir() and dir_solutions.is_dir():\n", " # Already extracted\n", " instances = sorted(p.name for p in dir_instances.iterdir())\n", " solutions = [\n", " instance.replace('.vrp', '.sol')\n", " for instance in instances\n", " ]\n", "else:\n", " if Path(file_name).is_file():\n", " # Already downloaded\n", " filehandle = open(file_name, 'rb')\n", " else:\n", " # Download from repository\n", " filehandle, _ = urllib.request.urlretrieve(url)\n", " with py7zr.SevenZipFile(filehandle, mode=\"r\") as archive:\n", " # Extract only the unitary-demand cases\n", " archive_names = archive.getnames()\n", " instances = fnmatch.filter(\n", " archive_names,\n", " dir_instances / \"XML100_?11?_??.vrp\",\n", " )\n", " solutions = fnmatch.filter(\n", " archive_names,\n", " dir_solutions / 'XML100_?11?_??.sol',\n", " )\n", " archive.extract(path='.', targets=instances + solutions)\n", " instances = sorted(path.split('/')[-1] for path in instances)\n", " solutions = [\n", " instance.replace('.vrp', '.sol')\n", " for instance in instances\n", " ]" ] }, { "cell_type": "code", "execution_count": 8, "id": "fd43603a-6392-42f7-abde-fde4f10ffadc", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [ { "data": { "text/plain": [ "(480, 480)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(instances), len(solutions)" ] }, { "cell_type": "markdown", "id": "205f5b2d-bbe3-464b-b5d3-ff8fe9168e5b", "metadata": { "deletable": true, "editable": true, "frozen": false }, "source": [ "## Definitions" ] }, { "cell_type": "code", "execution_count": 9, "id": "3b1621e6-b4e6-40ac-99a1-4a2b1654de5d", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [ "def check_rogues(solution, A):\n", " rogues = []\n", " branches = ([n - 1 for n in branch] for branch in solution['routes'])\n", " for branch in branches:\n", " for edge in pairwise(branch):\n", " if edge not in A.edges:\n", " rogues.append(edge)\n", " return rogues" ] }, { "cell_type": "code", "execution_count": 10, "id": "dc8c242e-e87a-48a1-95f0-ecd2bbb884cf", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [ "def S_from_vrplib(solution, Sʹ):\n", " '''\n", " Beware: assumes a single depot!\n", " '''\n", " # create a topology graph S from the solution\n", " S = nx.Graph(\n", " T=Sʹ.graph['T'], R=Sʹ.graph['R'],\n", " capacity=Sʹ.graph['capacity'],\n", " has_loads=True,\n", " objective=solution['cost'],\n", " creator='vrplib',\n", " )\n", "\n", " branches = ([n - 1 for n in branch] for branch in solution['routes'])\n", " for subtree_id, branch in enumerate(branches):\n", " loads = range(len(branch), 0, -1)\n", " S.add_nodes_from(((n, {'load': load})\n", " for n, load in zip(branch, loads)),\n", " subtree=subtree_id)\n", " branch_roll = [-1] + branch[:-1]\n", " reverses = tuple(u < v for u, v in zip(branch, branch_roll))\n", " edgeD = ({'load': load, 'reverse': reverse}\n", " for load, reverse in zip(loads, reverses))\n", " S.add_edges_from(zip(branch_roll, branch, edgeD))\n", " root_load = sum(S.nodes[n]['load'] for n in S.neighbors(-1))\n", " S.nodes[-1]['load'] = root_load\n", " return S" ] }, { "cell_type": "code", "execution_count": 11, "id": "6b591101-512d-417f-8cc2-e0aa96157691", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [ "def L_from_vrplib(instance):\n", " R = len(instance['depot'])\n", " T = instance['dimension'] - R\n", " # make sure depots are numbered 0..M-1\n", " assert all(depot == i for i, depot in enumerate(instance['depot']))\n", " L = L_from_site(\n", " B=4, border=np.arange(T, T + 4),\n", " R=R, T=T, name=instance['name'],\n", " VertexC=np.vstack((instance['node_coord'][R:],\n", " [[0,0], [1000, 0], [1000, 1000], [0, 1000]],\n", " instance['node_coord'][:R])),\n", " )\n", " L.graph['capacity'] = instance['capacity']\n", " return L" ] }, { "cell_type": "markdown", "id": "a5b1bdb1-6157-433c-b1f2-f2a9dc6168a6", "metadata": { "deletable": true, "editable": true, "frozen": false }, "source": [ "## Examine XML100 \\_11\\_\n", "\n", "(i.e. random client positions, 1-demand)" ] }, { "cell_type": "code", "execution_count": 12, "id": "7cf8bd99-e3cd-4c0b-96f3-7b2953f5b4cc", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [ "inst_id = '2115_07'\n", "instance = vrplib.read_instance(dir_instances / f'XML100_{inst_id}.vrp')\n", "solution = vrplib.read_solution(dir_solutions / f'XML100_{inst_id}.sol')" ] }, { "cell_type": "code", "execution_count": 13, "id": "03ebcb82-bcf7-4a9e-861b-868463bc6ac5", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [ { "data": { "text/plain": [ "dict_keys(['name', 'comment', 'type', 'dimension', 'edge_weight_type', 'capacity', 'node_coord', 'demand', 'depot', 'edge_weight'])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "instance.keys()" ] }, { "cell_type": "code", "execution_count": 14, "id": "093488d6-9484-4af6-83ee-673e4876843a", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [ { "data": { "text/plain": [ "dict_keys(['routes', 'cost'])" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "solution.keys()" ] }, { "cell_type": "code", "execution_count": 15, "id": "9454307a-5a0a-4525-8ef6-c2d99b3e1682", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [ "L = L_from_vrplib(instance)" ] }, { "cell_type": "code", "execution_count": 16, "id": "bb0abae0-fde3-4506-aa9b-5ef312249084", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "svgplot(L)" ] }, { "cell_type": "code", "execution_count": 17, "id": "7b74b839-2ec5-4243-a16b-df2edccf1f72", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [ "P, A = make_planar_embedding(L)" ] }, { "cell_type": "code", "execution_count": 18, "id": "cbf57590-b17a-4f61-b738-f1f695a4d962", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [ { "data": { "image/svg+xml": [ "" ], "text/plain": [ "" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "svgplot(A)" ] }, { "cell_type": "code", "execution_count": 19, "id": "f90fa638-62a9-4cc6-a6ff-ee29ec4a7307", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [ "S = S_from_vrplib(solution, L)" ] }, { "cell_type": "code", "execution_count": 20, "id": "5ac25266-3d21-4a31-a31c-43b25ab37261", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [ "G = G_from_S(S, A)" ] }, { "cell_type": "code", "execution_count": 21, "id": "49f1445e-b682-4887-a69f-d7ad2124852c", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [ { "data": { "image/svg+xml": [ "Σλ = 8 740.0 m(+0) [-1]: 6κ = 19, T = 100" ], "text/plain": [ "" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "svgplot(G)" ] }, { "cell_type": "markdown", "id": "d5817069-d24c-4007-8023-93b759fd7210", "metadata": { "deletable": true, "editable": true, "frozen": false }, "source": [ "## Get Statistics!" ] }, { "cell_type": "code", "execution_count": 22, "id": "f684c6d1-7918-4583-993e-2deeb60ea808", "metadata": { "deletable": true, "editable": true, "frozen": false, "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "ROGUES (4): XML100_1111_01.sol\n", "CLEAN: XML100_1111_02.sol\n", "ROGUES (2): XML100_1111_03.sol\n", "ROGUES (1): XML100_1111_04.sol\n", "ROGUES (1): XML100_1111_05.sol\n", "ROGUES (2): XML100_1111_06.sol\n", "ROGUES (1): XML100_1111_07.sol\n", "CLEAN: XML100_1111_08.sol\n", "ROGUES (2): XML100_1111_09.sol\n", "CLEAN: XML100_1111_10.sol\n", "ROGUES (2): XML100_1111_11.sol\n", "ROGUES (1): XML100_1111_12.sol\n", "CLEAN: XML100_1111_13.sol\n", "CLEAN: XML100_1111_14.sol\n", "CLEAN: XML100_1111_15.sol\n", "CLEAN: XML100_1111_16.sol\n", "ROGUES (1): XML100_1111_17.sol\n", "ROGUES (2): XML100_1111_18.sol\n", "ROGUES (1): XML100_1111_19.sol\n", "CLEAN: XML100_1111_20.sol\n", "CLEAN: XML100_1111_21.sol\n", "CLEAN: XML100_1111_22.sol\n", "ROGUES (2): XML100_1111_23.sol\n", "CLEAN: XML100_1111_24.sol\n", "CLEAN: XML100_1111_25.sol\n", "CLEAN: XML100_1111_26.sol\n", "CLEAN: XML100_1111_27.sol\n", "ROGUES (2): XML100_1112_01.sol\n", "ROGUES (3): XML100_1112_02.sol\n", "ROGUES (2): XML100_1112_03.sol\n", "CLEAN: XML100_1112_04.sol\n", "ROGUES (2): XML100_1112_05.sol\n", "ROGUES (2): XML100_1112_06.sol\n", "ROGUES (4): XML100_1112_07.sol\n", "ROGUES (1): XML100_1112_08.sol\n", "ROGUES (2): XML100_1112_09.sol\n", "ROGUES (3): XML100_1112_10.sol\n", "ROGUES (2): XML100_1112_11.sol\n", "CLEAN: XML100_1112_12.sol\n", "ROGUES (2): XML100_1112_13.sol\n", "ROGUES (1): XML100_1112_14.sol\n", "ROGUES (3): XML100_1112_15.sol\n", "CLEAN: XML100_1112_16.sol\n", "ROGUES (2): XML100_1112_17.sol\n", "CLEAN: XML100_1112_18.sol\n", "ROGUES (2): XML100_1112_19.sol\n", "ROGUES (3): XML100_1112_20.sol\n", "ROGUES (1): XML100_1112_21.sol\n", "CLEAN: XML100_1112_22.sol\n", "ROGUES (2): XML100_1112_23.sol\n", "ROGUES (1): XML100_1112_24.sol\n", "ROGUES (1): XML100_1112_25.sol\n", "ROGUES (1): XML100_1112_26.sol\n", "ROGUES (3): XML100_1112_27.sol\n", "ROGUES (3): XML100_1113_01.sol\n", "ROGUES (1): XML100_1113_02.sol\n", "ROGUES (3): XML100_1113_03.sol\n", "ROGUES (1): XML100_1113_04.sol\n", "ROGUES (2): XML100_1113_05.sol\n", "ROGUES (1): XML100_1113_06.sol\n", "ROGUES (2): XML100_1113_07.sol\n", "ROGUES (3): XML100_1113_08.sol\n", "ROGUES (2): XML100_1113_09.sol\n", "ROGUES (1): XML100_1113_10.sol\n", "ROGUES (1): XML100_1113_11.sol\n", "CLEAN: XML100_1113_12.sol\n", "ROGUES (3): XML100_1113_13.sol\n", "ROGUES (2): XML100_1113_14.sol\n", "ROGUES (1): XML100_1113_15.sol\n", "CLEAN: XML100_1113_16.sol\n", "CLEAN: XML100_1113_17.sol\n", "ROGUES (2): XML100_1113_18.sol\n", "ROGUES (1): XML100_1113_19.sol\n", "ROGUES (1): XML100_1113_20.sol\n", "ROGUES (3): XML100_1113_21.sol\n", "ROGUES (1): XML100_1113_22.sol\n", "ROGUES (2): XML100_1113_23.sol\n", "ROGUES (1): XML100_1113_24.sol\n", "ROGUES (3): XML100_1113_25.sol\n", "ROGUES (1): XML100_1113_26.sol\n", "ROGUES (3): XML100_1113_27.sol\n", "ROGUES (3): XML100_1114_01.sol\n", "ROGUES (1): XML100_1114_02.sol\n", "ROGUES (2): XML100_1114_03.sol\n", "CLEAN: XML100_1114_04.sol\n", "ROGUES (3): XML100_1114_05.sol\n", "ROGUES (3): XML100_1114_06.sol\n", "ROGUES (1): XML100_1114_07.sol\n", "ROGUES (1): XML100_1114_08.sol\n", "ROGUES (2): XML100_1114_09.sol\n", "ROGUES (2): XML100_1114_10.sol\n", "CLEAN: XML100_1114_11.sol\n", "ROGUES (2): XML100_1114_12.sol\n", "ROGUES (2): XML100_1114_13.sol\n", "ROGUES (4): XML100_1114_14.sol\n", "ROGUES (3): XML100_1114_15.sol\n", "ROGUES (3): XML100_1114_16.sol\n", "ROGUES (2): XML100_1114_17.sol\n", "ROGUES (3): XML100_1114_18.sol\n", "ROGUES (2): XML100_1114_19.sol\n", "ROGUES (1): XML100_1114_20.sol\n", "ROGUES (2): XML100_1114_21.sol\n", "CLEAN: XML100_1114_22.sol\n", "CLEAN: XML100_1114_23.sol\n", "ROGUES (1): XML100_1114_24.sol\n", "ROGUES (1): XML100_1114_25.sol\n", "ROGUES (2): XML100_1114_26.sol\n", "ROGUES (4): XML100_1114_27.sol\n", "ROGUES (1): XML100_1115_01.sol\n", "ROGUES (2): XML100_1115_02.sol\n", "ROGUES (2): XML100_1115_03.sol\n", "CLEAN: XML100_1115_04.sol\n", "ROGUES (3): XML100_1115_05.sol\n", "ROGUES (3): XML100_1115_06.sol\n", "ROGUES (1): XML100_1115_07.sol\n", "ROGUES (2): XML100_1115_08.sol\n", "ROGUES (3): XML100_1115_09.sol\n", "ROGUES (1): XML100_1115_10.sol\n", "CLEAN: XML100_1115_11.sol\n", "CLEAN: XML100_1115_12.sol\n", "ROGUES (1): XML100_1115_13.sol\n", "ROGUES (1): XML100_1115_14.sol\n", "ROGUES (1): XML100_1115_15.sol\n", "ROGUES (3): XML100_1115_16.sol\n", "ROGUES (2): XML100_1115_17.sol\n", "CLEAN: XML100_1115_18.sol\n", "ROGUES (2): XML100_1115_19.sol\n", "ROGUES (2): XML100_1115_20.sol\n", "ROGUES (1): XML100_1115_21.sol\n", "ROGUES (1): XML100_1115_22.sol\n", "ROGUES (3): XML100_1115_23.sol\n", "CLEAN: XML100_1115_24.sol\n", "ROGUES (1): XML100_1115_25.sol\n", "ROGUES (3): XML100_1115_26.sol\n", "CLEAN: XML100_1115_27.sol\n", "CLEAN: XML100_1116_01.sol\n", "CLEAN: XML100_1116_02.sol\n", "CLEAN: XML100_1116_03.sol\n", "CLEAN: XML100_1116_04.sol\n", "ROGUES (1): XML100_1116_05.sol\n", "ROGUES (1): XML100_1116_06.sol\n", "CLEAN: XML100_1116_07.sol\n", "CLEAN: XML100_1116_08.sol\n", "CLEAN: XML100_1116_09.sol\n", "CLEAN: XML100_1116_10.sol\n", "CLEAN: XML100_1116_11.sol\n", "ROGUES (1): XML100_1116_12.sol\n", "CLEAN: XML100_1116_13.sol\n", "ROGUES (2): XML100_1116_14.sol\n", "ROGUES (1): XML100_1116_15.sol\n", "CLEAN: XML100_1116_16.sol\n", "CLEAN: XML100_1116_17.sol\n", "ROGUES (2): XML100_1116_18.sol\n", "CLEAN: XML100_1116_19.sol\n", "CLEAN: XML100_1116_20.sol\n", "CLEAN: XML100_1116_21.sol\n", "ROGUES (1): XML100_1116_22.sol\n", "CLEAN: XML100_1116_23.sol\n", "CLEAN: XML100_1116_24.sol\n", "CLEAN: XML100_1116_25.sol\n", "CLEAN: XML100_1116_26.sol\n", "CLEAN: XML100_1116_27.sol\n", "ROGUES (1): XML100_2111_01.sol\n", "ROGUES (1): XML100_2111_02.sol\n", "ROGUES (2): XML100_2111_03.sol\n", "ROGUES (1): XML100_2111_04.sol\n", "CLEAN: XML100_2111_05.sol\n", "ROGUES (1): XML100_2111_06.sol\n", "ROGUES (1): XML100_2111_07.sol\n", "ROGUES (1): XML100_2111_08.sol\n", "CLEAN: XML100_2111_09.sol\n", "ROGUES (1): XML100_2111_10.sol\n", "ROGUES (1): XML100_2111_11.sol\n", "CLEAN: XML100_2111_12.sol\n", "CLEAN: XML100_2111_13.sol\n", "ROGUES (1): XML100_2111_14.sol\n", "CLEAN: XML100_2111_15.sol\n", "CLEAN: XML100_2111_16.sol\n", "ROGUES (2): XML100_2111_17.sol\n", "CLEAN: XML100_2111_18.sol\n", "CLEAN: XML100_2111_19.sol\n", "CLEAN: XML100_2111_20.sol\n", "CLEAN: XML100_2111_21.sol\n", "CLEAN: XML100_2111_22.sol\n", "ROGUES (1): XML100_2111_23.sol\n", "ROGUES (3): XML100_2111_24.sol\n", "ROGUES (1): XML100_2111_25.sol\n", "ROGUES (1): XML100_2111_26.sol\n", "CLEAN: XML100_2111_27.sol\n", "ROGUES (1): XML100_2112_01.sol\n", "CLEAN: XML100_2112_02.sol\n", "ROGUES (1): XML100_2112_03.sol\n", "ROGUES (1): XML100_2112_04.sol\n", "ROGUES (3): XML100_2112_05.sol\n", "ROGUES (2): XML100_2112_06.sol\n", "ROGUES (2): XML100_2112_07.sol\n", "ROGUES (1): XML100_2112_08.sol\n", "ROGUES (2): XML100_2112_09.sol\n", "ROGUES (1): XML100_2112_10.sol\n", "CLEAN: XML100_2112_11.sol\n", "ROGUES (1): XML100_2112_12.sol\n", "ROGUES (1): XML100_2112_13.sol\n", "ROGUES (4): XML100_2112_14.sol\n", "ROGUES (1): XML100_2112_15.sol\n", "ROGUES (2): XML100_2112_16.sol\n", "ROGUES (3): XML100_2112_17.sol\n", "ROGUES (1): XML100_2112_18.sol\n", "ROGUES (3): XML100_2112_19.sol\n", "CLEAN: XML100_2112_20.sol\n", "ROGUES (1): XML100_2112_21.sol\n", "ROGUES (2): XML100_2112_22.sol\n", "ROGUES (4): XML100_2112_23.sol\n", "ROGUES (1): XML100_2112_24.sol\n", "ROGUES (3): XML100_2112_25.sol\n", "CLEAN: XML100_2112_26.sol\n", "ROGUES (3): XML100_2112_27.sol\n", "ROGUES (3): XML100_2113_01.sol\n", "ROGUES (1): XML100_2113_02.sol\n", "ROGUES (2): XML100_2113_03.sol\n", "CLEAN: XML100_2113_04.sol\n", "CLEAN: XML100_2113_05.sol\n", "ROGUES (1): XML100_2113_06.sol\n", "CLEAN: XML100_2113_07.sol\n", "ROGUES (2): XML100_2113_08.sol\n", "ROGUES (3): XML100_2113_09.sol\n", "ROGUES (4): XML100_2113_10.sol\n", "CLEAN: XML100_2113_11.sol\n", "ROGUES (3): XML100_2113_12.sol\n", "ROGUES (2): XML100_2113_13.sol\n", "ROGUES (4): XML100_2113_14.sol\n", "ROGUES (2): XML100_2113_15.sol\n", "ROGUES (3): XML100_2113_16.sol\n", "CLEAN: XML100_2113_17.sol\n", "CLEAN: XML100_2113_18.sol\n", "CLEAN: XML100_2113_19.sol\n", "ROGUES (1): XML100_2113_20.sol\n", "ROGUES (1): XML100_2113_21.sol\n", "CLEAN: XML100_2113_22.sol\n", "ROGUES (2): XML100_2113_23.sol\n", "CLEAN: XML100_2113_24.sol\n", "ROGUES (2): XML100_2113_25.sol\n", "ROGUES (2): XML100_2113_26.sol\n", "ROGUES (2): XML100_2113_27.sol\n", "ROGUES (2): XML100_2114_01.sol\n", "CLEAN: XML100_2114_02.sol\n", "ROGUES (2): XML100_2114_03.sol\n", "CLEAN: XML100_2114_04.sol\n", "ROGUES (1): XML100_2114_05.sol\n", "ROGUES (2): XML100_2114_06.sol\n", "ROGUES (1): XML100_2114_07.sol\n", "CLEAN: XML100_2114_08.sol\n", "ROGUES (1): XML100_2114_09.sol\n", "CLEAN: XML100_2114_10.sol\n", "ROGUES (1): XML100_2114_11.sol\n", "ROGUES (1): XML100_2114_12.sol\n", "CLEAN: XML100_2114_13.sol\n", "ROGUES (2): XML100_2114_14.sol\n", "ROGUES (2): XML100_2114_15.sol\n", "ROGUES (1): XML100_2114_16.sol\n", "ROGUES (2): XML100_2114_17.sol\n", "ROGUES (1): XML100_2114_18.sol\n", "ROGUES (1): XML100_2114_19.sol\n", "CLEAN: XML100_2114_20.sol\n", "ROGUES (1): XML100_2114_21.sol\n", "CLEAN: XML100_2114_22.sol\n", "ROGUES (2): XML100_2114_23.sol\n", "CLEAN: XML100_2114_24.sol\n", "CLEAN: XML100_2114_25.sol\n", "CLEAN: XML100_2114_26.sol\n", "ROGUES (1): XML100_2114_27.sol\n", "CLEAN: XML100_2115_01.sol\n", "CLEAN: XML100_2115_02.sol\n", "ROGUES (1): XML100_2115_03.sol\n", "ROGUES (1): XML100_2115_04.sol\n", "CLEAN: XML100_2115_05.sol\n", "CLEAN: XML100_2115_06.sol\n", "ROGUES (3): XML100_2115_07.sol\n", "ROGUES (2): XML100_2115_08.sol\n", "CLEAN: XML100_2115_09.sol\n", "CLEAN: XML100_2115_10.sol\n", "CLEAN: XML100_2115_11.sol\n", "ROGUES (2): XML100_2115_12.sol\n", "CLEAN: XML100_2115_13.sol\n", "CLEAN: XML100_2115_14.sol\n", "CLEAN: XML100_2115_15.sol\n", "CLEAN: XML100_2115_16.sol\n", "ROGUES (4): XML100_2115_17.sol\n", "CLEAN: XML100_2115_18.sol\n", "CLEAN: XML100_2115_19.sol\n", "ROGUES (1): XML100_2115_20.sol\n", "CLEAN: XML100_2115_21.sol\n", "ROGUES (1): XML100_2115_22.sol\n", "CLEAN: XML100_2115_23.sol\n", "CLEAN: XML100_2115_24.sol\n", "CLEAN: XML100_2115_25.sol\n", "CLEAN: XML100_2115_26.sol\n", "ROGUES (1): XML100_2115_27.sol\n", "CLEAN: XML100_2116_01.sol\n", "CLEAN: XML100_2116_02.sol\n", "CLEAN: XML100_2116_03.sol\n", "ROGUES (1): XML100_2116_04.sol\n", "CLEAN: XML100_2116_05.sol\n", "CLEAN: XML100_2116_06.sol\n", "ROGUES (1): XML100_2116_07.sol\n", "CLEAN: XML100_2116_08.sol\n", "ROGUES (1): XML100_2116_09.sol\n", "CLEAN: XML100_2116_10.sol\n", "CLEAN: XML100_2116_11.sol\n", "CLEAN: XML100_2116_12.sol\n", "CLEAN: XML100_2116_13.sol\n", "CLEAN: XML100_2116_14.sol\n", "CLEAN: XML100_2116_15.sol\n", "ROGUES (2): XML100_2116_16.sol\n", "CLEAN: XML100_2116_17.sol\n", "CLEAN: XML100_2116_18.sol\n", "CLEAN: XML100_2116_19.sol\n", "ROGUES (1): XML100_2116_20.sol\n", "CLEAN: XML100_2116_21.sol\n", "CLEAN: XML100_2116_22.sol\n", "CLEAN: XML100_2116_23.sol\n", "CLEAN: XML100_2116_24.sol\n", "ROGUES (1): XML100_2116_25.sol\n", "CLEAN: XML100_2116_26.sol\n", "CLEAN: XML100_2116_27.sol\n", "ROGUES (3): XML100_3111_01.sol\n", "ROGUES (1): XML100_3111_02.sol\n", "ROGUES (2): XML100_3111_03.sol\n", "CLEAN: XML100_3111_04.sol\n", "CLEAN: XML100_3111_05.sol\n", "ROGUES (1): XML100_3111_06.sol\n", "ROGUES (4): XML100_3111_07.sol\n", "ROGUES (4): XML100_3111_08.sol\n", "CLEAN: XML100_3111_09.sol\n", "CLEAN: XML100_3111_10.sol\n", "ROGUES (1): XML100_3111_11.sol\n", "CLEAN: XML100_3111_12.sol\n", "ROGUES (2): XML100_3111_13.sol\n", "CLEAN: XML100_3111_14.sol\n", "ROGUES (2): XML100_3111_15.sol\n", "ROGUES (3): XML100_3111_16.sol\n", "ROGUES (2): XML100_3111_17.sol\n", "ROGUES (1): XML100_3111_18.sol\n", "ROGUES (2): XML100_3111_19.sol\n", "ROGUES (1): XML100_3111_20.sol\n", "ROGUES (1): XML100_3111_21.sol\n", "CLEAN: XML100_3111_22.sol\n", "ROGUES (3): XML100_3111_23.sol\n", "CLEAN: XML100_3111_24.sol\n", "ROGUES (1): XML100_3111_25.sol\n", "CLEAN: XML100_3111_26.sol\n", "ROGUES (2): XML100_3112_01.sol\n", "ROGUES (1): XML100_3112_02.sol\n", "ROGUES (2): XML100_3112_03.sol\n", "CLEAN: XML100_3112_04.sol\n", "ROGUES (2): XML100_3112_05.sol\n", "ROGUES (1): XML100_3112_06.sol\n", "ROGUES (2): XML100_3112_07.sol\n", "CLEAN: XML100_3112_08.sol\n", "ROGUES (4): XML100_3112_09.sol\n", "ROGUES (1): XML100_3112_10.sol\n", "ROGUES (1): XML100_3112_11.sol\n", "ROGUES (3): XML100_3112_12.sol\n", "CLEAN: XML100_3112_13.sol\n", "ROGUES (2): XML100_3112_14.sol\n", "ROGUES (2): XML100_3112_15.sol\n", "ROGUES (2): XML100_3112_16.sol\n", "ROGUES (2): XML100_3112_17.sol\n", "ROGUES (3): XML100_3112_18.sol\n", "ROGUES (1): XML100_3112_19.sol\n", "ROGUES (3): XML100_3112_20.sol\n", "ROGUES (1): XML100_3112_21.sol\n", "ROGUES (1): XML100_3112_22.sol\n", "ROGUES (3): XML100_3112_23.sol\n", "ROGUES (2): XML100_3112_24.sol\n", "ROGUES (1): XML100_3112_25.sol\n", "ROGUES (1): XML100_3112_26.sol\n", "ROGUES (5): XML100_3113_01.sol\n", "ROGUES (3): XML100_3113_02.sol\n", "ROGUES (2): XML100_3113_03.sol\n", "ROGUES (2): XML100_3113_04.sol\n", "CLEAN: XML100_3113_05.sol\n", "ROGUES (1): XML100_3113_06.sol\n", "CLEAN: XML100_3113_07.sol\n", "ROGUES (1): XML100_3113_08.sol\n", "ROGUES (1): XML100_3113_09.sol\n", "ROGUES (1): XML100_3113_10.sol\n", "ROGUES (2): XML100_3113_11.sol\n", "ROGUES (3): XML100_3113_12.sol\n", "ROGUES (2): XML100_3113_13.sol\n", "ROGUES (1): XML100_3113_14.sol\n", "CLEAN: XML100_3113_15.sol\n", "ROGUES (2): XML100_3113_16.sol\n", "ROGUES (4): XML100_3113_17.sol\n", "ROGUES (1): XML100_3113_18.sol\n", "ROGUES (1): XML100_3113_19.sol\n", "ROGUES (2): XML100_3113_20.sol\n", "ROGUES (1): XML100_3113_21.sol\n", "ROGUES (1): XML100_3113_22.sol\n", "CLEAN: XML100_3113_23.sol\n", "ROGUES (3): XML100_3113_24.sol\n", "ROGUES (2): XML100_3113_25.sol\n", "ROGUES (1): XML100_3113_26.sol\n", "ROGUES (5): XML100_3114_01.sol\n", "ROGUES (3): XML100_3114_02.sol\n", "ROGUES (1): XML100_3114_03.sol\n", "ROGUES (2): XML100_3114_04.sol\n", "ROGUES (6): XML100_3114_05.sol\n", "ROGUES (3): XML100_3114_06.sol\n", "ROGUES (2): XML100_3114_07.sol\n", "ROGUES (3): XML100_3114_08.sol\n", "ROGUES (2): XML100_3114_09.sol\n", "CLEAN: XML100_3114_10.sol\n", "ROGUES (2): XML100_3114_11.sol\n", "ROGUES (1): XML100_3114_12.sol\n", "ROGUES (1): XML100_3114_13.sol\n", "ROGUES (2): XML100_3114_14.sol\n", "CLEAN: XML100_3114_15.sol\n", "ROGUES (2): XML100_3114_16.sol\n", "ROGUES (2): XML100_3114_17.sol\n", "ROGUES (1): XML100_3114_18.sol\n", "CLEAN: XML100_3114_19.sol\n", "CLEAN: XML100_3114_20.sol\n", "ROGUES (2): XML100_3114_21.sol\n", "ROGUES (3): XML100_3114_22.sol\n", "ROGUES (1): XML100_3114_23.sol\n", "ROGUES (2): XML100_3114_24.sol\n", "ROGUES (3): XML100_3114_25.sol\n", "CLEAN: XML100_3114_26.sol\n", "CLEAN: XML100_3115_01.sol\n", "ROGUES (3): XML100_3115_02.sol\n", "ROGUES (1): XML100_3115_03.sol\n", "ROGUES (3): XML100_3115_04.sol\n", "ROGUES (3): XML100_3115_05.sol\n", "ROGUES (3): XML100_3115_06.sol\n", "ROGUES (5): XML100_3115_07.sol\n", "ROGUES (2): XML100_3115_08.sol\n", "CLEAN: XML100_3115_09.sol\n", "ROGUES (1): XML100_3115_10.sol\n", "ROGUES (1): XML100_3115_11.sol\n", "ROGUES (2): XML100_3115_12.sol\n", "ROGUES (2): XML100_3115_13.sol\n", "CLEAN: XML100_3115_14.sol\n", "ROGUES (4): XML100_3115_15.sol\n", "CLEAN: XML100_3115_16.sol\n", "ROGUES (2): XML100_3115_17.sol\n", "CLEAN: XML100_3115_18.sol\n", "ROGUES (4): XML100_3115_19.sol\n", "ROGUES (2): XML100_3115_20.sol\n", "ROGUES (1): XML100_3115_21.sol\n", "ROGUES (1): XML100_3115_22.sol\n", "ROGUES (2): XML100_3115_23.sol\n", "ROGUES (3): XML100_3115_24.sol\n", "CLEAN: XML100_3115_25.sol\n", "ROGUES (1): XML100_3115_26.sol\n", "CLEAN: XML100_3116_01.sol\n", "ROGUES (1): XML100_3116_02.sol\n", "ROGUES (1): XML100_3116_03.sol\n", "ROGUES (1): XML100_3116_04.sol\n", "ROGUES (2): XML100_3116_05.sol\n", "ROGUES (1): XML100_3116_06.sol\n", "ROGUES (1): XML100_3116_07.sol\n", "CLEAN: XML100_3116_08.sol\n", "ROGUES (1): XML100_3116_09.sol\n", "CLEAN: XML100_3116_10.sol\n", "CLEAN: XML100_3116_11.sol\n", "ROGUES (1): XML100_3116_12.sol\n", "ROGUES (2): XML100_3116_13.sol\n", "CLEAN: XML100_3116_14.sol\n", "CLEAN: XML100_3116_15.sol\n", "ROGUES (1): XML100_3116_16.sol\n", "ROGUES (1): XML100_3116_17.sol\n", "ROGUES (1): XML100_3116_18.sol\n", "CLEAN: XML100_3116_19.sol\n", "ROGUES (3): XML100_3116_20.sol\n", "ROGUES (1): XML100_3116_21.sol\n", "ROGUES (1): XML100_3116_22.sol\n", "ROGUES (2): XML100_3116_23.sol\n", "ROGUES (1): XML100_3116_24.sol\n", "ROGUES (1): XML100_3116_25.sol\n", "CLEAN: XML100_3116_26.sol\n" ] } ], "source": [ "num_instances = 0\n", "num_total_edges = 0\n", "num_total_rogues = 0\n", "edge_counts = []\n", "problems = []\n", "for solfile in solutions:\n", " num_instances += 1\n", " vrpfile = solfile.replace('.sol', '.vrp')\n", " instance = vrplib.read_instance(dir_instances / vrpfile)\n", " solution = vrplib.read_solution(dir_solutions / solfile)\n", " L = L_from_vrplib(instance)\n", " P, A = make_planar_embedding(L)\n", " S = S_from_vrplib(solution, L)\n", " num_feeders = S.degree[-1]\n", " # num_edges = T.number_of_edges() - num_feeders\n", " # num_total_edges += num_edges\n", " num_edges = S.number_of_edges()\n", " num_total_edges += num_edges\n", " edge_counts.append(num_edges)\n", " rogues = check_rogues(solution, A)\n", " if rogues:\n", " # print(rogues)\n", " num_total_rogues += len(rogues)\n", " G = G_from_S(S, A)\n", " problems.append((solfile.split('/')[-1], rogues, svgplot(G)))\n", " print(f'ROGUES ({len(rogues)}):', solfile)\n", " else:\n", " print('CLEAN:', solfile)" ] }, { "cell_type": "code", "execution_count": 23, "id": "8c6632f7-fe7a-4d79-873f-6e0d320069dd", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [ "rogue_counts = np.array([len(rogues) for _, rogues, _ in problems])\n", "num_rogues_range = range(0, max(rogue_counts) + 1)\n", "count_per_num_rogues = [sum(rogue_counts == num_rogues) for num_rogues in num_rogues_range]\n", "count_per_num_rogues[0] = num_instances - len(problems)" ] }, { "cell_type": "code", "execution_count": 24, "id": "22ff5357-7c3a-4f6f-a032-1b5f00248380", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " image/svg+xml\n", " \n", " \n", " OptiWindNet\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 1\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 2\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 3\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 4\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 5\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 6\n", " \n", " \n", " \n", " \n", " \n", " \n", " n\n", " u\n", " m\n", " b\n", " e\n", " r\n", "  \n", " o\n", " f\n", "  \n", " e\n", " d\n", " g\n", " e\n", " s\n", "  \n", " n\n", " o\n", " t\n", "  \n", " i\n", " n\n", " c\n", " l\n", " u\n", " d\n", " e\n", " d\n", "  \n", " i\n", " n\n", "  \n", " t\n", " h\n", " e\n", "  \n", " s\n", " p\n", " a\n", " r\n", " s\n", " i\n", " f\n", " i\n", " e\n", " d\n", "  \n", " s\n", " e\n", " t\n", "  \n", " A\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 0\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 5\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 10\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 15\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 20\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 25\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 30\n", " \n", " \n", " \n", " % of instances\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "plt.bar(num_rogues_range, 100*np.array(count_per_num_rogues)/num_instances);\n", "plt.xlabel('number of edges not included in the sparsified set $A$')\n", "plt.ylabel('% of instances');" ] }, { "cell_type": "code", "execution_count": 25, "id": "0096912a-cb61-4649-a138-476850a9ee87", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [ "bench_pct_per_num_rogues = 100*np.array(count_per_num_rogues)/num_instances" ] }, { "cell_type": "code", "execution_count": 26, "id": "65ecf896-8456-46c9-bc49-274c29713d77", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [ { "data": { "image/svg+xml": [ "\n", "\n", "\n", " \n", " \n", " \n", " \n", " image/svg+xml\n", " \n", " \n", " OptiWindNet\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " 34%\n", " \n", " \n", " 29%\n", " \n", " \n", " 21%\n", " \n", " \n", " 12%\n", " \n", " \n", " 4%\n", " \n", " \n", " 0\n", " \n", " \n", " 1\n", " \n", " \n", " 2\n", " \n", " \n", " 3\n", " \n", " \n", " 4+\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n" ], "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "with plt.style.context('pub_paperfarm'):\n", " fig, ax = plt.subplots(figsize=(4.2, 0.4), frameon=True, facecolor='w')\n", " values = list(chain(bench_pct_per_num_rogues[:4],\n", " (sum(bench_pct_per_num_rogues[4:]),)))\n", " tags = '0', '1', '2', '3', '4+'\n", " colors = 'darkgreen', 'darkorange', 'royalblue', 'firebrick', 'darkorchid'\n", " limits = list(accumulate(values, initial=0))\n", " centers = [(a + b)/2 for a, b in pairwise(limits)]\n", " ax.barh(0, values, left=limits[:-1], color=colors, edgecolor='white')\n", " value_tags = [ax.text(x, 0, f'{v:.0f}%',\n", " color='white', fontsize='small',\n", " verticalalignment='center',\n", " horizontalalignment='center') for v, x in zip(values, centers)]\n", " label_tags = [ax.text(x, 0.7, s,\n", " fontsize='large',\n", " verticalalignment='center',\n", " horizontalalignment='center') for s, x in zip(tags, centers)]\n", " ax.axis(False)\n", " ax.set_xlim(0, 100)\n", " ax.figure.savefig('XML100_480_edges_not_in_A.pdf')" ] }, { "cell_type": "code", "execution_count": 27, "id": "53ddcbbd-258a-4c4f-a857-eb91c2152312", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [ { "data": { "text/plain": [ "0.012416666666666666" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# this counts feeders in num_total_edges\n", "num_total_rogues/num_total_edges" ] }, { "cell_type": "markdown", "id": "02f4562f-43ab-4553-ae90-969a4e434283", "metadata": { "deletable": true, "editable": true, "frozen": false }, "source": [ "## Check the rogues >= 4 offenders" ] }, { "cell_type": "code", "execution_count": 28, "id": "e9106f2f-3b06-48f8-8f42-4a1995adb99f", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [ { "data": { "image/svg+xml": [ "Σλ = 18 154 m(+0) [-1]: 25κ = 4, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 15 499 m(+0) [-1]: 17κ = 6, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 11 782 m(+0) [-1]: 8κ = 14, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 9 987.1 m(+0) [-1]: 7κ = 15, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 11 914 m(+0) [-1]: 15κ = 7, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 12 948 m(+0) [-1]: 20κ = 5, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 10 212 m(+0) [-1]: 10κ = 10, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 11 302 m(+0) [-1]: 13κ = 8, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 8 534.1 m(+0) [-1]: 5κ = 20, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 29 607 m(+0) [-1]: 34κ = 3, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 25 107 m(+0) [-1]: 25κ = 4, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 17 120 m(+0) [-1]: 15κ = 7, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 15 936 m(+0) [-1]: 13κ = 8, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 14 596 m(+0) [-1]: 12κ = 9, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 12 726 m(+0) [-1]: 9κ = 12, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 11 886 m(+0) [-1]: 7κ = 15, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 11 277 m(+0) [-1]: 6κ = 17, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 11 716 m(+0) [-1]: 7κ = 16, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/svg+xml": [ "Σλ = 11 219 m(+0) [-1]: 6κ = 19, T = 100" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "for name, rogues, svg in problems:\n", " if len(rogues) >= 4:\n", " display(svg)" ] }, { "cell_type": "code", "execution_count": null, "id": "9ce1fd23-f062-4fbe-9911-20faf93226b1", "metadata": { "deletable": true, "editable": true, "frozen": false }, "outputs": [], "source": [] } ], "metadata": { "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 5 }