Last active
July 30, 2017 10:50
-
-
Save yogabonito/b2be3014db41a934032ffa0f1ea9e1f6 to your computer and use it in GitHub Desktop.
Demo of AZP variants
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# AZP-ReactiveTabu demo" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"The reactive tabu version of the AZP as described on pp. 432-433 in Openshaw & Rao (1995) doesn't consider the case in which there is no nontabu move left in its steps 4 and 5.\n", | |
"\n", | |
"Furthermore, it stops after a step where no improvement has been made. This means that if we return the clustering generated by the last step, we don't get the optimal solution. We should therefore probably return the clustering yielded by the next-to-last step. The implementation in [commit ee3f08f44](https://github.com/yogabonito/region/commit/ee3f08f441f7367204fc2d1d391e7e3bedacdc80) returns the result generated in the last step, so we get suboptimal solutions." | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 1, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"%matplotlib inline" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"from region.azp import *" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"import numpy as np\n", | |
"from matplotlib import pyplot as plt\n", | |
"import pandas as pd\n", | |
"import geopandas as gpd\n", | |
"from shapely.geometry import Polygon" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Example 1: 3x3 lattice" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Inputs" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": { | |
"scrolled": true | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\n4PSM+QAAAABJRU5ErkJggg==\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x7fa3377cee48>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"geometry = [\n", | |
" Polygon([(x, y),\n", | |
" (x, y+1),\n", | |
" (x+1, y+1),\n", | |
" (x+1, y)]) for y in range(3) for x in range(3)\n", | |
"]\n", | |
"\n", | |
"areas_gdf = gpd.GeoDataFrame(\n", | |
" {\"values\": [726.7, 623.6, 487.3,\n", | |
" 200.4, 245.0, 481.0,\n", | |
" 170.9, 225.9, 226.9]},\n", | |
" geometry=geometry)\n", | |
"areas_gdf.plot(column=\"values\")\n", | |
"plt.gca().invert_yaxis()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Clustering" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### without initial solution" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": { | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"generate_initial_sol got a <class 'networkx.classes.graph.Graph'>\n", | |
"step 1\n", | |
"distribute_regions_among_components got a <class 'networkx.classes.graph.Graph'>\n", | |
"{<networkx.classes.graph.Graph object at 0x7fa33779ac18>: 2}\n", | |
"Init with: [{0, 1, 2, 3, 4, 5, 6, 7}, {8}]\n", | |
"=============================================\n", | |
"[{0, 1, 2, 3, 4, 5, 6, 7}, {8}]\n", | |
"obj_value: 7026.8\n", | |
"-----------------------------------\n", | |
"step 3\n", | |
"step 4\n", | |
"from {0, 1, 2, 3, 4, 5, 6, 7}\n", | |
"to {8}\n", | |
"from {0, 1, 2, 3, 4, 5, 6, 7}\n", | |
"to {8}\n", | |
" best move: move(area=7, from_idx=0, to_idx=1)\n", | |
"step 5: make move(area=7, from_idx=0, to_idx=1)\n", | |
" move 7 from {0, 1, 2, 3, 4, 5, 6, 7} to {8}\n", | |
"step 6\n", | |
"step 10\n", | |
"=============================================\n", | |
"[{0, 1, 2, 3, 4, 5, 6}, {8, 7}]\n", | |
"obj_value: 5513.2\n", | |
"-----------------------------------\n", | |
"step 3\n", | |
"step 4\n", | |
"from {0, 1, 2, 3, 4, 5, 6}\n", | |
"to {8, 7}\n", | |
"from {0, 1, 2, 3, 4, 5, 6}\n", | |
"to {8, 7}\n", | |
"from {0, 1, 2, 3, 4, 5, 6}\n", | |
"to {8, 7}\n", | |
"from {8, 7}\n", | |
"to {0, 1, 2, 3, 4, 5, 6}\n", | |
" best move: move(area=6, from_idx=0, to_idx=1)\n", | |
"step 5: make move(area=6, from_idx=0, to_idx=1)\n", | |
" move 6 from {0, 1, 2, 3, 4, 5, 6} to {8, 7}\n", | |
"step 6\n", | |
"step 10\n", | |
"=============================================\n", | |
"[{0, 1, 2, 3, 4, 5}, {8, 6, 7}]\n", | |
"obj_value: 3885.6\n", | |
"-----------------------------------\n", | |
"step 3\n", | |
"step 4\n", | |
"from {0, 1, 2, 3, 4, 5}\n", | |
"to {8, 6, 7}\n", | |
"from {0, 1, 2, 3, 4, 5}\n", | |
"to {8, 6, 7}\n", | |
"from {0, 1, 2, 3, 4, 5}\n", | |
"to {8, 6, 7}\n", | |
"from {8, 6, 7}\n", | |
"to {0, 1, 2, 3, 4, 5}\n", | |
" best move: move(area=3, from_idx=0, to_idx=1)\n", | |
"step 5: make move(area=3, from_idx=0, to_idx=1)\n", | |
" move 3 from {0, 1, 2, 3, 4, 5} to {8, 6, 7}\n", | |
"step 6\n", | |
"step 10\n", | |
"=============================================\n", | |
"[{0, 1, 2, 4, 5}, {8, 3, 6, 7}]\n", | |
"obj_value: 2405.5\n", | |
"-----------------------------------\n", | |
"step 3\n", | |
"step 4\n", | |
"from {0, 1, 2, 4, 5}\n", | |
"to {8, 3, 6, 7}\n", | |
"from {0, 1, 2, 4, 5}\n", | |
"to {8, 3, 6, 7}\n", | |
"from {0, 1, 2, 4, 5}\n", | |
"to {8, 3, 6, 7}\n", | |
"from {0, 1, 2, 4, 5}\n", | |
"to {8, 3, 6, 7}\n", | |
"from {8, 3, 6, 7}\n", | |
"to {0, 1, 2, 4, 5}\n", | |
" best move: move(area=4, from_idx=0, to_idx=1)\n", | |
"step 5: make move(area=4, from_idx=0, to_idx=1)\n", | |
" move 4 from {0, 1, 2, 4, 5} to {8, 3, 6, 7}\n", | |
"step 6\n", | |
"step 10\n", | |
"=============================================\n", | |
"[{0, 1, 2, 5}, {8, 3, 4, 6, 7}]\n", | |
"obj_value: 1222.8\n", | |
"-----------------------------------\n", | |
"step 3\n", | |
"step 4\n", | |
"from {0, 1, 2, 5}\n", | |
"to {8, 3, 4, 6, 7}\n", | |
"from {8, 3, 4, 6, 7}\n", | |
"to {0, 1, 2, 5}\n", | |
"from {0, 1, 2, 5}\n", | |
"to {8, 3, 4, 6, 7}\n", | |
"from {0, 1, 2, 5}\n", | |
"to {8, 3, 4, 6, 7}\n", | |
"from {8, 3, 4, 6, 7}\n", | |
"to {0, 1, 2, 5}\n", | |
" best move: move(area=5, from_idx=0, to_idx=1)\n", | |
"step 5: make move(area=5, from_idx=0, to_idx=1)\n", | |
" move 5 from {0, 1, 2, 5} to {8, 3, 4, 6, 7}\n", | |
"step 6\n", | |
"step 10\n", | |
"=============================================\n", | |
"[{0, 1, 2}, {3, 4, 5, 6, 7, 8}]\n", | |
"obj_value: 2164.1\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAQIAAAD8CAYAAACcoKqNAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADTVJREFUeJzt3V+IXvWdx/H3Z2NsF5QamgeUJGNsG1i0WLVDGrfLErYU\nYijmohbiRa3FMtStrEJvbBdS1pulNxZcRRmqVIuou+rKtESKUIvthakxG/8l6zIKxUjAmLSJ0lY3\n5bsXz5l2dpz4HJNznkni+wUPnj+/Ob9vfmY+Oec8h/NLVSHpw+2vlroASUvPIJBkEEgyCCRhEEjC\nIJCEQSAJg0ASBoEk4Iyl6njlypW1du3apepe+lB49tln36yqwah2SxYEa9euZefOnUvVvfShkOQ3\nbdp5aSDJIJBkEEjCIJCEQSCJlkGQZFOSl5PMJrl5kf0fSfJQs39HkrVdFyqpPyODIMky4A7gCuBC\n4OokFy5odh3w26r6FPAD4PtdFyqpP23OCNYDs1X1alW9CzwIbFnQZgtwb7P8MPCFJOmuTEl9avNA\n0SrgtXnr+4DPHatNVR1Nchj4OPDm/EZJpoApgImJiVYFmifSe61YsYJDhw51dryxPllYVdPANMDk\n5GTrt6be+YtXeqvpVHH9xk86DjgOc67f+MlOj9fm0uB1YM289dXNtkXbJDkD+BhwsIsCJfWvTRA8\nA6xLckGSM4GtwMyCNjPA15rlq4Cfl+9Jl04ZIy8Nmmv+G4CfAcuAe6rqpSS3ADuraga4G/hxklng\nEMOwkHSKaHWPoKq2A9sXbNs2b/mPwFe6LU3SuPhkoSSDQJJBIAmDQBIGgSQMAkkYBJIwCCRhEEjC\nIJCEQSAJg0ASBoEkDAJJGASSMAgkYRBIwiCQhEEgCYNAEgaBJAwCSRgEkjAIJNEyCJJsSvJyktkk\nNy+y/9okB5Lsbj7f6L5USX0ZOdNRkmXAHcAXGU6J/kySmaras6DpQ1V1Qw81SupZmzOC9cBsVb1a\nVe8CDwJb+i1L0ji1CYJVwGvz1vc12xb6cpLnkzycZM0i+0kylWRnkp0HDhw4jnIl9aGrm4U/AdZW\n1cXAE8C9izWqqumqmqyqycFg0FHXkk5UmyB4HZj/L/zqZtufVdXBqnqnWf0h8NluypM0Dm2C4Blg\nXZILkpwJbAVm5jdIct681SuBvd2VKKlvI781qKqjSW4AfgYsA+6pqpeS3ALsrKoZ4J+SXAkcBQ4B\n1/ZYs6SOjQwCgKraDmxfsG3bvOXvAN/ptjRJ4+KThZIMAkkGgSQMAkkYBJIwCCRhEEjCIJCEQSAJ\ng0ASBoEkDAJJGASSMAgkYRBIwiCQhEEgCYNAEgaBJAwCSRgEkjAIJGEQSKJFECS5J8kbSV48xv4k\nuS3JbDMJ6mXdlympT23OCH4EbHqf/VcA65rPFHDniZclaZxGBkFVPcVwGrNj2QLcV0NPA+csmAtR\n0kmui3sEq4DX5q3va7ZJOkW0mvuwK0mmGF4+MDEx0frnrt/4yb5KOqU4DkOOAyTp9HhdBMHrwJp5\n66ubbe9RVdPANMDk5GS17eDAgQMnUt9pYTAYOA44DnMGg0Gnx+vi0mAGuKb59mADcLiq9ndwXElj\nMvKMIMkDwEZgZZJ9wPeA5QBVdRfD6dI3A7PA74Gv91WspH6MDIKqunrE/gK+1VlFksbOJwslGQSS\nDAJJGASSMAgkYRBIwiCQhEEgCYNAEgaBJAwCSRgEkjAIJGEQSMIgkIRBIAmDQBIGgSQMAkkYBJIw\nCCRhEEjCIJCEQSCJFkGQ5J4kbyR58Rj7NyY5nGR389nWfZmS+tRmEtQfAbcD971Pm19W1Zc6qUjS\n2I08I6iqp4BDY6hF0hLp6h7B5UmeS/J4kos6OqakMWlzaTDKLuD8qno7yWbgMWDdYg2TTAFTABMT\nEx10LakLJ3xGUFVHqurtZnk7sDzJymO0na6qyaqaHAwGJ9q1pI6ccBAkOTdJmuX1zTEPnuhxJY3P\nyEuDJA8AG4GVSfYB3wOWA1TVXcBVwPVJjgJ/ALZWVfVWsaTOjQyCqrp6xP7bGX69KOkU5ZOFkgwC\nSQaBJAwCSRgEkjAIJGEQSMIgkIRBIAmDQBIGgSQMAkkYBJIwCCRhEEjCIJCEQSAJg0ASBoEkDAJJ\nGASSMAgkYRBIwiCQRIsgSLImyZNJ9iR5KcmNi7RJktuSzCZ5Psll/ZQrqQ9tZkM+Cny7qnYlORt4\nNskTVbVnXpsrGM6AvA74HHBn819Jp4CRZwRVtb+qdjXLbwF7gVULmm0B7quhp4FzkpzXebWSevGB\n7hEkWQtcCuxYsGsV8Nq89X28NywknaTaXBoAkOQs4BHgpqo6cjydJZkCpgAmJiZa/9xgMDie7k47\njsOQ4wBJOj1eqyBIspxhCNxfVY8u0uR1YM289dXNtv+nqqaBaYDJycnWU6cfOHCgbdPT1mAwcBxw\nHOZ0HYZtvjUIcDewt6puPUazGeCa5tuDDcDhqtrfYZ2SetTmjODzwFeBF5LsbrZ9F5gAqKq7gO3A\nZmAW+D3w9e5LldSXkUFQVb8C3veCpKoK+FZXRUkaL58slGQQSDIIJGEQSMIgkIRBIAmDQBIGgSQM\nAkkYBJIwCCRhEEjCIJCEQSAJg0ASBoEkDAJJGASSMAgkYRBIwiCQhEEgCYNAEgaBJNpNebYmyZNJ\n9iR5KcmNi7TZmORwkt3NZ1s/5UrqQ5spz44C366qXUnOBp5N8kRV7VnQ7pdV9aXuS5TUt5FnBFW1\nv6p2NctvAXuBVX0XJml8PtA9giRrgUuBHYvsvjzJc0keT3JRB7VJGpM2lwYAJDkLeAS4qaqOLNi9\nCzi/qt5Oshl4DFi3yDGmgCmAiYmJ4y5aUrdanREkWc4wBO6vqkcX7q+qI1X1drO8HVieZOUi7aar\narKqJgeDwQmWLqkrbb41CHA3sLeqbj1Gm3ObdiRZ3xz3YJeFSupPm0uDzwNfBV5IsrvZ9l1gAqCq\n7gKuAq5PchT4A7C1qqqHeiX1YGQQVNWvgIxocztwe1dFSRovnyyUZBBIMggkYRBIwiCQhEEgCYNA\nEgaBJAwCSRgEkjAIJGEQSMIgkIRBIAmDQBIGgSQMAkkYBJIwCCRhEEjCIJCEQSAJg0ASBoEk2k15\n9tEkv25mOn4pyb8s0uYjSR5KMptkRzNrsqRTRJszgneAf6iqzwCXAJuSbFjQ5jrgt1X1KeAHwPe7\nLVNSn0YGQQ293awubz4L5zXcAtzbLD8MfGFuUlRJJ7+206IvayZAfQN4oqp2LGiyCngNoKqOAoeB\nj3dZqKT+tJkNmar6E3BJknOA/0zy6ap68YN2lmQKmAKYmJho9TMrVqxgMBh80K5OO0kcBxyHOStW\nrOj0eK2CYE5V/S7Jk8AmYH4QvA6sAfYlOQP4GHBwkZ+fBqYBJicnW02bfujQoQ9SoqTj0OZbg0Fz\nJkCSvwa+CPz3gmYzwNea5auAn1dVq190SUuvzRnBecC9SZYxDI5/r6qfJrkF2FlVM8DdwI+TzAKH\ngK29VSypcyODoKqeBy5dZPu2ect/BL7SbWmSxsUnCyUZBJIMAkkYBJIwCCQBWaqv+5McAH7ToulK\n4M2ey7EGazhdazi/qkY+irlkQdBWkp1VNWkN1mAN/dXgpYEkg0DSqREE00tdANYwxxqGTrsaTvp7\nBJL6dyqcEUjq2UkTBEk2JXm5eQHqzYvs7/0FqS1quDbJgSS7m883Ou7/niRvJFn0pS8Zuq2p7/kk\nl3XZf8saNiY5PG8Mti3W7gRrWJPkySR7mhfm3rhIm17HomUNvY7FWF8cXFVL/gGWAa8AnwDOBJ4D\nLlzQ5h+Bu5rlrcBDS1DDtcDtPY7D3wOXAS8eY/9m4HEgwAZgxxLUsBH4ac9/H84DLmuWzwb+Z5H/\nF72ORcsaeh2L5s92VrO8HNgBbFjQppPfi5PljGA9MFtVr1bVu8CDDF+IOl/fL0htU0Ovquophu9z\nOJYtwH019DRwTpLzxlxD76pqf1XtapbfAvYyfC/mfL2ORcsaetX82cby4uCTJQj+/PLTxj7eO+h9\nvyC1TQ0AX25ORR9OsqbD/ttoW2PfLm9OVx9PclGfHTWnupcy/NdwvrGNxfvUAD2PxbheHHyyBMGp\n4ifA2qq6GHiCvyTxh8kuho+tfgb4N+CxvjpKchbwCHBTVR3pq58TqKH3saiqP1XVJcBqYH2ST3fd\nB5w8QTD38tM5q5tti7Z5vxek9llDVR2sqnea1R8Cn+2w/zbajFOvqurI3OlqVW0HlidZ2XU/SZYz\n/AW8v6oeXaRJ72MxqoZxjUVz/N8Bcy8Onq+T34uTJQieAdYluSDJmQxveswsaNP3C1JH1rDgGvRK\nhteN4zQDXNPcMd8AHK6q/eMsIMm5c9egSdYz/DvUZSDTHP9uYG9V3XqMZr2ORZsa+h6LjPPFwX3d\n8TyOO6SbGd6ZfQX452bbLcCVzfJHgf8AZoFfA59Yghr+FXiJ4TcKTwJ/03H/DwD7gf9leM17HfBN\n4Jv1l7vIdzT1vQBM9jAGo2q4Yd4YPA38bQ81/B3Dm2LPA7ubz+ZxjkXLGnodC+Bi4L+aGl4EtvX1\ne+GThZJOmksDSUvIIJBkEEgyCCRhEEjCIJCEQSAJg0AS8H8gA4t/FUqasAAAAABJRU5ErkJggg==\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x7fa3375f8780>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"azprt = AZPReactiveTabu(n_regions=2,\n", | |
" max_iterations=8,\n", | |
" k1=2,\n", | |
" k2=2,\n", | |
" random_state=1)\n", | |
"regions_dict_rt_wo = azprt.fit(areas=areas_gdf,\n", | |
" data=[\"values\"],\n", | |
" contiguity=\"rook\")\n", | |
"areas_gdf[\"region\"] = pd.Series(regions_dict_rt_wo)\n", | |
"areas_gdf.plot(column=\"region\", cmap='tab20c')\n", | |
"plt.gca().invert_yaxis()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Example 2: Islands" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"islands_geometry = [\n", | |
" Polygon([(x, y),\n", | |
" (x, y+1),\n", | |
" (x+1, y+1),\n", | |
" (x+1, y)]) for y in range(3) for x in range(3)\n", | |
"] + [\n", | |
" Polygon([(x, y),\n", | |
" (x, y+1),\n", | |
" (x+1, y+1),\n", | |
" (x+1, y)]) for y in range(4,6) for x in range(5,8)\n", | |
"]" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 7, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [ | |
"islands_gdf = gpd.GeoDataFrame(\n", | |
" {\"values\": [726.7, 623.6, 487.3,\n", | |
" 200.4, 245.0, 481.0,\n", | |
" 170.9, 225.9, 226.9] +\n", | |
" [100, 120, 190,\n", | |
" 175, 185, 210]},\n", | |
" geometry=islands_geometry)" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"image/png": "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\ngpKaZglKapolKKlplqCkplmCkppmCUpqmiUoqWmWoKSmWYKSmmYJSmqaJSipaZagpKZZgpKaZglK\napolKKlplqCkplmCkppmCUpq2lQXX0/yLPAy8DrwWlWNugwlSX2ZqgTHPlRVL3aWRJIG4HJYUtOm\nLcEC7kmykGSuy0CS1KdU1eRByfqq2pXkPcC9wFVV9eABY+aAOYDZ2dkzFxcXu8gr9SLJ0BE0loS9\ne/eu9D4L0x67mGqfYFXtGv+7O8kW4CzgwQPGzAPzAKPRaHKzSoe5G//s7wed/5NXfpgb/+Ifhs3w\nW+ez+dpvD5rhil/7hU4ff+JyOMnRSY7Z9znwEWBbp6kkqSfTbAm+F9gyXh6sBb5eVXd3mkqSejKx\nBKvqGeBnesgiSb3zJTKSmmYJSmqaJSipaZagpKZZgpKaZglKapolKKlplqCkplmCkppmCUpqmiUo\nqWmWoKSmWYKSmmYJSmqaJSipaZagpKZZgpKaZglKapolKKlplqCkplmCkppmCUpqmiUoqWmWoKSm\nTVWCSY5LcluSp5LsSPKBroNJUh/WTjnuGuDuqvrlJO8E3tVhJknqzcQSTPITwDnApwCq6lXg1W5j\nSVI/plkOnwy8AHw1yeNJrk1ydMe5JKkXqao3HpCMgIeBs6vqkSTXAC9V1R8dMG4OmAOYnZ09c3Fx\nsaPIUvfWrVvHnj17Bs2QhEnPzxYyzMzMsLS0tKL7JFmoqtE0Y6fZJ7gT2FlVj4xv3wZ8/sBBVTUP\nzAOMRqNhf2rSm7TSJ53euiYuh6vq34Hnkpwy/tL5wJOdppKknkx7dPgq4KbxkeFngE93F0mS+jNV\nCVbVE8BU62tJeivxjBFJTbMEJTXNEpTUNEtQUtMsQUlNm3jGyCE9aPICsNJTRo4HXlz1MGYww1tz\nfjO8uQw/VVUnTDOwkxI8FEkem/Y0FzOY4e0+vxn6y+ByWFLTLEFJTTucSnB+6ACYYR8zDD8/mGGf\nTjMcNvsEJWkIh9OWoCT1bvASTHJhkh8keTrJ/3ufwp4yXJ9kd5JtA81/UpL7kzyZZHuSTQNkODLJ\nd5N8b5zh6r4z7JdlzfhdzO8caP5nk3w/yRNJHhsow6AXN0tyyvj/v+/jpSSf7TPDOMfvjn8ftyW5\nOcmRqz7HkMvhJGuAfwYuYPnNWx8FLquqXt+vMMk5wCvAjVV1Wp9zj+c/ETixqrYmOQZYAH6xz59D\nkgBHV9UrSY4AHgI2VdXDfWXYL8vvsfyuRcdW1cUDzP8sMKqqwV4fl2Qz8I9Vde2+i5tV1Y8GyrIG\n2AW8v6p6e8v4JOtZ/j08tar+O8mtwF1VdcNqzjP0luBZwNNV9cz4Ak63AB/vO0RVPQgM9lbCVfV8\nVW0df/4ysANY33OGqqpXxjePGH/0/hcyyQbgY8C1fc99uNjv4mbXwfLFzYYqwLHzgX/pswD3sxY4\nKslalq9y+W+rPcHQJbgeeG6/2zvp+cl/uEmyETgdeOSNR3Yy95okTwC7gXv3u6RCn74CfA7YO8Dc\n+xRwT5KF8bVz+na4XdzsUuDmvietql3AHwM/BJ4H/rOq7lnteYYuQe0nybuB24HPVtVLfc9fVa9X\n1c8CG4CzkvS6ayDJxcDuqlroc96D+GBVnQFcBPz2eHdJn9YCZwB/WVWnA//FQa7r04fxUvwS4G8H\nmHuG5ZXhycBPAkcn+cRqzzN0Ce4CTtrv9obx15oz3g93O3BTVd0xZJbx0ut+4MKepz4buGS8T+4W\n4LwkX+s5w74tEKpqN7CF5d02fTrYxc3O6DnDPhcBW6vqPwaY+8PAv1bVC1X1v8AdwM+v9iRDl+Cj\nwPuSnDz+i3Mp8M2BM/VufFDiOmBHVX15oAwnJDlu/PlRLB+seqrPDFX1haraUFUbWf5duK+qVv0v\n/xtJcvT44BTjJehHgF5fNXCYXdzsMgZYCo/9EPi5JO8aP0fOZ3l/+aqa9kJLnaiq15JcCXwLWANc\nX1Xb+86R5GbgXOD4JDuBL1bVdT1GOBu4HPj+eJ8cwB9U1V09ZjgR2Dw+EvgO4NaqGuQlKgN7L7Bl\n+TnHWuDrVXX3ADkGv7jZ+I/ABcBv9D03wPg657cBW4HXgMfp4OwRzxiR1LShl8OSNChLUFLTLEFJ\nTbMEJTXNEpTUNEtQUtMsQUlNswQlNe3/AIZAYntpT0xsAAAAAElFTkSuQmCC\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x7fa33777ce10>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"islands_gdf.plot(column=\"values\")\n", | |
"plt.gca().invert_yaxis()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Clustering" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"### without initial solution" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 9, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"generate_initial_sol got a <class 'networkx.classes.graph.Graph'>\n", | |
"step 1\n", | |
"distribute_regions_among_components got a <class 'networkx.classes.graph.Graph'>\n", | |
"{<networkx.classes.graph.Graph object at 0x7fa337629cc0>: 2, <networkx.classes.graph.Graph object at 0x7fa337629550>: 1}\n", | |
"Init with: [{0, 3}, {1, 2, 4, 5, 6, 7, 8}]\n", | |
"=============================================\n", | |
"[{0, 3}, {1, 2, 4, 5, 6, 7, 8}]\n", | |
"obj_value: 4796.3\n", | |
"-----------------------------------\n", | |
"step 3\n", | |
"step 4\n", | |
"from {0, 3}\n", | |
"to {1, 2, 4, 5, 6, 7, 8}\n", | |
"from {1, 2, 4, 5, 6, 7, 8}\n", | |
"to {0, 3}\n", | |
"from {0, 3}\n", | |
"to {1, 2, 4, 5, 6, 7, 8}\n", | |
"from {0, 3}\n", | |
"to {1, 2, 4, 5, 6, 7, 8}\n", | |
"from {1, 2, 4, 5, 6, 7, 8}\n", | |
"to {0, 3}\n", | |
"from {1, 2, 4, 5, 6, 7, 8}\n", | |
"to {0, 3}\n", | |
" best move: move(area=1, from_idx=1, to_idx=0)\n", | |
"step 5: make move(area=1, from_idx=1, to_idx=0)\n", | |
" move 1 from {1, 2, 4, 5, 6, 7, 8} to {0, 3}\n", | |
"step 6\n", | |
"step 10\n", | |
"=============================================\n", | |
"[{0, 1, 3}, {2, 4, 5, 6, 7, 8}]\n", | |
"obj_value: 3418.0\n", | |
"-----------------------------------\n", | |
"step 3\n", | |
"step 4\n", | |
"from {2, 4, 5, 6, 7, 8}\n", | |
"to {0, 1, 3}\n", | |
"from {0, 1, 3}\n", | |
"to {2, 4, 5, 6, 7, 8}\n", | |
"from {0, 1, 3}\n", | |
"to {2, 4, 5, 6, 7, 8}\n", | |
"from {2, 4, 5, 6, 7, 8}\n", | |
"to {0, 1, 3}\n", | |
"from {2, 4, 5, 6, 7, 8}\n", | |
"to {0, 1, 3}\n", | |
"from {2, 4, 5, 6, 7, 8}\n", | |
"to {0, 1, 3}\n", | |
" best move: move(area=2, from_idx=1, to_idx=0)\n", | |
"step 5: make move(area=2, from_idx=1, to_idx=0)\n", | |
" move 2 from {2, 4, 5, 6, 7, 8} to {0, 1, 3}\n", | |
"step 6\n", | |
"step 10\n", | |
"=============================================\n", | |
"[{0, 1, 2, 3}, {4, 5, 6, 7, 8}]\n", | |
"obj_value: 2993.8\n", | |
"-----------------------------------\n", | |
"step 3\n", | |
"step 4\n", | |
"from {0, 1, 2, 3}\n", | |
"to {4, 5, 6, 7, 8}\n", | |
"from {0, 1, 2, 3}\n", | |
"to {4, 5, 6, 7, 8}\n", | |
"from {4, 5, 6, 7, 8}\n", | |
"to {0, 1, 2, 3}\n", | |
"from {4, 5, 6, 7, 8}\n", | |
"to {0, 1, 2, 3}\n", | |
"from {4, 5, 6, 7, 8}\n", | |
"to {0, 1, 2, 3}\n", | |
"from {4, 5, 6, 7, 8}\n", | |
"to {0, 1, 2, 3}\n", | |
" best move: move(area=3, from_idx=0, to_idx=1)\n", | |
"step 5: make move(area=3, from_idx=0, to_idx=1)\n", | |
" move 3 from {0, 1, 2, 3} to {4, 5, 6, 7, 8}\n", | |
"step 6\n", | |
"step 10\n", | |
"=============================================\n", | |
"[{0, 1, 2}, {3, 4, 5, 6, 7, 8}]\n", | |
"obj_value: 2164.1\n", | |
"-----------------------------------\n", | |
"step 3\n", | |
"step 4\n", | |
"from {0, 1, 2}\n", | |
"to {3, 4, 5, 6, 7, 8}\n", | |
"from {0, 1, 2}\n", | |
"to {3, 4, 5, 6, 7, 8}\n", | |
"from {3, 4, 5, 6, 7, 8}\n", | |
"to {0, 1, 2}\n", | |
"from {3, 4, 5, 6, 7, 8}\n", | |
"to {0, 1, 2}\n", | |
" best move: move(area=5, from_idx=1, to_idx=0)\n", | |
"step 5: make move(area=5, from_idx=1, to_idx=0)\n", | |
" move 5 from {3, 4, 5, 6, 7, 8} to {0, 1, 2}\n", | |
"step 6\n", | |
"step 10\n", | |
"=============================================\n", | |
"[{0, 1, 2, 5}, {3, 4, 6, 7, 8}]\n", | |
"obj_value: 1222.8\n", | |
"-----------------------------------\n", | |
"step 3\n", | |
"step 4\n", | |
"from {0, 1, 2, 5}\n", | |
"to {3, 4, 6, 7, 8}\n", | |
"from {3, 4, 6, 7, 8}\n", | |
"to {0, 1, 2, 5}\n", | |
"from {3, 4, 6, 7, 8}\n", | |
"to {0, 1, 2, 5}\n", | |
"from {3, 4, 6, 7, 8}\n", | |
"to {0, 1, 2, 5}\n", | |
"from {3, 4, 6, 7, 8}\n", | |
"to {0, 1, 2, 5}\n", | |
" best move: move(area=4, from_idx=1, to_idx=0)\n", | |
"step 5: make move(area=4, from_idx=1, to_idx=0)\n", | |
" move 4 from {3, 4, 6, 7, 8} to {0, 1, 2, 5}\n", | |
"step 6\n", | |
"step 10\n", | |
"=============================================\n", | |
"[{0, 1, 2, 4, 5}, {3, 6, 7, 8}]\n", | |
"obj_value: 2405.5\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAUEAAAD8CAYAAADpLRYuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADKFJREFUeJzt3V+IZvV9x/H3J7sGjTF1wGmwrtOVEAQRmjUPpq0hWK1B\nEzG96IVCAg2BKaEJpi2EpFBKLnpXQnJRhEFtLDGK9Q8EsUYhGis0xp3VNKtrilo37tZ2R4Y0Wkqt\n7rcXc7ZM7eKcWZ9zztrf+wWD88yemd933Zn3nHOePydVhSS16l1TDyBJUzKCkppmBCU1zQhKapoR\nlNQ0IyipaUZQUtOMoKSmGUFJTds5xBc966yzavfu3UN8aUna0urq6stVtdhn20EiuHv3bvbu3TvE\nl5akLSU52HdbD4clNc0ISmqaEZTUNCMoqWlGUFLTekUwyZVJfprk2SRfGXooSRrLlhFMsgP4S+Aq\n4ALguiQXDD2YJI2hz57gxcCzVfV8Vb0G3A58atixJGkcfR4sfQ7w4qbbh4CPvHmjJMvAMsDS0tK2\nB0my7c/RMBYWFlhfX596DGkUc3vGSFWtACsAs9nshK7edMPDz81rnBPy+Us/4AzdDFIr+hwOHwbO\n3XR7V/cxSXrH6xPBx4EPJjkvybuBa4HvDjuWJI1jy8Phqno9yReA7wE7gJur6qnBJ5OkEfQ6J1hV\n9wH3DTyLJI3OZ4xIapoRlNQ0IyipaUZQUtOMoKSmGUFJTTOCkppmBCU1zQhKapoRlNQ0IyipaUZQ\nUtOMoKSmGUFJTTOCkppmBCU1zQhKapoRlNQ0IyipaUZQUtOMoKSmGUFJTTOCkppmBCU1bcsIJrk5\nyZEk+8cYSJLG1GdP8FvAlQPPIUmT2DKCVfUIsD7CLJI0ulTV1hslu4F7q+rCt9hmGVgGWFpa+vDB\ngwe3N0iyre01nCQcPXp06jGkE5ZktapmfbbdOa9Fq2oFWAGYzWZbl/U4nljbO69xTsiexRk3PPzc\npDN8/tIPnBQzSK3w3mFJTTOCkprW5yEytwF/D5yf5FCSzw0/liSNY8tzglV13RiDSNIUPByW1DQj\nKKlpRlBS04ygpKYZQUlNM4KSmmYEJTXNCEpqmhGU1DQjKKlpRlBS04ygpKYZQUlNM4KSmmYEJTXN\nCEpqmhGU1DQjKKlpRlBS04ygpKYZQUlNM4KSmmYEJTWtz8XXz03yUJKnkzyV5PoxBpOkMWx58XXg\ndeCPq2pfkjOA1SQPVtXTA88mSYPbck+wql6qqn3d+68AB4Bzhh5MksawrXOCSXYDe4DHhhhGksaW\nquq3YfJe4AfAn1fV3cf582VgGWBpaenDBw8e3N4gyba213CScPTo0anHkE5YktWqmvXZts85QZKc\nAtwF3Hq8AAJU1QqwAjCbzfqV9U2eWNt7Ip82N3sWZ87QzSC1os+9wwFuAg5U1deHH0mSxtPnnOAl\nwGeAy5I82b19YuC5JGkUWx4OV9WjgCfsJP2/5DNGJDXNCEpqmhGU1DQjKKlpRlBS04ygpKYZQUlN\nM4KSmmYEJTXNCEpqmhGU1DQjKKlpRlBS04ygpKYZQUlNM4KSmmYEJTXNCEpqmhGU1DQjKKlpRlBS\n04ygpKYZQUlNM4KSmrZlBJOcmuRHSX6c5KkkXxtjMEkaw84e2/wncFlVvZrkFODRJH9bVT8ceDZJ\nGtyWEayqAl7tbp7SvdWQQ0nSWHqdE0yyI8mTwBHgwap6bNixJGkcfQ6Hqao3gA8lORO4J8mFVbV/\n8zZJloFlgKWlpW0PsrCwwJ7F2bY/b56SOAMb/xZSK3pF8Jiq+nmSh4Argf1v+rMVYAVgNptt+3B5\nfX19u58iSW9bn3uHF7s9QJKcBlwBPDP0YJI0hj57gmcDtyTZwUY076iqe4cdS5LG0efe4X8A9oww\niySNzmeMSGqaEZTUNCMoqWlGUFLTjKCkphlBSU0zgpKaZgQlNc0ISmqaEZTUNCMoqWlGUFLTjKCk\nphlBSU0zgpKaZgQlNc0ISmqaEZTUNCMoqWlGUFLTjKCkphlBSU0zgpKaZgQlNa13BJPsSPJEknuH\nHEiSxrSdPcHrgQNDDSJJU+gVwSS7gE8CNw47jiSNq++e4DeALwNHB5xFkka3c6sNklwNHKmq1SSX\nvsV2y8AywNLS0twGlKaQZOoR1FlYWGB9fX2wr79lBIFLgGuSfAI4FXhfkm9X1ac3b1RVK8AKwGw2\nq7lPKo1sbW1t0vUXFxedoZthSFseDlfVV6tqV1XtBq4Fvv/mAErSO5WPE5TUtD6Hw/+jqh4GHh5k\nEkmagHuCkppmBCU1zQhKapoRlNQ0IyipaUZQUtOMoKSmGUFJTTOCkppmBCU1zQhKapoRlNQ0Iyip\naUZQUtOMoKSmGUFJTTOCkppmBCU1zQhKapoRlNQ0IyipaUZQUtOMoKSmGUFJTet18fUkLwCvAG8A\nr1fVbMihJGksvSLY+a2qenmwSSRpAh4OS2pa3wgW8ECS1STLQw4kSWPqezj80ao6nOSXgQeTPFNV\nj2zeoIvjMsDS0tKcx5TGt7i4OPUIzgAkGfTr94pgVR3u/nskyT3AxcAjb9pmBVgBmM1mNec5pdGt\nra1Nuv7i4qIzMHyEtzwcTnJ6kjOOvQ98HNg/6FSSNJI+e4LvB+7pdkl3At+pqvsHnUqSRrJlBKvq\neeDXRphFkkbnQ2QkNc0ISmqaEZTUNCMoqWlGUFLTjKCkphlBSU0zgpKaZgQlNc0ISmqaEZTUNCMo\nqWlGUFLTjKCkphlBSU0zgpKaZgQlNc0ISmqaEZTUNCMoqWlGUFLTjKCkphlBSU0zgpKa1iuCSc5M\ncmeSZ5IcSPIbQw8mSWPY2XO7bwL3V9XvJnk38J4BZ5Kk0WwZwSS/BHwM+D2AqnoNeG3YsSRpHH0O\nh88D1oC/SvJEkhuTnD7wXJI0ij6HwzuBi4AvVtVjSb4JfAX4080bJVkGlgGWlpbmPac0qoWFBRYX\nFyedIYkzsPFvMaQ+ETwEHKqqx7rbd7IRwf+lqlaAFYDZbFZzm1CawPr6+tQjaCRbHg5X1b8ALyY5\nv/vQ5cDTg04lSSPpe+/wF4Fbu3uGnwc+O9xIkjSeXhGsqieB2cCzSNLofMaIpKYZQUlNM4KSmmYE\nJTXNCEpqWqrm/7jmJGvAwW1+2lnAy3Mfxhmc4Z25vjO8vRl+tap6PdVlkAieiCR7q2rSh+E4gzOc\nLOs7w3gzeDgsqWlGUFLTTqYIrkw9AM5wjDNMvz44wzGDznDSnBOUpCmcTHuCkjS6ySOY5MokP03y\nbJL/8zqFI81wc5IjSfZPtP65SR5K8nSSp5JcP8EMpyb5UZIfdzN8bewZNs2yo3sV83snWv+FJD9J\n8mSSvRPNMOnFzZKc3/39j739IsmXxpyhm+MPu+/H/UluS3Lq3NeY8nA4yQ7gH4Er2Hjx1seB66pq\n1NcrTPIx4FXgr6vqwjHX7tY/Gzi7qvYlOQNYBX5nzP8PSQKcXlWvJjkFeBS4vqp+ONYMm2b5IzZe\nteh9VXX1BOu/AMyqarLHxyW5Bfi7qrrx2MXNqurnE82yAzgMfKSqtvv437ez7jlsfB9eUFX/keQO\n4L6q+tY815l6T/Bi4Nmqer67gNPtwKfGHqKqHgEmeynhqnqpqvZ1778CHADOGXmGqqpXu5undG+j\n/4ZMsgv4JHDj2GufLDZd3Owm2Li42VQB7FwOPDdmADfZCZyWZCcbV7n853kvMHUEzwFe3HT7ECP/\n8J9skuwG9gCPvfWWg6y9I8mTwBHgwU2XVBjTN4AvA0cnWPuYAh5IstpdO2dsJ9vFza4Fbht70ao6\nDPwF8DPgJeDfquqBea8zdQS1SZL3AncBX6qqX4y9flW9UVUfAnYBFycZ9dRAkquBI1W1Oua6x/HR\nqroIuAr4g+50yZiOXdzshqraA/w7x7muzxi6Q/FrgL+ZYO0FNo4MzwN+BTg9yafnvc7UETwMnLvp\n9q7uY83pzsPdBdxaVXdPOUt36PUQcOXIS18CXNOdk7sduCzJt0ee4dgeCFV1BLiHjdM2Yzrexc0u\nGnmGY64C9lXVv06w9m8D/1RVa1X1X8DdwG/Oe5GpI/g48MEk53W/ca4FvjvxTKPr7pS4CThQVV+f\naIbFJGd275/Gxp1Vz4w5Q1V9tap2VdVuNr4Xvl9Vc//N/1aSnN7dOUV3CPpxYNRHDZxkFze7jgkO\nhTs/A349yXu6n5HL2ThfPld9L7Q0iKp6PckXgO8BO4Cbq+qpsedIchtwKXBWkkPAn1XVTSOOcAnw\nGeAn3Tk5gD+pqvtGnOFs4JbunsB3AXdU1SQPUZnY+4F7Nn7m2Al8p6run2COyS9u1v0SuAL4/bHX\nBuiuc34nsA94HXiCAZ494jNGJDVt6sNhSZqUEZTUNCMoqWlGUFLTjKCkphlBSU0zgpKaZgQlNe2/\nAT9QLjXMeqv6AAAAAElFTkSuQmCC\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x7fa333d9abe0>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"azprt = AZPReactiveTabu(n_regions=3,\n", | |
" max_iterations=8,\n", | |
" k1=2,\n", | |
" k2=2,\n", | |
" random_state=0)\n", | |
"islands_dict_rt_wo = azprt.fit(areas=islands_gdf,\n", | |
" data=[\"values\"],\n", | |
" contiguity=\"rook\")\n", | |
"islands_gdf[\"region\"] = pd.Series(islands_dict_rt_wo)\n", | |
"islands_gdf.plot(column=\"region\", cmap='tab20c')\n", | |
"plt.gca().invert_yaxis()" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"# Example 3: A tricky toy example" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Inputs" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 10, | |
"metadata": { | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<matplotlib.axes._subplots.AxesSubplot at 0x7fa333cb5710>" | |
] | |
}, | |
"execution_count": 10, | |
"metadata": {}, | |
"output_type": "execute_result" | |
}, | |
{ | |
"data": { | |
"image/png": "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\nGKteEXakAAAAAElFTkSuQmCC\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x7fa33778e470>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"squares = [\n", | |
" Polygon([(x, 0),\n", | |
" (x, 1),\n", | |
" (x+1, 1),\n", | |
" (x+1, 0)]) for x in range(3)\n", | |
"]\n", | |
"values = [0, 1, 0]\n", | |
"squares_gdf = gpd.GeoDataFrame({\"values\": values},\n", | |
" geometry=squares)\n", | |
"squares_gdf.plot(column=\"values\")" | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": {}, | |
"source": [ | |
"## Clustering" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 11, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"generate_initial_sol got a <class 'networkx.classes.graph.Graph'>\n", | |
"step 1\n", | |
"distribute_regions_among_components got a <class 'networkx.classes.graph.Graph'>\n", | |
"{<networkx.classes.graph.Graph object at 0x7fa333c29390>: 2}\n", | |
"Init with: [{0, 1}, {2}]\n", | |
"=============================================\n", | |
"[{0, 1}, {2}]\n", | |
"obj_value: 1.0\n", | |
"-----------------------------------\n", | |
"step 3\n", | |
"step 4\n", | |
"from {0, 1}\n", | |
"to {2}\n", | |
" best move: move(area=1, from_idx=0, to_idx=1)\n", | |
"step 5: make move(area=1, from_idx=0, to_idx=1)\n", | |
" move 1 from {0, 1} to {2}\n", | |
"step 6\n", | |
"step 10\n", | |
"=============================================\n", | |
"[{0}, {1, 2}]\n", | |
"obj_value: 1.0\n" | |
] | |
}, | |
{ | |
"data": { | |
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAX0AAACSCAYAAACpHBqyAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAADI5JREFUeJzt3X+MHOV9x/H3pwZDJarkEp9UBDZ2UksNaVIgJ4cKqUVK\nACd/2JFCVVO1hSqRJRo3/fEXtBK0jiKlrdRUbWmClVilURWT0Kq6REYIFVD/SCE+UkJiU5LDVYqt\nSDgcIa2gIJNv/9hxtCx33rFvfXt7835JK88888ze9/HYn517ZncnVYUkqRt+atwFSJJWjqEvSR1i\n6EtShxj6ktQhhr4kdYihL0kdYuhLUocY+pLUIYa+JHXIeeMuYNCGDRtq8+bN4y5DkibK448//oOq\nmh7Wb9WF/ubNm5mbmxt3GZI0UZJ8r02/VtM7SbYneTrJfJLbFtl+QZJ7m+2PJdnct+32pv3pJDe0\nHYAkafSGhn6SdcBdwAeAy4Gbklw+0O0jwAtV9XPAp4E/a/a9HNgFvBPYDvxd83ySpDFoc6a/DZiv\nqqNV9SpwANg50GcncE+zfB/wviRp2g9U1StV9V/AfPN8kqQxaDOnfwnwbN/6MeC9S/WpqpNJXgTe\n2rQ/OrDvJYM/IMluYDfApk2b2ta+qN5rjSRNnqmpKRYWFs7pz1gVF3Krah+wD2BmZmbZX/D/mUee\nWXZNGp1br307J06cGHcZGjA9Pe1xWWWmp4e++WbZ2kzvHAc29q1f2rQt2ifJecCbgOdb7itJWiFt\nQv8QsDXJliTr6V2YnR3oMwvc3CzfCDxUvVtyzQK7mnf3bAG2Al8fTemSpDM1dHqnmaPfAzwArAP2\nV9XhJHuBuaqaBT4PfCHJPLBA74WBpt+XgCPASeBjVfXaORqLJGmIVnP6VXUQODjQdkff8v8Bv7rE\nvp8EPrmMGiVJI+J370hShxj6ktQhhr4kdYihL0kdYuhLUocY+pLUIYa+JHWIoS9JHWLoS1KHGPqS\n1CGGviR1iKEvSR1i6EtShxj6ktQhhr4kdYihL0kd0ir0k2xP8nSS+SS3LbL9D5McSfJkkn9Nclnf\ntteSPNE8Bm+zKElaQUPvnJVkHXAXcB1wDDiUZLaqjvR1+w9gpqpeSnIr8OfArzXbXq6qK0ZctyTp\nLLQ5098GzFfV0ap6FTgA7OzvUFUPV9VLzeqjwKWjLVOSNAptQv8S4Nm+9WNN21I+Atzft35hkrkk\njyb50FnUKEkakVY3Rm8ryW8AM8Cv9DVfVlXHk7wNeCjJt6rqmYH9dgO7ATZt2jTKkiRJfdqc6R8H\nNvatX9q0vU6S9wN/DOyoqldOtVfV8ebPo8AjwJWD+1bVvqqaqaqZ6enpMxqAJKm9NqF/CNiaZEuS\n9cAu4HXvwklyJXA3vcB/rq99KskFzfIG4Bqg/wKwJGkFDZ3eqaqTSfYADwDrgP1VdTjJXmCuqmaB\nvwAuAr6cBOC/q2oH8A7g7iQ/pvcC86mBd/1IklZQqzn9qjoIHBxou6Nv+f1L7Pc14F3LKVCSNDp+\nIleSOsTQl6QOMfQlqUMMfUnqEENfkjrE0JekDjH0JalDDH1J6hBDX5I6xNCXpA4x9CWpQwx9SeoQ\nQ1+SOsTQl6QOMfQlqUMMfUnqkFahn2R7kqeTzCe5bZHttyQ5keSJ5vHRvm03J/lu87h5lMVLks7M\n0DtnJVkH3AVcBxwDDiWZXeS2h/dW1Z6Bfd8C3AnMAAU83uz7wkiqlySdkTZn+tuA+ao6WlWvAgeA\nnS2f/wbgwapaaIL+QWD72ZUqSVquNqF/CfBs3/qxpm3Qh5M8meS+JBvPcF9J0goY1YXcrwCbq+rd\n9M7m7zmTnZPsTjKXZO7EiRMjKkmSNKhN6B8HNvatX9q0/URVPV9VrzSrnwPe03bfZv99VTVTVTPT\n09Nta5cknaE2oX8I2JpkS5L1wC5gtr9Dkov7VncATzXLDwDXJ5lKMgVc37RJksZg6Lt3qupkkj30\nwnodsL+qDifZC8xV1Szw8SQ7gJPAAnBLs+9Ckk/Qe+EA2FtVC+dgHJKkFoaGPkBVHQQODrTd0bd8\nO3D7EvvuB/Yvo0ZJ0oj4iVxJ6hBDX5I6xNCXpA4x9CWpQwx9SeoQQ1+SOsTQl6QOMfQlqUMMfUnq\nEENfkjrE0JekDjH0JalDDH1J6hBDX5I6xNCXpA4x9CWpQwx9SeqQVqGfZHuSp5PMJ7ltke2fTvJE\n8/hOkh/2bXutb9vs4L6SpJUz9HaJSdYBdwHXAceAQ0lmq+rIqT5V9Qd9/X8XuLLvKV6uqitGV7Ik\n6Wy1OdPfBsxX1dGqehU4AOw8Tf+bgC+OojhJ0mi1Cf1LgGf71o81bW+Q5DJgC/BQX/OFSeaSPJrk\nQ0vst7vpM3fixImWpUuSztSoL+TuAu6rqtf62i6rqhng14G/SvL2wZ2qal9VzVTVzPT09IhLkiSd\n0ib0jwMb+9YvbdoWs4uBqZ2qOt78eRR4hNfP90uSVlCb0D8EbE2yJcl6esH+hnfhJPl5YAr49762\nqSQXNMsbgGuAI4P7SpJWxtB371TVySR7gAeAdcD+qjqcZC8wV1WnXgB2AQeqqvp2fwdwd5If03uB\n+VT/u34kSStraOgDVNVB4OBA2x0D63+yyH5fA961jPokSSPkJ3IlqUMMfUnqEENfkjrE0JekDjH0\nJalDDH1J6hBDX5I6xNCXpA4x9CWpQwx9SeoQQ1+SOsTQl6QOMfQlqUMMfUnqEENfkjrE0JekDhka\n+kn2J3kuybeX2J4kf51kPsmTSa7q23Zzku82j5tHWbgk6cy1OdP/e2D7abZ/ANjaPHYDnwFI8hbg\nTuC9wDbgziRTyylWkrQ8Q0O/qv4NWDhNl53AP1TPo8Cbk1wM3AA8WFULVfUC8CCnf/GQJJ1jo5jT\nvwR4tm/9WNO2VLskaUxa3Rj9XEuym97UEJs2bVrWc01NTXHrtW8fRVkakSRMT0+PuwwN8LisPlNT\n534GfBShfxzY2Ld+adN2HLh2oP2RxZ6gqvYB+wBmZmZqOcUsLJxuJkqSum0U0zuzwG817+K5Gnix\nqr4PPABcn2SquYB7fdMmSRqToWf6Sb5I74x9Q5Jj9N6Rcz5AVX0WOAh8EJgHXgJ+u9m2kOQTwKHm\nqfZWlafhkjRGQ0O/qm4asr2Ajy2xbT+w/+xKkySNWnqZvXokOQF8bxlPsQH4wYjKGae1Mg5wLKvV\nWhnLWhkHLG8sl1XV0Cvzqy70lyvJXFXNjLuO5Vor4wDHslqtlbGslXHAyozF796RpA4x9CWpQ9Zi\n6O8bdwEjslbGAY5ltVorY1kr44AVGMuam9OXJC1tLZ7pS5KWMJGhn2R7kqeb7/C/bZHtFyS5t9n+\nWJLNK19lOy3GckuSE0meaB4fHUedwyznvgurTYuxXJvkxb5jcsdK19hGko1JHk5yJMnhJL+3SJ+J\nOC4txzIpx+XCJF9P8s1mLH+6SJ9zl2FVNVEPYB3wDPA2YD3wTeDygT6/A3y2Wd4F3DvuupcxlluA\nvx13rS3G8svAVcC3l9j+QeB+IMDVwGPjrnkZY7kW+Oq462wxjouBq5rlnwG+s8i/r4k4Li3HMinH\nJcBFzfL5wGPA1QN9zlmGTeKZ/jZgvqqOVtWrwAF63+nfbydwT7N8H/C+JFnBGttqM5aJUGd/34VV\np8VYJkJVfb+qvtEs/w/wFG/8evOJOC4txzIRmr/r/21Wz28egxdXz1mGTWLot/me/p/0qaqTwIvA\nW1ekujPT9p4DH25+9b4vycZFtk+CtXZ/hV9qfj2/P8k7x13MMM30wJX0zir7TdxxOc1YYEKOS5J1\nSZ4AnqN3s6klj8uoM2wSQ79rvgJsrqp307v72D1D+uvc+wa9j7z/IvA3wL+MuZ7TSnIR8E/A71fV\nj8Zdz3IMGcvEHJeqeq2qrqD3lfPbkvzCSv3sSQz9pb6/f9E+Sc4D3gQ8vyLVnZmhY6mq56vqlWb1\nc8B7Vqi2UWtz3CZCVf3o1K/nVXUQOD/JhjGXtagk59MLyX+sqn9epMvEHJdhY5mk43JKVf0QeJg3\n3kr2nGXYJIb+IWBrki1J1tO7yDE70GcWuLlZvhF4qJorIqvM0LEMzK/uoDeXOYmWuu/CxEnys6fm\nV5Nso/f/aNWdVDQ1fh54qqr+coluE3Fc2oxlgo7LdJI3N8s/DVwH/OdAt3OWYavidolnoqpOJtlD\n74Ys64D9VXU4yV5grqpm6f3j+EKSeXoX5HaNr+KltRzLx5PsAE7SG8stYyv4NHKW911YjVqM5Ubg\n1iQngZeBXav0pOIa4DeBbzXzxwB/BGyCiTsubcYyKcflYuCeJOvovTB9qaq+ulIZ5idyJalDJnF6\nR5J0lgx9SeoQQ1+SOsTQl6QOMfQlqUMMfUnqEENfkjrE0JekDvl//EkSurRCDwkAAAAASUVORK5C\nYII=\n", | |
"text/plain": [ | |
"<matplotlib.figure.Figure at 0x7fa333c9c358>" | |
] | |
}, | |
"metadata": {}, | |
"output_type": "display_data" | |
} | |
], | |
"source": [ | |
"azprt = AZPReactiveTabu(n_regions=2, max_iterations=10,\n", | |
" k1=2, k2=2, random_state=0)\n", | |
"regions_dict_squares_rt = azprt.fit(areas=squares_gdf,\n", | |
" data=[\"values\"],\n", | |
" contiguity=\"rook\")\n", | |
"squares_gdf[\"region\"] = pd.Series(regions_dict_squares_rt)\n", | |
"squares_gdf.plot(column=\"region\", cmap='tab20c')\n", | |
"plt.gca().invert_yaxis()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": null, | |
"metadata": { | |
"collapsed": true | |
}, | |
"outputs": [], | |
"source": [] | |
} | |
], | |
"metadata": { | |
"kernelspec": { | |
"display_name": "Python 3", | |
"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.5.2" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment