{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Vehicle Routing\n", "\n", "## The Introduction\n", "\n", "Logistics is a major industry, with some estimates valuing it at USD 8183 billion globally in 2015. Most service providers operate a number of vehicles (e.g., trucks and container ships), a number of depots, where the vehicles are based overnight, and serve a number of client locations with each vehicle during each day. There are many optimization and control problems that consider these parameters. Computationally, the key challenge is how to design routes from depots to a number of client locations and back to the depot, so as to minimize vehicle-miles traveled, time spent, or similar objective functions. In this notebook we formalize an idealized version of the problem and showcase its solution using the quantum approximate optimization approach of Farhi, Goldstone, and Gutmann (2014). \n", "\n", "The overall workflow we demonstrate comprises:\n", "\n", "1. establish the client locations. Normally, these would be available ahead of the day of deliveries from a database. In our use case, we generate these randomly.\n", "\n", "2. compute the pair-wise distances, travel times, or similar. In our case, we consider the Euclidean distance, \"as the crow flies\", which is perhaps the simplest possible.\n", "\n", "3. compute the actual routes. This step is run twice, actually. First, we obtain a reference value by a run of a classical solver (IBM CPLEX) on the classical computer. Second, we run an alternative, hybrid algorithm partly on the quantum computer.\n", "\n", "4. visualization of the results. In our case, this is again a simplistic plot.\n", "\n", "In the following, we first explain the model, before we proceed with the installation of the pre-requisites and the data loading.\n", "\n", "## The Model \n", "\n", "Mathematically speaking, the vehicle routing problem (VRP) is a combinatorial problem, wherein the best routes from a depot to a number of clients and back to the depot are sought, given a number of available vehicles. There are a number of formulations possible, extending a number of formulations of the traveling salesman problem [Applegate et al, 2006]. Here, we present a formulation known as MTZ [Miller, Tucker, Zemlin, 1960]. \n", "\n", "Let $n$ be the number of clients (indexed as $1,\\dots,n$), and $K$ be the number of available vehicles. Let $x_{ij} = \\{0,1\\}$ be the binary decision variable which, if it is $1$, activates the segment from node $i$ to node $j$. The node index runs from $0$ to $n$, where $0$ is (by convention) the depot. There are twice as many distinct decision variables as edges. For example, in a fully connected graph, there are $n(n+1)$ binary decision variables. \n", "\n", "If two nodes $i$ and $j$ have a link from $i$ to $j$, we write $i \\sim j$. We also denote with $\\delta(i)^+$ the set of nodes to which $i$ has a link, i.e., $j \\in \\delta(i)^+$ if and only if $i \\sim j$. Similarly, we denote with \n", "$\\delta(i)^-$ the set of nodes which are connected to $i$, in the sense that $j \\in \\delta(i)^-$ if and only if $j \\sim i$. \n", "\n", "In addition, we consider continuous variables, for all nodes $i = 1,\\dots, n$, denoted $u_i$. These variables are needed in the MTZ formulation of the problem to eliminate sub-tours between clients. \n", "\n", "The VRP can be formulated as:\n", "\n", "$$\n", "(VRP) \\quad f = \\min_{\\{x_{ij}\\}_{i\\sim j}\\in \\{0,1\\}, \\{u_i\\}_{i=1,\\dots,n}\\in \\mathbb{R}} \\quad \\sum_{i \\sim j} w_{ij} x_{ij}\n", "$$\n", "\n", "subject to the node-visiting constraint:\n", "\n", "$$\n", "\\sum_{j \\in \\delta(i)^+} x_{ij} = 1, \\,\\sum_{j \\in \\delta(i)^-} x_{ji} = 1,\\, \\forall i \\in \\{1,\\dots,n\\},\n", "$$\n", "\n", "the depot-visiting constraints:\n", "\n", "$$\n", "\\sum_{i \\in \\delta(0)^+} x_{0i} = K, \\, \\sum_{j \\in \\delta(0)^+} x_{j0} = K,\n", "$$\n", "\n", "and the sub-tour elimination constraints:\n", "\n", "$$\n", "u_i - u_j + Q x_{ij} \\leq Q-q_j, \\, \\forall i \\sim j, \\,i ,j \\neq 0, \\quad q_i \\leq u_i \\leq Q,\\, \\forall i, i \\neq 0.\n", "$$\n", "\n", "In particular, \n", "\n", "- The cost function is linear in the cost functions and weighs the different arches based on a positive weight $w_{ij}>0$ (typically the distance between node $i$ and node $j$);\n", "- The first set of constraints enforce that from and to every client, only one link is allowed;\n", "- The second set of constraints enforce that from and to the depot, exactly $K$ links are allowed;\n", "- The third set of constraints enforce the sub-tour elimination constraints and are bounds on $u_i$, with $Q>q_j>0$, and $Q,q_i \\in \\mathbb{R}$.\n", "\n", "\n", "## Classical solution\n", "\n", "We can solve the VRP classically, e.g., by using CPLEX. CPLEX uses a branch-and-bound-and-cut method to find an approximate solution of the VRP, which, in this formulation, is a mixed-integer linear program (MILP). For the sake of notation, we pack the decision variables in one vector as\n", "\n", "$$\n", "{\\bf z} = [x_{01},x_{02},\\ldots,x_{10}, x_{12},\\ldots,x_{n(n-1)}]^T,\n", "$$\n", "\n", "wherein ${\\bf z} \\in \\{0,1\\}^N$, with $N = n (n+1)$. So the dimension of the problem scales quadratically with the number of nodes. Let us denote the optimal solution by ${\\bf z}^*$, and the associated optimal cost $f^*$. \n", "\n", "\n", "## Quantum solution\n", "\n", "Here, we demonstrate an approach that combines classical and quantum computing steps, following the quantum approximate optimization approach of Farhi, Goldstone, and Gutmann (2014). In particular, we use the variational quantum eigensolver (VQE). We stress that given the use of limited depth of the quantum circuits employed (variational forms), it is hard to discuss the speed-up of the algorithm, as the solution obtained is heuristic in nature. At the same time, due to the nature and importance of the target problems, it is worth investigating heuristic approaches, which may be worthwhile for some problem classes. \n", "\n", "The algorithm can be summarized as follows:\n", "\n", "- Preparation steps: \n", "\t- Transform the combinatorial problem into a binary polynomial optimization problem with equality constraints only;\n", "\t- Map the resulting problem into an Ising Hamiltonian ($H$) for variables ${\\bf z}$ and basis $Z$, via penalty methods if necessary;\n", "\t- Choose the depth of the quantum circuit $m$. Note that the depth can be modified adaptively.\n", "\t- Choose a set of controls $\\theta$ and make a trial function $\\big|\\psi(\\boldsymbol\\theta)\\rangle$, built using a quantum circuit made of C-Phase gates and single-qubit Y rotations, parameterized by the components of $\\boldsymbol\\theta$.\n", "\n", "\n", "- Algorithm steps: \n", "\t- Evaluate $C(\\boldsymbol\\theta) = \\langle\\psi(\\boldsymbol\\theta)\\big|H\\big|\\psi(\\boldsymbol\\theta)\\rangle$ by sampling the outcome of the circuit in the Z-basis and adding the expectation values of the individual Ising terms together. In general, different control points around $\\boldsymbol\\theta$ have to be estimated, depending on the classical optimizer chosen.\n", "\t- Use a classical optimizer to choose a new set of controls.\n", "\t- Continue until $C(\\boldsymbol\\theta)$ reaches a minimum, close enough to the solution $\\boldsymbol\\theta^*$.\n", "\t- Use the last $\\boldsymbol\\theta$ to generate a final set of samples from the distribution $\\Big|\\langle z_i\\big|\\psi(\\boldsymbol\\theta)\\rangle\\Big|^2\\;\\forall i$ to obtain the answer.\n", "\n", "\n", "There are many parameters throughout, notably the choice of the trial wavefunction. Below, we consider:\n", "\n", "$$\n", "\\big|\\psi(\\theta)\\rangle = [U_\\mathrm{single}(\\boldsymbol\\theta) U_\\mathrm{entangler}]^m \\big|+\\rangle\n", "$$\n", "\n", "where $U_\\mathrm{entangler}$ is a collection of C-Phase gates (fully-entangling gates), and $U_\\mathrm{single}(\\theta) = \\prod_{i=1}^N Y(\\theta_{i})$, where $N$ is the number of qubits and $m$ is the depth of the quantum circuit. \n", "\n", "\n", "### Construct the Ising Hamiltonian\n", "\n", "From $VRP$ one can construct a binary polynomial optimization with equality constraints only by considering cases in which $K=n-1$. In these cases the sub-tour elimination constraints are not necessary and the problem is only on the variable ${\\bf z}$. In particular, we can write an augmented Lagrangian as\n", "\n", "$$\n", "(IH) \\quad H = \\sum_{i \\sim j} w_{ij} x_{ij} + A \\sum_{i \\in \\{1,\\dots,n\\}} \\Big(\\sum_{j \\in \\delta(i)^+} x_{ij} - 1\\Big)^2 + A \\sum_{i \\in \\{1,\\dots,n\\}}\\Big(\\sum_{j \\in \\delta(i)^-} x_{ji} - 1\\Big)^2 +A \\Big(\\sum_{i \\in \\delta(0)^+} x_{0i} - K\\Big)^2 + A\\Big(\\sum_{j \\in \\delta(0)^+} x_{j0} - K\\Big)^2\n", "$$\n", "\n", "where $A$ is a big enough parameter. \n", "\n", "### From Hamiltonian to QP formulation \n", "\n", "In the vector ${\\bf z}$, and for a complete graph ($\\delta(i)^+ = \\delta(i)^- = \\{0,1,\\dots,i-1,i+1,\\dots,n\\}$), $H$ can be written as follows.\n", "\n", "$$\n", "\\min_{{\\bf z}\\in \\{0,1\\}^{n(n+1)}} {\\bf w}^T {\\bf z} + A \\sum_{i \\in \\{1,\\dots,n\\}} \\Big({\\bf e}_i \\otimes {\\bf 1}_n^T {\\bf z} - 1\\Big)^2 + A \\sum_{i \\in \\{1,\\dots,n\\}}\\Big({\\bf v}_i^T {\\bf z} - 1\\Big)^2 + A \\Big(({\\bf e}_0 \\otimes {\\bf 1}_n)^T{\\bf z} - K\\Big)^2 + A\\Big({\\bf v}_0^T{\\bf z} - K\\Big)^2.\n", "$$\n", "\n", "That is:\n", "\n", "$$\n", "\\min_{\\bf z\\in \\{0,1\\}^{n(n+1)}} \\bf z^T {\\bf Q} \\bf z + {\\bf g}^T \\bf z + c,\n", "$$\n", "\n", "Where: first term:\n", "\n", "$$\n", "{\\bf Q} = A \\sum_{i \\in \\{0,1,\\dots,n\\}} \\Big[({\\bf e}_i \\otimes {\\bf 1}_n)({\\bf e}_i \\otimes {\\bf 1}_n)^T + {\\bf v}_i{\\bf v}_i^T \\Big] \n", "$$\n", "\n", "Second term:\n", "\n", "$$\n", "{\\bf g} = {\\bf w} -2 A \\sum_{i \\in \\{1,\\dots,n\\}} \\Big[({\\bf e}_i \\otimes {\\bf 1}_n) + {\\bf v}_i \\Big] -2 A K \\Big[({\\bf e}_0 \\otimes {\\bf 1}_n) + {\\bf v}_0 \\Big]\n", "$$\n", "\n", "Third term:\n", "\n", "$$\n", "c = 2An +2AK^2.\n", "$$\n", "\n", "The QP formulation of the Ising Hamiltonian is ready for the use of VQE. We will solve the QP using optimization stack available in Qiskit optimization.\n", "\n", "\n", "\n", "## References\n", "\n", "[1] E. Farhi, J. Goldstone, S. Gutmann e-print arXiv 1411.4028, 2014\n", "\n", "[2] [Max-Cut and Traveling Salesman Problem](./06_examples_max_cut_and_tsp.ipynb)\n", "\n", "[3] C. E. Miller, E. W. Tucker, and R. A. Zemlin (1960). \"Integer Programming Formulations and Travelling Salesman Problems\". J. ACM. 7: 326–329. doi:10.1145/321043.321046.\n", "\n", "[4] D. L. Applegate, R. M. Bixby, V. Chvátal, and W. J. Cook (2006). The Traveling Salesman Problem. Princeton University Press, ISBN 978-0-691-12993-8." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Initialization\n", "\n", "First of all we load all the packages that we need.\n", "CPLEX is required for the classical computations. You can install it by `pip install 'qiskit-optimization[cplex]'`. " ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "try:\n", " import cplex\n", " from cplex.exceptions import CplexError\n", "except:\n", " print(\"Warning: Cplex not found.\")\n", "import math\n", "\n", "from qiskit_algorithms.utils import algorithm_globals\n", "from qiskit_algorithms import SamplingVQE\n", "from qiskit_algorithms.optimizers import SPSA\n", "from qiskit.circuit.library import RealAmplitudes\n", "from qiskit.primitives import Sampler" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We then initialize the variables" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Initialize the problem by defining the parameters\n", "n = 3 # number of nodes + depot (n+1)\n", "K = 2 # number of vehicles" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We define an initializer class that randomly places the nodes in a 2-D plane and computes the distance between them. " ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Get the data\n", "class Initializer:\n", " def __init__(self, n):\n", " self.n = n\n", "\n", " def generate_instance(self):\n", "\n", " n = self.n\n", "\n", " # np.random.seed(33)\n", " np.random.seed(1543)\n", "\n", " xc = (np.random.rand(n) - 0.5) * 10\n", " yc = (np.random.rand(n) - 0.5) * 10\n", "\n", " instance = np.zeros([n, n])\n", " for ii in range(0, n):\n", " for jj in range(ii + 1, n):\n", " instance[ii, jj] = (xc[ii] - xc[jj]) ** 2 + (yc[ii] - yc[jj]) ** 2\n", " instance[jj, ii] = instance[ii, jj]\n", "\n", " return xc, yc, instance" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Initialize the problem by randomly generating the instance\n", "initializer = Initializer(n)\n", "xc, yc, instance = initializer.generate_instance()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Classical solution using IBM ILOG CPLEX\n", "\n", "For a classical solution, we use IBM ILOG CPLEX. CPLEX is able to find the exact solution of this problem. We first define a ClassicalOptimizer class that encodes the problem in a way that CPLEX can solve, and then instantiate the class and solve it. \n" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "class ClassicalOptimizer:\n", " def __init__(self, instance, n, K):\n", "\n", " self.instance = instance\n", " self.n = n # number of nodes\n", " self.K = K # number of vehicles\n", "\n", " def compute_allowed_combinations(self):\n", " f = math.factorial\n", " return f(self.n) / f(self.K) / f(self.n - self.K)\n", "\n", " def cplex_solution(self):\n", "\n", " # refactoring\n", " instance = self.instance\n", " n = self.n\n", " K = self.K\n", "\n", " my_obj = list(instance.reshape(1, n**2)[0]) + [0.0 for x in range(0, n - 1)]\n", " my_ub = [1 for x in range(0, n**2 + n - 1)]\n", " my_lb = [0 for x in range(0, n**2)] + [0.1 for x in range(0, n - 1)]\n", " my_ctype = \"\".join([\"I\" for x in range(0, n**2)]) + \"\".join(\n", " [\"C\" for x in range(0, n - 1)]\n", " )\n", "\n", " my_rhs = (\n", " 2 * ([K] + [1 for x in range(0, n - 1)])\n", " + [1 - 0.1 for x in range(0, (n - 1) ** 2 - (n - 1))]\n", " + [0 for x in range(0, n)]\n", " )\n", " my_sense = (\n", " \"\".join([\"E\" for x in range(0, 2 * n)])\n", " + \"\".join([\"L\" for x in range(0, (n - 1) ** 2 - (n - 1))])\n", " + \"\".join([\"E\" for x in range(0, n)])\n", " )\n", "\n", " try:\n", " my_prob = cplex.Cplex()\n", " self.populatebyrow(my_prob, my_obj, my_ub, my_lb, my_ctype, my_sense, my_rhs)\n", "\n", " my_prob.solve()\n", "\n", " except CplexError as exc:\n", " print(exc)\n", " return\n", "\n", " x = my_prob.solution.get_values()\n", " x = np.array(x)\n", " cost = my_prob.solution.get_objective_value()\n", "\n", " return x, cost\n", "\n", " def populatebyrow(self, prob, my_obj, my_ub, my_lb, my_ctype, my_sense, my_rhs):\n", "\n", " n = self.n\n", "\n", " prob.objective.set_sense(prob.objective.sense.minimize)\n", " prob.variables.add(obj=my_obj, lb=my_lb, ub=my_ub, types=my_ctype)\n", "\n", " prob.set_log_stream(None)\n", " prob.set_error_stream(None)\n", " prob.set_warning_stream(None)\n", " prob.set_results_stream(None)\n", "\n", " rows = []\n", " for ii in range(0, n):\n", " col = [x for x in range(0 + n * ii, n + n * ii)]\n", " coef = [1 for x in range(0, n)]\n", " rows.append([col, coef])\n", "\n", " for ii in range(0, n):\n", " col = [x for x in range(0 + ii, n**2, n)]\n", " coef = [1 for x in range(0, n)]\n", "\n", " rows.append([col, coef])\n", "\n", " # Sub-tour elimination constraints:\n", " for ii in range(0, n):\n", " for jj in range(0, n):\n", " if (ii != jj) and (ii * jj > 0):\n", "\n", " col = [ii + (jj * n), n**2 + ii - 1, n**2 + jj - 1]\n", " coef = [1, 1, -1]\n", "\n", " rows.append([col, coef])\n", "\n", " for ii in range(0, n):\n", " col = [(ii) * (n + 1)]\n", " coef = [1]\n", " rows.append([col, coef])\n", "\n", " prob.linear_constraints.add(lin_expr=rows, senses=my_sense, rhs=my_rhs)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Number of feasible solutions = 3.0\n" ] } ], "source": [ "# Instantiate the classical optimizer class\n", "classical_optimizer = ClassicalOptimizer(instance, n, K)\n", "\n", "# Print number of feasible solutions\n", "print(\"Number of feasible solutions = \" + str(classical_optimizer.compute_allowed_combinations()))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1.0, 1.0, 1.0, 0.0, 1.0, 0.0]\n" ] } ], "source": [ "# Solve the problem in a classical fashion via CPLEX\n", "x = None\n", "z = None\n", "try:\n", " x, classical_cost = classical_optimizer.cplex_solution()\n", " # Put the solution in the z variable\n", " z = [x[ii] for ii in range(n**2) if ii // n != ii % n]\n", " # Print the solution\n", " print(z)\n", "except:\n", " print(\"CPLEX may be missing.\")" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "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cSHe3t727xs2bDC5GtegsCIiIuIiGjRoQEZGBpA980eyKayIiIi4gHvvvZe//voLgKSkpDI5RTk/6oSIiIjJPv74Y9577z0A/vzzTwICAkyuyLUorIiIiJho27ZtDB48GIAPPviARo0amVyR61FYERERMcm5c+do2LAhAEOGDOGee+4xuSLXpLAiIiJiApvNhr+/PwB16tRh1qxZJlfkuhRWRERETJATVNzc3Ni5c6fJ1bg2hRUREZFi1rJlS1JTUwFIT083uRrXp7AiIiJSjB599FHWrVsHwKlTpzRFuQDUIRERkWIyf/58Xn/9dQDWrFlDxYoVTa6oZFBYERERKQZ79+6lX79+ALz55ptcd911JldUciisiIiIONmFCxeoVasWAP369ePBBx80uaKSRWFFRETEiWw2Gz4+PgBEREQwb948kysqeZwaVl566SVatGiBv78/ISEh9O3bl127djlzkyIiIi4lKCgIAIvFwsGDB02upmRyalj59ddfGTVqFGvWrCE2NpaMjAxiYmJ0JUkRESkTbrzxRk6fPg1oivLVcHfmyn/66adct2fPnk1ISAgbNmygXbt2ecanpaWRlpZmv52cnAxARkaG/ZLZriqnPlevs7ipL46pL3mpJ46pL46VhL68+OKLrFmzBh8fH/7++28Mw3B6va7Sl6LevsUwDKNI13gJe/bs4ZprrmHr1q1ER0fnuX/SpElMnjw5z/I5c+bg6+tbHCWKiIjIVUpNTWXgwIEkJSUVyRWkiy2s2Gw2evfuzZkzZ1i5cqXDMY72rERERJCQkODyl8vOyMggNjaWLl264OHhYXY5LkN9cUx9yUs9cUx9ccyV+3LkyBHq1asHwNNPP81jjz1WbNt2lb4kJycTFBRUZGHFqR8DXWzUqFFs27Yt36AC4OXlhZeXV57lHh4eLvdizE9JqrU4qS+OqS95qSeOqS+OuVpf0tPTiYqKAqBr1648+eSTptRhdl+KetvFElZGjx7NokWLWLFiBVWrVi2OTYqIiBS7nP9wBwcH5zluU66cU8OKYRg8+OCDfPPNNyxfvpzq1as7c3MiIiKmCQ8Pt/984sQJEyspfZwaVkaNGsWcOXNYuHAh/v7+HDt2DIDAwED7CXJERERKul69enH06FGAXMdeStFw6nlWZsyYQVJSEh06dCAsLMz+NXfuXGduVkREpNi88sorLFq0CID9+/fj6elpckWlj9M/BhIRESmtfvvtNx5//HEAvvvuOyIjI02uqHTStYFERESuwIkTJ+wnOB0/fjw33XSTyRWVXgorIiIihZSZmUloaCgAbdq04aWXXjK5otJNYUVERKSQcqYoBwQEXPL8YVI0FFZEREQKoWbNmthsNgD7RQrFuRRWRERECmjgwIHs27cPgJSUFKxW/RktDuqyiIhIAcyYMYPPP/8cgJ07d+oCu8VIYUVEROQy1q9fzwMPPADAF198QZ06dUyuqGxRWBEREbmEM2fO0KJFCyD7WncDBgwwuaKyR2FFREQkHzabjQoVKgDQtGlT3nrrLZMrKpsUVkRERPLh7e1t/75x40aTqym7FFZEREQcaNiwIRkZGUD2zB8xj8KKiIjIv4wcOZJt27YBkJSUpCnKJlP3RURELvLpp5/y7rvvArBp0yYCAgJMrkgUVkRERP6xfft27rrrLgDee+89mjRpYm5BAiisiIiIAHDu3Dmio6MBGDx4MMOHDze5IsmhsCIiImWezWbD398fgNq1azN79mxzC5JcFFZERKTMyzkuxc3NjV27dplcjfybwoqIiJRp119/vX1qclpamsnViCMKKyIiUmaNHTuWtWvXAnDy5Enc3NxMrkgcUVgREZEy6ZtvvmHatGkArFq1iqCgIJMrkvworIiISJmzb98+brnlFgBef/11WrVqZXJFcikKKyIiUqZcuHCBmjVrAnDLLbcwZswYcwuSy1JYERGRMsNms+Hj4wNA1apVmT9/vskVSUEorIiISJkRHBxs//nQoUMmViKFobAiIiJlQqdOnUhMTASwX01ZSgaFFRERKfUmTZrEsmXLAIiPj8fd3d3kiqQwFFZERKRU+/nnn5k8eTIAS5YsITw83OSKpLAUVkREpNSKj4+na9euADz33HN06tTJ5IrkSiisiIhIqZSenk7VqlUBiImJYcKECSZXJFdKYUVEREolLy8vAIKCgli8eLHJ1cjVUFgREZFSp0qVKvafT548aWIlUhQUVkREpFTp27cvR44cAeD8+fMmVyNFQWFFRERKjddee42FCxcCEBcXh7e3t8kVSVFwalhZsWIFvXr1Ijw8HIvFwoIFC5y5ORERKcNWrlzJY489BsDChQuJiooytyApMk4NKykpKTRu3Jjp06c7czMiIlLGJSQk0LZtWwAef/xxevfu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//tfUlJSGDp0qLM3LSIiV6FNmzacO3cOINfkB5Hi5vSwMmDAAE6ePMkzzzzDsWPHaNKkCT/99BOhoaHO3rSIiFyhJ554glWrVgFw8uRJ3N1d6hBHKWOK5dU3evRoRo8eXRybEhGRq/Ttt98ydepUAH777TeCgoJMrkjKOp3NR0RE7Pbv30+fPn0AePXVV7nhhhtMrkhEYUVERP5x4cIFqlevDkCfPn0YO3asyRWJZFNYERERAHx8fAAIDw9nwYIF5hYjchGFFRERITg42P5zfHy8iZWI5KWwIiJSxsXExJCQkABoirK4JoUVEZEy7Pnnnyc2NhaAQ4cO4enpaXJFInkprIiIlFFLly7l6aefBuCnn36iatWqJlck4pjCiohIGXTkyBE6d+4MwMSJE+natavJFYnkT2FFRKSMyczMpEqVKgB06tSJSZMmmVuQyGUorIiIlDE5V8StWLEiS5YsMbkakctTWBERKUMiIiLsP588edLESkQKTmFFRKSMuPXWWzl8+DAA58+fx2rVnwApGfRKFREpA9544w2+/vprAPbu3Yu3t7fJFYkUnMKKiEgpt3r1asaMGQPA119/TY0aNcwtSKSQFFZEREqxhIQEWrduDcDYsWO5+eabTa5IpPAUVkRESqnMzEz7NX+uu+46Xn31VZMrErkyCisiIqVUznEpfn5+rFmzxuRqRK6cwoqISClUu3ZtsrKyAEhOTja5GpGro7AiIlLKDB48mN27dwNw9uxZTVGWEk+vYBGRUuSDDz7g448/BmDbtm2UK1fO5IpErp7CiohIKbF582aGDx8OwCeffEKDBg1MrkikaCisiIiUAsnJyTRt2hSAe++9l0GDBplckUjRUVgRESnhbDYbgYGBADRs2JCZM2eaXJFI0VJYEREp4fz8/ADw8PRky5YtJlcjUvQUVkRESrCmTZty4cIFAC6cP29yNSLOobAiIlJCPfjgg2zevBmA06dPa4qylFp6ZYuIlEBz587l7bffBmDdunWUL1/e3IJEnEhhRUSkhNm1axe33347ADNmzKB58+YmVyTiXAorIiIlSGpqKnXr1gVg4MCB3HfffSZXJOJ8CisiIiWEzWazz/ypUaMGn332mckViRQPhRURkRIi57gUq9XK3r17zS1GpBgprIiIlADdunXj7NmzAKSlpZlcjUjxUlgRESkBVq9eDcDx48dx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utJv79699OvXD4A33niD6667zuSKREQKTmFFilV4eDjnz59n//79eHh4APDUU09hsVj473//a25xpdSFCxeoVasWAP369eOhhx4yuSIRkcJRWBFTREZGkp6ezs6dO3FzcwPgkUcewWKx8O6775pcXelhs9nw8fEBICIignnz5plckYhI4SmsiKnq1KlDZmYmW7duxWKxADBy5EgsFgsff/yxydWVfEFBQQBYLJZcBzuLiJQkxRJW0tLSaNKkCRaLhc2bNxfHJqWEiY6OxmazsW7dOvuywYMHY7FYtDfgCnXq1InTp08DmqIsIiVbsYSVxx9/3H6iMJFLad68OYZhsHLlSvuy2267DYvFwqJFi0ysrGSZOHEiy5YtA+Do0aO4u7ubXJGIyJVzelj58ccf+fnnn3n11VedvSkpRdq0aYNhGCxdutS+rFevXlgsllzLJK/Fixfz7LPPAtnXa6pcubLJFYmIXB2n/nfr+PHjjBgxggULFuDr63vZ8WlpaaSlpdlvJycnA5CRkUFGRobT6iwKOfW5ep3F7Wr70rZtW9LT0/n555/p378/kB1aAH766SdatWpVNIUWM2e9Xo4cOcLNN9+Mj48PTz/9NG3bti0xr0n9DjmmvjimvjjmKn0p6u1bDMMwinSN/zAMgx49etCmTRsmTJjA/v37qV69Ops2baJJkyYOHzNp0iQmT56cZ/mcOXMKFHZERETEfKmpqQwcOJCkpCQCAgKuen2FDivjx49nypQplxyzY8cOfv75Z7788kt+/fVX3NzcChRWHO1ZiYiIICEhoUierDNlZGQQGxtLly5d7OcPEef1Ze7cudx777322xaLhd9//50GDRoU2TacyRl9yTlbcFBQEHv37i2SdRYn/Q45pr44pr445ip9SU5OJigoqMjCSqE/Bho7dixDhgy55JgaNWqwbNkyVq9ejZeXV677mjdvzp133slHH32U53FeXl55xgN4eHiUmBdjSaq1OBV1XwYNGsSgQYN4//33GTFiBABNmzbFarXy119/UadOnSLbljMVVV9yTrYHlPgpyvodckx9cUx9cczsvhT1tgsdVoKDg3NdTTc/b775Js8//7z99pEjR+jatStz587Vqb6lyAwfPpzhw4fzxhtvMGbMGGw2G3Xr1sXd3Z09e/YQGRlpdolO16dPH44ePQpkn61WRKS0cdpsoGrV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9mX58uV5XisWi4Vjx44VT8HF4KWXXqJFixb4+/sTEhJC37592bVr12UfV9rfW66kL6XlvUVh5SrceeedbN++ndjYWBYtWsSKFSu49957L/u4ESNGcPToUfvX1KlTi6Fa55g7dy6PPvooEydOZOPGjTRu3JiuXbty4sQJh+NXrVrFHXfcwbBhw9i0aRN9+/alb9++bNu2rZgrd67C9gWyT4998eviwIEDxVix86WkpNC4cWOmT59eoPFxcXH07NmTjh07snnzZsaMGcPw4cNZvHixkystXoXtS45du3bler2EhIQ4qcLi9+uvvzJq1CjWrFlDbGwsGRkZxMTEkJKSku9jysJ7y5X0BUrJe4shV+Svv/4yAGPdunX2ZT/++KNhsViM+Pj4fB/Xvn174+GHHy6GCotHy5YtjVGjRtlvZ2VlGeHh4cZLL73kcPxtt91m9OzZM9ey6667zhg5cqRT6yxuhe3LrFmzjMDAwGKqznyA8c0331xyzOOPP240aNAg17IBAwYYXbt2dWJl5ipIX3755RcDME6fPl0sNbmCEydOGIDx66+/5jumrLy3XKwgfSkt7y3as3KFVq9eTfny5WnevLl9WefOnbFaraxdu/aSj/3ss88ICgoiOjqaJ598ktTUVGeX6xTp6els2LCBzp0725dZrVY6d+7M6tWrHT5m9erVucYDdO3aNd/xJdGV9AXg3LlzREZGEhERQZ8+fdi+fXtxlOuyysJr5Wo0adKEsLAwunTpwu+//252OU6VlJQEQMWKFfMdUxZfLwXpC5SO9xaFlSt07NixPLtd3d3dqVix4iU/Ox44cCCffvopv/zyC08++SSffPIJgwYNcna5TpGQkEBWVhahoaG5loeGhubbg2PHjhVqfEl0JX2pU6cOH374IQsXLuTTTz/FZrPRunVrDh8+XBwlu6T8XivJycmcP3/epKrMFxYWxv/+9z/mz5/P/PnziYiIoEOHDmzcuNHs0pzCZrMxZswY2rRpQ3R0dL7jysJ7y8UK2pfS8t7ibnYBrmb8+PFMmTLlkmN27Nhxxeu/+JiWhg0bEhYWRqdOndi7dy81a9a84vVKydaqVStatWplv926dWvq1avHzJkzee6550ysTFxNnTp1qFOnjv1269at2bt3L6+//jqffPKJiZU5x6hRo9i2bRsrV640uxSXUtC+lJb3FoWVfxk7dixDhgy55JgaNWpQuXLlPAdLZmZmkpiYSOXKlQu8veuuuw6APXv2lLiwEhQUhJubG8ePH8+1/Pjx4/n2oHLlyoUaXxJdSV/+zcPDg6ZNm7Jnzx5nlFgi5PdaCQgIwMfHx6SqXFPLli1L5R/z0aNH2ycvVK1a9ZJjy8J7S47C9OXfSup7iz4G+pfg4GDq1q17yS9PT09atWrFmTNn2LBhg/2xy5Ytw2az2QNIQWzevBnI3rVb0nh6etKsWTOWLl1qX2az2Vi6dGmuJH+xVq1a5RoPEBsbm+/4kuhK+vJvWVlZbN26tUS+LopKWXitFJXNmzeXqteKYRiMHj2ab775hmXLllG9evXLPqYsvF6upC//VmLfW8w+wrck69atm9G0aVNj7dq1xsqVK41rrrnGuOOOO+z3Hz582KhTp46xdu1awzAMY8+ePcazzz5rrF+/3oiLizMWLlxo1KhRw2jXrp1ZT+GqffHFF4aXl5cxe/Zs46+//jLuvfdeo3z58saxY8cMwzCMu+66yxg/frx9/O+//264u7sbr776qrFjxw5j4sSJhoeHh7F161aznoJTFLYvkydPNhYvXmzs3bvX2LBhg3H77bcb3t7exvbt2816CkXu7NmzxqZNm4xNmzYZgDFt2jRj06ZNxoEDBwzDMIzx48cbd911l338vn37DF9fX2PcuHHGjh07jOnTpxtubm7GTz/9ZNZTcIrC9uX11183FixYYOzevdvYunWr8fDDDxtWq9VYsmSJWU+hyN1///1GYGCgsXz5cuPo0aP2r9TUVPuYsvjeciV9KS3vLQorV+HUqVPGHXfcYZQrV84ICAgwhg4dapw9e9Z+f1xcnAEYv/zyi2EYhnHw4EGjXbt2RsWKFQ0vLy+jVq1axrhx44ykpCSTnkHReOutt4xq1aoZnp6eRsuWLY01a9bY72vfvr0xePDgXOO//PJLo3bt2oanp6fRoEED4/vvvy/miotHYfoyZswY+9jQ0FCjR48exsaNG02o2nlyptz++yunD4MHDzbat2+f5zFNmjQxPD09jRo1ahizZs0q9rqdrbB9mTJlilGzZk3D29vbqFixotGhQwdj2bJl5hTvJI76AeT69y+L7y1X0pfS8t5iMQzDKLbdOCIiIiKFpGNWRERExKUprIiIiIhLU1gRERERl6awIiIiIi5NYUVERERcmsKKiIiIuDSFFREREXFpCisiIiLi0hRWRERExKUprIiIiIhLU1gRERERl/Z/dpYRpxIG8tgAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Visualize the solution\n", "def visualize_solution(xc, yc, x, C, n, K, title_str):\n", " plt.figure()\n", " plt.scatter(xc, yc, s=200)\n", " for i in range(len(xc)):\n", " plt.annotate(i, (xc[i] + 0.15, yc[i]), size=16, color=\"r\")\n", " plt.plot(xc[0], yc[0], \"r*\", ms=20)\n", "\n", " plt.grid()\n", "\n", " for ii in range(0, n**2):\n", "\n", " if x[ii] > 0:\n", " ix = ii // n\n", " iy = ii % n\n", " plt.arrow(\n", " xc[ix],\n", " yc[ix],\n", " xc[iy] - xc[ix],\n", " yc[iy] - yc[ix],\n", " length_includes_head=True,\n", " head_width=0.25,\n", " )\n", "\n", " plt.title(title_str + \" cost = \" + str(int(C * 100) / 100.0))\n", " plt.show()\n", "\n", "\n", "if x is not None:\n", " visualize_solution(xc, yc, x, classical_cost, n, K, \"Classical\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "If you have CPLEX, the solution shows the depot with a star and the selected routes for the vehicles with arrows. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Quantum solution from the ground up\n", "\n", "For the quantum solution, we use Qiskit. \n", "\n", "First, we derive the solution from the ground up, using a class QuantumOptimizer that encodes the quantum approach to solve the problem and then we instantiate it and solve it. We define the following methods inside the class:\n", "\n", "- `binary_representation` : encodes the problem $(M)$ into a QP terms (that's basically linear algebra);\n", "- `construct_problem` : constructs a QUBO optimization problem as an instance of `QuadraticProgram`;\n", "- `solve_problem`: solves the problem $(M)$ constructed at the previous step via `MinimunEigenOptimizer` by using `SamplingVQE` with default parameters;" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "from qiskit_optimization import QuadraticProgram\n", "from qiskit_optimization.algorithms import MinimumEigenOptimizer\n", "\n", "\n", "class QuantumOptimizer:\n", " def __init__(self, instance, n, K):\n", "\n", " self.instance = instance\n", " self.n = n\n", " self.K = K\n", "\n", " def binary_representation(self, x_sol=0):\n", "\n", " instance = self.instance\n", " n = self.n\n", " K = self.K\n", "\n", " A = np.max(instance) * 100 # A parameter of cost function\n", "\n", " # Determine the weights w\n", " instance_vec = instance.reshape(n**2)\n", " w_list = [instance_vec[x] for x in range(n**2) if instance_vec[x] > 0]\n", " w = np.zeros(n * (n - 1))\n", " for ii in range(len(w_list)):\n", " w[ii] = w_list[ii]\n", "\n", " # Some variables I will use\n", " Id_n = np.eye(n)\n", " Im_n_1 = np.ones([n - 1, n - 1])\n", " Iv_n_1 = np.ones(n)\n", " Iv_n_1[0] = 0\n", " Iv_n = np.ones(n - 1)\n", " neg_Iv_n_1 = np.ones(n) - Iv_n_1\n", "\n", " v = np.zeros([n, n * (n - 1)])\n", " for ii in range(n):\n", " count = ii - 1\n", " for jj in range(n * (n - 1)):\n", "\n", " if jj // (n - 1) == ii:\n", " count = ii\n", "\n", " if jj // (n - 1) != ii and jj % (n - 1) == count:\n", " v[ii][jj] = 1.0\n", "\n", " vn = np.sum(v[1:], axis=0)\n", "\n", " # Q defines the interactions between variables\n", " Q = A * (np.kron(Id_n, Im_n_1) + np.dot(v.T, v))\n", "\n", " # g defines the contribution from the individual variables\n", " g = (\n", " w\n", " - 2 * A * (np.kron(Iv_n_1, Iv_n) + vn.T)\n", " - 2 * A * K * (np.kron(neg_Iv_n_1, Iv_n) + v[0].T)\n", " )\n", "\n", " # c is the constant offset\n", " c = 2 * A * (n - 1) + 2 * A * (K**2)\n", "\n", " try:\n", " max(x_sol)\n", " # Evaluates the cost distance from a binary representation of a path\n", " fun = (\n", " lambda x: np.dot(np.around(x), np.dot(Q, np.around(x)))\n", " + np.dot(g, np.around(x))\n", " + c\n", " )\n", " cost = fun(x_sol)\n", " except:\n", " cost = 0\n", "\n", " return Q, g, c, cost\n", "\n", " def construct_problem(self, Q, g, c) -> QuadraticProgram:\n", " qp = QuadraticProgram()\n", " for i in range(n * (n - 1)):\n", " qp.binary_var(str(i))\n", " qp.objective.quadratic = Q\n", " qp.objective.linear = g\n", " qp.objective.constant = c\n", " return qp\n", "\n", " def solve_problem(self, qp):\n", " algorithm_globals.random_seed = 10598\n", " vqe = SamplingVQE(sampler=Sampler(), optimizer=SPSA(), ansatz=RealAmplitudes())\n", " optimizer = MinimumEigenOptimizer(min_eigen_solver=vqe)\n", " result = optimizer.solve(qp)\n", " # compute cost of the obtained result\n", " _, _, _, level = self.binary_representation(x_sol=result.x)\n", " return result.x, level" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Step 1\n", "\n", "Instantiate the quantum optimizer class with parameters: \n", "\n", "- the instance;\n", "- the number of nodes and vehicles `n` and `K`;" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "# Instantiate the quantum optimizer class with parameters:\n", "quantum_optimizer = QuantumOptimizer(instance, n, K)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Step 2\n", "\n", "Encode the problem as a binary formulation (IH-QP).\n", "\n", "Sanity check: make sure that the binary formulation in the quantum optimizer is correct (i.e., yields the same cost given the same solution)." ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Binary cost: 132.11148115684045 classical cost: 132.1114811568365\n", "Binary formulation is correct\n" ] } ], "source": [ "# Check if the binary representation is correct\n", "try:\n", " if z is not None:\n", " Q, g, c, binary_cost = quantum_optimizer.binary_representation(x_sol=z)\n", " print(\"Binary cost:\", binary_cost, \"classical cost:\", classical_cost)\n", " if np.abs(binary_cost - classical_cost) < 0.01:\n", " print(\"Binary formulation is correct\")\n", " else:\n", " print(\"Error in the binary formulation\")\n", " else:\n", " print(\"Could not verify the correctness, due to CPLEX solution being unavailable.\")\n", " Q, g, c, binary_cost = quantum_optimizer.binary_representation()\n", " print(\"Binary cost:\", binary_cost)\n", "except NameError as e:\n", " print(\"Warning: Please run the cells above first.\")\n", " print(e)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Step 3\n", "\n", "Encode the problem as an instance of `QuadraticProgram`." ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "qp = quantum_optimizer.construct_problem(Q, g, c)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Step 4\n", "\n", "Solve the problem via `MinimumEigenOptimizer` from the optimization stack. N.B. Depending on the number of qubits, the state-vector simulation can take a while; for example with 12 qubits, it takes more than 12 hours. Logging is useful to see what the program is doing." ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1. 1. 1. 0. 1. 0.] 132.11148115684045\n" ] } ], "source": [ "quantum_solution, quantum_cost = quantum_optimizer.solve_problem(qp)\n", "\n", "print(quantum_solution, quantum_cost)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Step 5\n", "Visualize the solution" ] }, { "cell_type": "code", "execution_count": 14, "metadata": { "tags": [ "nbsphinx-thumbnail" ] }, "outputs": [ { "data": { "image/png": "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z8uVe9gtNySKlCcKK1Lu1K1bl5kzZ9KvXz+uvPJKhgwZQq1atdi/fz8fffQRp0+f5osvvqBWrVqO59x55508/fTT3HrrrTz66KOkpaUxZcoU6tWrx8aNGx3junbtire3Nz179uSBBx7gzJkzfPDBB4SFhV3y3o6mTZvi4eHBhAkTSEpKwsfHx3Edl6FDh/Lggw9y22230aVLF37//XcWLlxYItNeg4KCeOONNxg6dCgtW7akf//+VKpUid9//520tDRmzJiBl5cXEyZMYPDgwXTo0IF+/fo5pi5HR0c7Do/9+eefdOrUidtvv51GjRrh6enJN998w/Hjx7nzzjsd22zevDlTpkzhpZdeom7duoSFhXHDDTcUWGNxnrOyZcsWvvvuOyBnynlSUhIvvfQSAFdddRU9e/YE4OWXX+bXX3+le/fu1KxZk1OnTjF37lzWrVvH8OHDqVu3rmOd3bt3Z+/evYwaNYqVK1fm2dsXHh5Oly5dHN936tQJIM+VjA8cOMAnn3wC5JzMDDhqioqK4u6773aM/f777/n9998ByMzMZMuWLY6xt9xyiyOEi7glaycjiVhn69atZv/+/c2qVauaNpvNBExfX19z+/btTscvWrTIjImJMb29vc369eubn376qdOpy999953ZpEkT09fX14yOjjYnTJhgfvzxxyZg7tu3zzEuKirK7NGjR77tdOjQId/03A8++MCsXbu26eHhkWcac3Z2tvn000+bISEhpr+/v9mtWzdz9+7dBU5dXrduXZ715tZ/4sSJPMsHDhxoBgQEXKSD//9627Zta/r5+ZlBQUFmq1atzM8//zzPmNmzZ5vNmjUzfXx8zMqVK5t33XWXefjwYcfjCQkJ5rBhw8wGDRqYAQEBZnBwsNm6dWvzyy+/zLOeY8eOmT169DADAwNNoESvZpvbQ2cf5/d60aJF5s0332xGRESYXl5eZmBgoNmuXTtz2rRpeaaNm6Z5wenU/3xtUVFR+aZL//zzz4V+/sCBAwscO23atOJrlIgLGKZZwmfRibipmTNnMmjQIAYMGJDnKrIiImItHQYS+ds999zD0aNHGT16NDVq1OCVV16xuiQREQG0Z0VERETcmqYui4iIiFtTWBERERG3prAiIiIibk1hRURERNyaW88GstvtHDlyhMDAwCJfZltERESsYZomKSkpREREYLNd/n4R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euKJJ1i3bh0AJ0+e1BTlQlCHRERESsjcuXN54403AFizZg2VK1e2uKLSQWFFRESkBOzZs4c+ffoA8NZbb9G6dWuLKyo9FFZERERc7Ny5c9StWxeAPn36MHz4cIsrKl0UVkRERFzIbrfj5+cHQGRkJHPmzLG4otLHpWFl/PjxtGzZksDAQMLCwujduze7du1y5SZFRETcSkhICACGYXDw4EGLqymdXBpWli9fzrBhw1izZg2xsbFkZmbStWtX3UlSRETKhRtuuIHTp08DmqJ8OTxdufKffvopz/fTp08nLCyMDRs2cN111+Ubn56eTnp6uuP75ORkADIzMx23zHZXufW5e50lTX1xTn3JTz1xTn1xrjT05ZVXXmHNmjX4+fnx559/Ypqmy+t1l74U9/YN0zTNYl3jBezevZsrrriCrVu3EhMTk+/xsWPHMm7cuHzLZ82ahb+/f0mUKCIiIpcpLS2N/v37k5SUVCx3kC6xsGK327nllltITExk5cqVTsc427MSGRlJQkKC298uOzMzk9jYWLp06YKXl5fV5bgN9cU59SU/9cQ59cU5d+7LkSNHaNiwIQDPP/88Tz75ZIlt2136kpycTEhISLGFFZceBjrfsGHD2LZtW4FBBcDHxwcfH598y728vNzuzViQ0lRrSVJfnFNf8lNPnFNfnHO3vmRkZBAdHQ1At27deOaZZyypw+q+FPe2SySsPPLII8yfP58VK1ZQo0aNktikiIhIicv9gzs0NDTfeZty6VwaVkzTZPjw4XzzzTcsW7aMWrVquXJzIiIilomIiHB8HR8fb2ElZY9Lw8qwYcOYNWsW8+bNIzAwkGPHjgEQHBzsuECOiIhIadezZ0+OHj0KkOfcSykeLr3OypQpU0hKSqJjx45Uq1bN8TF79mxXblZERKTEvP7668yfPx+A/fv34+3tbXFFZY/LDwOJiIiUVb/88gujRo0C4PvvvycqKsriisom3RtIRETkEsTHxzsucDp69GhuvvlmiysquxRWREREiigrK4vw8HAA2rVrx/jx4y2uqGxTWBERESmi3CnKQUFBF7x+mBQPhRUREZEiqFOnDna7HcBxk0JxLYUVERGRQurfvz979+4FIDU1FZtN/42WBHVZRESkEKZMmcLnn38OwM6dO3WD3RKksCIiInIR69ev5+GHHwbgiy++oH79+hZXVL4orIiIiFxAYmIiLVu2BHLudXfHHXdYXFH5o7AiIiJSALvdTqVKlQBo1qwZb7/9tsUVlU8KKyIiIgXw9fV1fN64caPF1ZRfCisiIiJOXHnllWRmZgI5M3/EOgorIiIi//DAAw+wbds2AJKSkjRF2WLqvoiIyHk+/fRTpk6dCsCmTZsICgqyuCJRWBEREfnb9u3bufvuuwH44IMPaNq0qbUFCaCwIiIiAsCZM2eIiYkBYODAgQwdOtTiiiSXwoqIiJR7drudwMBAAOrVq8f06dOtLUjyUFgREZFyL/e8FA8PD3bt2mVxNfJPCisiIlKuXXPNNY6pyenp6RZXI84orIiISLk1cuRIfvvtNwBOnDiBh4eHxRWJMworIiJSLn3zzTdMmjQJgFWrVhESEmJxRVIQhRURESl39u7dy7/+9S8A3njjDdq0aWNxRXIhCisiIlKunDt3jjp16gDwr3/9ixEjRlhbkFyUwoqIiJQbdrsdPz8/AGrUqMHcuXMtrkgKQ2FFRETKjdDQUMfXhw4dsrASKQqFFRERKRc6derEqVOnABx3U5bSQWFFRETKvLFjx7J06VIA4uLi8PT0tLgiKQqFFRERKdMWLVrEuHHjAFi8eDEREREWVyRFpbAiIiJlVlxcHN26dQPgxRdfpFOnThZXJJdCYUVERMqkjIwMatSoAUDXrl157rnnLK5ILpXCioiIlEk+Pj4AhISEsHDhQourkcuhsCIiImVO9erVHV+fOHHCwkqkOCisiIhImdK7d2+OHDkCwNmzZy2uRoqDwoqIiJQZ//3vf5k3bx4A+/btw9fX1+KKpDi4NKysWLGCnj17EhERgWEYfPvtt67cnIiIlGMrV67kySefBGDevHlER0dbW5AUG5eGldTUVK666iomT57sys2IiEg5l5CQQPv27QEYNWoUt9xyi8UVSXFy6SX8brzxRm688UZXbkJERMq5rKwsxz1/2rZty4QJEyyuSIqbW11vOD09nfT0dMf3ycnJQM49HNz9Pg659bl7nSVNfXFOfclPPXFOfXHu/L6EhYXh5+dHhQoVWLZsWbnulbu8X4p7+4ZpmmaxrrGgDRkG33zzDb179y5wzNixYx2XRD7frFmz8Pf3d2F1IiIiUlzS0tLo378/SUlJBAUFXfb63CqsONuzEhkZSUJCQrG8WFfKzMwkNjaWLl264OXlZXU5bkN9cU59yU89cU59cS63L/feey9nz57l2LFj+Pn5WV2W5dzl/ZKcnExISEixhRW3Ogzk4+PjuOLg+by8vErND2lpqrUkqS/OqS/5qSfOqS95TZs2jfDwcM6ePcvGjRvd/g/akmb1+6W4t63rrIiISKmyceNGRowYAcBHH31EgwYNrC1IXM6le1bOnDnD7t27Hd/v27ePzZs3U7lyZWrWrOnKTYuISBmUmJhI8+bNHYd8+vTpY3FFUhJcGlbWr1/P9ddf7/j+iSeeAGDgwIFMnz7dlZsWEZEyxm63U6lSJQCaNGlicTVSklwaVjp27EgJnb8rIiJlXO7eFB8fH3755RcWLFhgcUVSUnTOioiIuL0mTZqQkZEB5EyLlfJFYUVERNzaQw89xNatWwFISkrCZtN/XeWN/sVFRMRtffbZZ7z33nsAbNq0SVOUyymFFRERcUs7duxgwIABALz//vs0bdrU2oLEMgorIiLidlJTU2nUqBEA99xzD/fff7/FFYmVFFZERMSt2O12KlSoAMAVV1zBjBkzLK5IrKawIiIibiU4OBgADw8P/vzzT4urEXegsCIiIm6jbdu2nDlzBoBz585ZXI24C4UVERFxC0899RSrV68G4MSJE3h6utW9dsVCCisiImK5efPmMXHiRABWrlxJSEiIxRWJO1FYERERS+3bt4/evXsDMGnSJNq1a2dtQeJ2FFZERMQy586do3bt2gD07t2bxx9/3OKKxB0prIiIiGVyb05YvXp1vvnmG4urEXelsCIiIpY4/7yUw4cPW1iJuDuFFRERKXFdunTh5MmTAKSnp1tcjbg7hRURESlR//nPf1i8eDEAcXFxeHt7W1yRuDuFFRERKTGxsbGMGTPG8XVERITFFUlpoLAiIiIl4siRI3Tt2hWAcePG0blzZ4srktJCYUVERFwuIyOD6tWrA9C5c2deeOEFiyuS0kRhRUREXM7HxweAKlWqEBsba3E1UtoorIiIiEvVqFHD8XVCQoKFlUhppbAiIiIuc+uttxIXFwfA2bNnLa5GSiuFFRERcYlJkybx7bffArB37158fX2tLUhKLYUVEREpdr/++isjR44E4Ntvv6VWrVoWVySlmcKKiIgUq4SEBK699loAnnrqKXr16mVxRVLaKayIiEixycrKIjQ0FIA2bdrw2muvWVyRlAUKKyIiUmxyz0upUKECq1atsrgaKSsUVkREpFjUq1eP7OxsAJKSkiyuRsoShRUREbls99xzD3/99RcAqamp2Gz670WKj95NIiJyWaZOnconn3wCwB9//IG/v7/FFUlZo7AiIiKXbOPGjTzwwAMAfPrppzRs2NDiiqQsUlgREZFLkpycTPPmzQF48MEHueuuuyyuSMoqhRURESkyu91OcHAwAE2aNGHKlCkWVyRlWYmElcmTJxMdHY2vry+tW7dm7dq1JbFZERFxkdzzUry9vfn9998trkbKOpeHldmzZ/PEE08wZswYNm7cyFVXXUW3bt2Ij4939aZFRMQFmjZtSnp6OqCbE0rJcHlYmTRpEvfddx+DBw+mUaNGvPfee/j7+/Pxxx+7etMiIlLMhg0b5tiTkpiYqCnKUiI8XbnyjIwMNmzYwDPPPONYZrPZ6Ny5M6tXr843Pj093ZHWIefkLYDMzEwyMzNdWeply63P3essaeqLc+pLfuqJc+7Ul6+++opp06bh5+fHihUr8Pf3t6wud+qLO3GXvhT39g3TNM1iXeN5jhw5QvXq1Vm1ahVt2rRxLB81ahTLly/nt99+yzN+7NixjBs3Lt96Zs2apXn7IiIipURaWhr9+/cnKSmJoKCgy16fS/esFNUzzzzDE0884fg+OTmZyMhIunbtWiwv1pUyMzOJjY2lS5cueHl5WV2O21BfnFNf8lNPnHOHvpw9e5aqVasCcMcddzB16lRL6jifO/TFHblLX3KPjBQXl4aVkJAQPDw8OH78eJ7lx48fd7zxz+fj44OPj0++5V5eXqXmzViaai1J6otz6kt+6olzVvXl/CnKderUYdq0aSVew4Xo/eKc1X0p7m279Mwob29vmjdvzpIlSxzL7HY7S5YsyXNYSERE3FNuULHZbOzevdviaqS8cvlhoCeeeIKBAwfSokULWrVqxf/+9z9SU1MZPHiwqzctIiKXoV27dpw5cwYgz+QHkZLm8rByxx13cOLECV544QWOHTtG06ZN+emnnwgPD3f1pkVE5BI9/fTTrFq1CoATJ07g6elWpzhKOVMi775HHnmERx55pCQ2JSIil+m7777jtddeA+CXX34hJCTE4oqkvNPVfERExGH//v306tULgIkTJ3LttddaXJGIwoqIiPzt3Llz1KpVC4BevXoxcuRIiysSyaGwIiIiAPj5+QEQERHBt99+a20xIudRWBEREUJDQx1fx8XFWViJSH4KKyIi5VzXrl1JSEgANEVZ3JPCiohIOfbSSy8RGxsLwKFDh/D29ra4IpH8FFZERMqpJUuW8PzzzwPw008/UaNGDYsrEnFOYUVEpBw6cuQInTt3BmDMmDF069bN4opECqawIiJSzmRlZVG9enUAOnXqxNixY60tSOQiFFZERMqZ3DviVq5cmcWLF1tcjcjFKayIiJQjkZGRjq9PnDhhYSUihaewIiJSTtx2220cPnwYgLNnz2Kz6b8AKR30ThURKQfefPNNvv76awD27NmDr6+vxRWJFJ7CiohIGbd69WpGjBgBwNdff03t2rWtLUikiBRWRETKsISEBNq2bQvAyJEjufXWWy2uSKToFFZERMqorKwsxz1/WrduzcSJEy2uSOTSKKyIiJRRueelBAQEsGbNGourEbl0CisiImVQvXr1yM7OBiA5OdniakQuj8KKiEgZM3DgQP766y8AUlJSNEVZSj29g0VEypCPPvqImTNnArBt2zYqVKhgcUUil09hRUSkjNi8eTNDhw4F4JNPPqFx48YWVyRSPBRWRETKgOTkZJo1awbA/fffz4ABAyyuSKT4KKyIiJRydrud4OBgAK688kref/99iysSKV4KKyIipVxAQAAAXt7ebNmyxeJqRIqfwoqISCnWrFkzzp07B8C5s2ctrkbENRRWRERKqeHDh7N582YATp8+rSnKUmbpnS0iUgrNnj2bd955B4B169ZRsWJFawsScSGFFRGRUmbXrl3ceeedAEyZMoUWLVpYXJGIaymsiIiUImlpaTRo0ACA/v378+CDD1pckYjrKayIiJQSdrvdMfOndu3afPbZZxZXJFIyFFZEREqJ3PNSbDYbe/bssbYYkRKksCIiUgp0796dlJQUANLT0y2uRqRkKayIiJQCq1evBuD48eN4enpaXI1IyVJYERFxYz/99JPj619++YWwsDALqxGxhsvCyssvv0zbtm3x9/fX/H8RkUtw4MAB7rjjDgBeeuklrr32WosrErGGy8JKRkYGffv25aGHHnLVJkREyqxz584RHR3t+H748OHWFSNiMZcd+Bw3bhwA06dPd9UmRETKLD8/PwCqVq1qcSUi1nOrs7TS09PznOWenJwMQGZmJpmZmVaVVSi59bl7nSVNfXFOfclPPfl/derUcYSVbdu2ERsbq778g94vzrlLX4p7+4ZpmmaxrvEfpk+fzogRI0hMTLzo2LFjxzr2yJxv1qxZ+Pv7u6A6ERERKW5paWn079+fpKQkgoKCLnt9RdqzMnr0aCZMmHDBMTt27HBcCrqonnnmGZ544gnH98nJyURGRtK1a9diebGulJmZSWxsLF26dMHLy8vqctyG+uKc+pKfegITJ07kxRdfBHJ+l0ZERKgvBVBfnHOXvuQeGSkuRQorI0eOZNCgQRccU7t27UsuxsfHBx8fn3zLvby8Ss2bsTTVWpLUF+fUl/zKa0+WLl3Ks88+C8CPP/5IVFRUnsfLa18uRn1xzuq+FPe2ixRWQkNDCQ0NLdYCRETKu2PHjtGpUycAXnjhBbp3725xRSLuxWUn2B48eJBTp05x8OBBsrOz2bx5MwB169alQoUKrtqsiEipkpWVRbVq1QC4/vrrnZ63J1LeuSysvPDCC8yYMcPxfbNmzQD4+eef6dixo6s2KyJSqnh7ewNQqVIlli5danE1Iu7JZReFmz59OqZp5vtQUBERyVGzZk1yJ2QmJCRYXI2I+9K9gURELNCnTx8OHToEwNmzZ7HZ9OtYpCD66RARKWFvv/02c+fOBWD37t34+vpaXJGIe1NYEREpQatXr+bRRx8F4KuvvqJOnToWVyTi/hRWRERKyKlTp2jbti0Ajz/+OLfddpvFFYmUDgorIiIlwG63U6VKFQBatmzJpEmTLK5IpPRQWBERKQHef1+d29/fn7Vr11pcjUjporAiIuJiDRo0IDsrC4CUlBSLqxEpfRRWRERcaPDgwezatQvICSqaoixSdPqpERFxkY8++ojp06cDsHXrVt1qROQSKayIiLjAli1bGDp0KAAzZswgJibG4opESi+FFRGRYpacnMxVV10FwH333cc999xjcUUipZvCiohIMbLb7QQHBwPQuHFjpk6danFFIqWfwoqISDEKCAgAwMvLi23btllcjUjZoLAiIlJMmjdvzrlz5wAcn0Xk8imsiIgUg0cffZSNGzcCcPr0aU1RFilG+mkSEblMs2fP5u233wZg3bp1VKxY0dqCRMoYhRURkcvw119/ceeddwIwefJkWrRoYXFFImWPwoqIyCVKS0ujXr16ANx55508/PDDFlckUjYprIiIXAK73e6Y+VOrVi0+//xziysSKbsUVkRELkGlSpUAMAyDvXv3WlyNSNmmsCIiUkTXXXcdycnJAGRkZFhcjUjZp7AiIlIEzz77LL/88gsAx48fx9PT0+KKRMo+hRURkUKaP38+48ePB2D58uWEhYVZXJFI+aCwIiJSCAcOHKBnz54ATJgwgeuuu87iikTKD4UVEZGLyMjIIDo6GoAePXowatQoawsSKWcUVkRELsLHxweAqlWrMn/+fIurESl/FFZERC4gPDzc8fXRo0ctrESk/FJYEREpwI033kh8fDwA6enpFlcjUn4prIiIODF+/Hh++uknAA4ePIi3t7fFFYmUXworIiL/sGzZMp599lkAFixYQGRkpMUViZRvCisiIuc5duwY119/PQDPPfccN954o8UViYjCiojI37KysqhWrRoAHTp04MUXX7S4IhEBhRUREYfc81IqVqzIsmXLrC1GRBxcFlb279/PkCFDqFWrFn5+ftSpU4cxY8bopl8i4paio6MxTROAkydPWlyNiJzPZXfg2rlzJ3a7nffff5+6deuybds27rvvPlJTU5k4caKrNisiUmS33347Bw4cAODs2bPYbNrpLOJOXBZWunfvTvfu3R3f165dm127djFlyhSFFRFxG++88w5z5swB4K+//sLX19fiikTkn0r03uZJSUlUrly5wMfT09PzXHgpOTkZgMzMTDIzM11e3+XIrc/d6yxp6otz6kt+VvRk/fr1jBo1Cj8/P2bOnElUVJTb/ZvoveKc+uKcu/SluLdvmLkHaV1s9+7dNG/enIkTJ3Lfffc5HTN27FjGjRuXb/msWbPw9/d3dYkiIiJSDNLS0ujfvz9JSUkEBQVd9vqKHFZGjx7NhAkTLjhmx44dNGjQwPF9XFwcHTp0oGPHjnz44YcFPs/ZnpXIyEgSEhKK5cW6UmZmJrGxsXTp0gUvLy+ry3Eb6otz6kt+JdkTu91OpUqVAGjWrJlbz/zRe8U59cU5d+lLcnIyISEhxRZWinwYaOTIkQwaNOiCY2rXru34+siRI1x//fW0bduWqVOnXvB5Pj4+jrubns/Ly6vUvBlLU60lSX1xTn3JryR64uXlRVZWFn5+fvz6668u3VZx0XvFOfXFOav7UtzbLnJYCQ0NJTQ0tFBj4+LiuP7662nevDnTpk3TGfYiYrmGDRuSlZUFwJkzZyyuRkQKw2Un2MbFxdGxY0eioqKYOHEiJ06ccDxWtWpVV21WRKRA9957Lzt37gQgJSVFf0CJlBIuCyuxsbHs3r2b3bt3U6NGjTyPldA5vSIiDtOmTWPatGkAbN26lQoVKlhckYgUlsv+rBg0aBCmaTr9EBEpSVu2bOHee+8FYPr06cTExFhckYgUhfaBikiZdubMGa666ioAhgwZwsCBAy2uSESKSmFFRMosu91OYGAgAI0aNbrgpRNExH0prIhImZV7Xoqnpyfbt2+3uBoRuVQKKyJSJrVo0YKzZ88C5LnYpIiUPgorIlLmPPbYY2zYsAGAU6dOaYqySCmnn2ARKVO+/PJL3nrrLQDWrl3ruKy+iJReCisiUmb89ddf3HHHHQC8/fbbtGzZ0uKKRKQ4KKyISJmQlpZGvXr1ALj99tt55JFHLK5IRIqLwoqIlHp2u52AgAAAoqKimD17tsUViUhxUlgRkVKvcuXKABiGwf79+60tRkSKncKKK2RmwpIl8NRT0LIlVKwIXl5QtSrccgv88IPVFYqUGR06dCApKQmAjIwMi6sREVdw2Y0My7Xly6FLl5yvq1aFa6+FgAD44w/4/vucj/vvh/feA8OwtlaRUuzf//43K1asAODo0aN4eupXmkhZpD0rrmCzwW23wYoVcPQozJ8Ps2fD1q3wxRfg4QFTp8Inn1hdqUiptWDBAl555RUAfv75Z6pWrWpxRSLiKgorrnDDDfDVV9C+ff7H7rgDBg3K+XrmzBItS6SsOHjwID169ADg1VdfpWPHjtYWJCIuVa7Dit1uWrPhZs1yPh86ZM32RUqxjIwMoqKiALjpppt4+umnLa5IRFytXB3g3RaXxJz1h1i7/xS748+QmW3i5WFQN6wCraIr07dFJDHVg11fyF9/5XyuVs312xIpY3x8fAAIDw/nB52sLlIulIuwsj8hlVFzt7B23yk8bAbZ5+1Rycw22XE0hT+Pn2HG6gO0qlWZ125rQnRIgGuKOXYMpk/P+fq221yzDZEy6vzzUo4dO2ZhJSJSksr8YaB5m+Po+sYKNhw4DZAnqJwvd/mGA6fp+sYK5m2OK/5isrJgwABISoIrr4QHHij+bYiUUT169OD48eOA7qIsUt6U6T0r8zbHMeKLzRTlzJRsu0k2JiO+2AxAr6bVi6+gBx/Muf5KlSo5J+B6exffukXKsFdffZUFCxYAcODAAbz1syNSrpTZPSv7ElJ5as6WIgWV85nAU3O2sD8htXgKeuwx+OgjqFQJYmPh73uYiMiFrVixgmeeeQaAH374gZo1a1pckYiUtDIbVp6eu4Vs8/Jm+2SbJqPmbrn8YkaOhLfeyrmS7aJF/z8bSEQu6Pjx43To0AGAZ599lptuusniikTECmUyrGw9nMTafacKPD+lsLLtJmv3nWJbXNKlr2TUKJg0CYKDc4JKixaXVZNIeZGVleU4ofa6667j5ZdftrgiEbFKmQwrX204hKeteC5j72EzmLP+Eq+HMno0vP56TlCJjc25T5CIFErueSnBwcEsX77c4mpExEplMqys3X+KrGK64Fu23WTd/tNFf+Jzz8GECTmHfhRURIqkVq1amH8fxj116pTF1YiI1crkbKDd8WcuOiYr+QT2syl4h9e+6Ni/4lOKVsB330HuLuu6dWHyZOfjQkJg4sSirVukjBs8eDD79+8HIDU1FZutTP5NJSJFUObCit1ukpl98b0qJxe8ybkDm8EwCLiyM/51r8G3Zgw2n/wXg8vMNrHbTWyFPbR0/l+C69fnfDgTFaWwIvIPX3/9NQB//vkn/v7+FlcjIu6gzIUVm83Ay8O4aGDxb9A+J6yYJqlbYkndEgsYeEfUwzeqKX7RV+ET0RDD0wsvD6PwQQVyblSYe7NCESmUjRs3Or7+8ssvueKKKyysRkTcSZkLKwB1wyqw4+iFD90ENu1G9pmTJP0667ylJpnx+8k8dYTk1bMxPH3wqdGImjGt2LAhnKZNm+Lh4eHa4kXKoVOnTnH99dfz+eef8+CDD9K3b1+rSxIRN1ImDwa3iq6MRyH2hAS3vQPfqKbY/CsSckvOnVvNrHTMcyl4BIUR3KYvGDZ2L5xBixYtqFwlhH/9619MmTKFP//803ECoIhcOrvdTpUqVRzfT5gwwcJqRMQdlcmw0rdFZKGusWLYPAjp+SSGzUbKxvnUfGoeYX3HAZCdHE/iL5+SnXqaiIc+Jrz/qxgxN7Jw/S6GDR9O/fr1iagRyaBBg/j0008d9ywRkaLx9fXN81lE5J/KZFiJqR5Mq1qF27viEVCRkFtGkR63g8RfPsGvdnOinp5P6L+eAyAzfi+H3+pP4rLpBLW+jdD+r1Fj+OeE9RlDakQLvlz4C3fffTf1/r58/lNPPcW8efNITEx05UsUKRMaNWpEZmYmAEePHrW4GhFxV2XynBWA125rQtc3VpBdiLsD+UbGULHDPSQum45Pjcb412mJ/xXXEPX0fFJ3/ELCdxNIP7KTQ5P64BvVhLA+Y/Gr0xK/OjnXTslOTYSj2wGYOec73nzzTWw2G02vbk63Lp3p3Lkzbdu21V+OIucZOnQoO3bsACA5OVlTlEWkQGX2t0N0SACv921CYefwBLX6F351W3Fy/n/JSop3LA9o2J6op+dTpcfjAJw7sIWD//0X8V+Nw8zO+YvQI6Ai/vXbAhA66C0iHviQil2HsTPVl/++PYVOnToRXLES19/QiVdffZV169aRnZ1drK9XpDSZMWMGH330EQBbtmwhMDDQ4opExJ2V2bAC0Ktpdf53Z1O8PWwXPSRkGDaq3PQ4Nm9/Tsx71RFEclWI6UTU0/Op3O0RAM7uWcfBibdy4ttXMe15g4dXxaoEXtWN0FuepurDM6k2+G0C2g1g7cFknhv7H1q1akWlylXo1bs3kydPZufOnTpZV8qNbdu2Mejvqf0ff/wxV155pbUFiYjbc2lYueWWW6hZsya+vr5Uq1aNu+++myNHjrhyk/n0alqdRY9fR/OoSgAFhhYPm4GHXyAdHnqF7BP7OP3zNKfjApt2J+rp+VTqdD8AabtWcvD1Xpz66R2n4w3DhndYLYJa9ia0z1iqD/+c8Ltew3ZlDxZv2sOjj42gYcOGVI2ozsCBA5k5cyZxcXHF8MpF3M+ZM2cc4WTw4MEMHjzY4opEpDRw6Tkr119/Pc8++yzVqlUjLi6OJ598kj59+rBq1SpXbjaf6JAAvnygDdvikpiz/hDr9p/mr/gUMrNNvDwMrggLpGV0Jfq2iCSmejDv1DjL8OHD8anRiIAG1zpdZ1CLWwhs3pPktXNJXDad1B0rgIc4vWQqfh3uwzCc50DDwxPfGo3wrdEI6I894xzph7dzbv9m5iz6lZkzZwJQp249unfrQqdOnejYsSOVKlVyUXdESobdbncc7mnQoAEff/yxxRWJSGnh0rDy+OOPO76Oiopi9OjR9O7dm8zMTLy8vFy5aadiqgcTUz3Y8X1Bl9AfNmwYy5YvZ978t/AOr41XpQin6zMMg+DWfQhqdRvp678C4MyWxZz47XsCm99CpU5DCwwtuWzevvjVbo5f7eYAZCYcImnt1+zZ/jOTJ09m8uTJ3Hf/A0x9/71LfdkibqFChQoAeHp6Ok6sFREpjBKbDXTq1Ck+++wz2rZtW2BQSU9PJz093fF9cnIyAJmZmY7pjcWtoPNcp77/PtvbX0f8ov8R0PdFDC/vC64nuO1tgJ3Qtn04seorsv6I5cQfsQS27E3Fdv3AyB+K7KmJZMTvJf34XrLi95GdsI/0pAQAQkOq0LRpU5pf3YyePXu67PW7Wm7dpbV+VylvfenYsSMAfn5+nD592unrLm89KSz1xTn1xTl36Utxb98wXXxm59NPP80777xDWloa11xzDfPnz89ztcrzjR07lnHjxuVbPmvWLN3QTEREpJRIS0ujf//+JCUlERQUdNnrK3JYGT169EUvh71jxw4aNGgAQEJCAqdOneLAgQOMGzeO4OBg5s+fj+FkT4OzPSuRkZEkJCQUy4u9FJ988gmPPPIIlbsPJ6Bh+wLH+dhMXmxh5/n1BmlJp8mI30f6sT2c3bGcrJSEPGM7dOhA8+bNadq0KU2bNqVmzZpO+1EWZGZmEhsbS5cuXSw59Oeuyktf5s2bxz333APAkiVLaNGiRYFjy0tPikp9cU59cc5d+pKcnExISEixhZUiHwYaOXKkY9phQWrXru34OiQkhJCQEOrVq0fDhg2JjIxkzZo1tGnTJt/zfHx88PHxybfcy8vLsqYPHjyYn5ct4/PZbxFWORrvkJqOx0zTJDslgYxju7GdPgAt+nDw/YdIOpEz46li5Spc06I5za++ms8//5wDBw4A8NNPPxEQEMBLL71kyWuygpX/hu6sLPdlz549jhsSvvXWW05/5p0pyz25HOqLc+qLc1b3pbi3XeSwEhoaSmho6CVtzG63A+TZe+LuDMPgvSlTWLd+Awe+e5XAdgNIP76HrOO7yYrfQ8aZRAAiakQCfXjsoaE0a9aMq6++msjISMcek/Hjx5OWlkb9+vU5fPgwc+fOxTAM7r77bscMIJGy4ty5c9StWxeAvn37Mnz4cIsrEpHSzGXXWfntt99455132Lx5MwcOHGDp0qX069ePOnXqFPovLHcREBDAN3O/wkg9yYlvX8F7zzI6NAhn9BOP8u2333Lo0CH27dkNwHPPPUfv3r2dHtrx9/fn0KFDpKSkEBYWBuQcZjIMgwcffLDEX5eIK9jtdvz8/ICcWYBffvmlxRWJSGnnstlA/v7+fP3114wZM4bU1FSqVatG9+7dee6555we6nF3DRs2ZMP6dQQHBxMRkX8qc1HOfK5QoQLHjx8nMTGR2rVrc/r0ad5//33ef/99RowYwRtvvFGcpYuUqNwT6A3DYP/+/dYWIyJlgsv2rFx55ZUsXbqUkydPcu7cOfbt28eUKVOoXr26qzbpcg0bNnQaVC5VxYoVOXXqFCdOnHBcLOt///sfhmHw73//u9i2I1JSrr/+escdxzMyMqwtRkTKjDJ9b6DSIiQkhOTkZOLi4hy7z1955RUMw+Dll1+2uDqRwnn++edZtmwZAEePHsXTs8ze1F1ESpjCihuJiIggLS2NAwcO4O2dcxG65557DsMwmDRpksXViRTsxx9/dMxuW7JkCVWrVrW4IhEpSxRW3FDNmjVJT0/nzz//xMPDA8iZMm4YBlOmTLG4OpG8Dh06xE033QTk7BG84YYbLK5IRMoahRU3dsUVV5CVlcW2bdscM4sefvhhDMNgxowZFlcnknNeSs2aOdce6t69O88884zFFYlIWaSwUgo0btwYu93Ohg0bHMsGDRqEYRjMnj3bwsqkvMud2RcaGsqPP/5ocTUiUlYprJQiV199NaZpsmrVKseyO++8E8Mw+O677yysTMqjatWqOb6Oj4+3sBIRKesUVkqhNm3aYJomP//8s2NZr169MAyD2NhYCyuT8qJnz54cO3YMKF1XpBaR0klhpRTr2LEjpmmyYMECx7KuXbtiGAYrVqywsDIpy1577TXmz58PwP79+x0z10REXEVhpQy48cYbMU2Tr7/+2rGsQ4cOGIbBunXrLKxMypoVK1bw9NNPA/D9998TFRVlcUUiUh4orJQht956K6Zp8umnnzqWtWrVCsMw2Lx5s3WFSZkQHx9Phw4dAHjmmWe4+eabLa5IRMoLhZUy6K677sI0TT788EPHsmbNmuHh4cGOHTssrExKq6ysLMLDwwFo3749r7zyisUViUh5orBShg0ZMgTTNHn77beBnLvhNmrUCC8vL/bu3WtxdVKa5E5RDgoK0vlQIlLiFFbKgUceeQTTNHnttdeAnL+S69Spg4+PD4cPH7a4OnF3tWvXxm63A3D69GmLqxGR8khhpRx56qmnME2TsWPHAjlXH42MjCQgIMAxDVXkfP369WPfvn0ApKamYrPpV4aIlDz95imHxowZg2majBo1CoC0tDSqVatGcHAwp06dsrg6cRdTpkzhiy++AGDXrl34+/tbXJGIlFcKK+XYhAkTME2T4cOHA5CcnEyVKlWoUqUKycnJFlcnVlq/fj0PP/wwAF988QX16tWzuCIRKc8UVoS33noL0zQZOnQoAKdOnSI4OJhq1aqRlpZmcXVS0hITE2nZsiWQc77THXfcYXFFIlLeKayIwwcffIBpmvTv3x+AY8eOERAQQM2aNTl37pzF1UlJsNvtVKpUCciZ7p47k0xExEoKK5LPZ599hmma3HrrrQAcOnQIPz8/rrjiCjIyMiyuTlzJ19fX8Xnjxo0WVyMikkNhRQr09ddfk52dTbdu3QDYvXs3Pj4+xMTEkJWVZXF1UtxiYmLIzMwEcmb+iIi4C4UVuSCbzcZPP/1Edna241Lr27dvx8vLixYtWjiuvyGl2/3338/27dsBSEpK0hRlEXEr+o0khWKz2Vi2bBnZ2dm0atUKgA0bNuDh4UG7du0UWkqxmTNn8sEHHwCwefNmgoKCLK5IRCQvhRUpEpvNxm+//UZmZiZNmjQBYNWqVXh4eNC5c2eFllJm+/btDBw4EIAPP/yQq666yuKKRETyU1iRS+Lp6cnvv/9Oeno69evXB2DJkiV4eHjQs2dPhZZS4MyZM8TExAAwaNAghgwZYnFFIiLOKazIZfH29mbnzp2cO3eO6OhoAObPn4+Hhwe33367tcVJgex2O4GBgQDUr1+fadOmWVyRiEjBFFakWPj4+LBv3z5SU1OJiIgAYM6cOQQHB1tcmTiTG1Q8PDzYuXOnxdWIiFyYwooUK39/f+Li4khJSSE0NNSxPDg42HH5drFW69atHVcm1nVzRKQ0UFgRl6hQoQLx8fEcPHjQsWzKlCkYhsHIkSMtrKx8GzlyJGvXrgXg5MmTmqIsIqWCflOJS+UeBtq9ezcBAQEATJo0CcMweP75560srdyZO3cukyZNAmDNmjVUrlzZ4opERApHYUVKRGhoKGfOnCEuLs5xSfeXXnoJwzAYP368xdWVfXv27KFPnz4AvPnmm7Ru3driikRECk9hRUpUREQEZ8+eZf/+/Xh5eQHw7LPPYhgG//vf/6wtrow6d+4cdevWBaBPnz48+uijFlckIlI0CitiiaioKDIyMti5cyceHh4APP744xiGwdSpUy2uruyw2+34+fkBEBkZyZw5cyyuSESk6BRWxFL169cnKyuLrVu3YhgGAA888ACGYTBz5kyLqyv9QkJCADAMI8/JziIipUmJhJX09HSaNm2KYRhs3ry5JDYppUxMTAx2u51169Y5lg0cOBDDMLQ34BJ16tSJ06dPA5qiLCKlW4mElVGjRjkuFCZyIS1atMA0TVauXOlYdvvtt2MYBvPnz7ewstJlzJgxLF26FICjR4/i6elpcUUiIpfO5WHlxx9/ZNGiRUycONHVm5IypF27dpimyZIlSxzLevbsiWEYeZZJfgsXLuQ///kPkHO/pqpVq1pckYjI5XHpn1vHjx/nvvvu49tvv8Xf3/+i49PT00lPT3d8n5ycDEBmZiaZmZkuq7M45Nbn7nWWtMvtS/v27cnIyGDRokX07dsXyAktAD/99BNt2rQpnkJLmKveL0eOHOHWW2/Fz8+P559/nvbt25ea96R+hpxTX5xTX5xzl74U9/YN0zTNYl3j30zT5KabbqJdu3Y899xz7N+/n1q1arFp0yaaNm3q9Dljx45l3Lhx+ZbPmjWrUGFHRERErJeWlkb//v1JSkoiKCjostdX5LAyevRoJkyYcMExO3bsYNGiRXz55ZcsX74cDw+PQoUVZ3tWIiMjSUhIKJYX60qZmZnExsbSpUsXx/VDxHV9mT17Nvfff7/je8Mw+PXXX2ncuHGxbcOVXNGX3KsFh4SEsGfPnmJZZ0nSz5Bz6otz6otz7tKX5ORkQkJCii2sFPkw0MiRIxk0aNAFx9SuXZulS5eyevVqfHx88jzWokUL7rrrLmbMmJHveT4+PvnGA3h5eZWaN2NpqrUkFXdfBgwYwIABA/jwww+57777AGjWrBk2m40//viD+vXrF9u2XKm4+pJ7sT2g1E9R1s+Qc+qLc+qLc1b3pbi3XeSwEhoamuduugV56623eOmllxzfHzlyhG7dujF79mxd6luKzdChQxk6dChvvvkmI0aMwG6306BBAzw9Pdm9ezdRUVFWl+hyvXr14ujRo0DO1WpFRMoal80GqlmzJjExMY6PevXqAVCnTh1q1Kjhqs1KOfXYY49hmqbjPkNZWVlER0fj6+vL4cOHLa7Odf773//y3XffAbB//36neyZFREo7XcFWypTRo0djmqbjjs7p6elERkZSoUIF4uPjLa6ueK1cuZInn3wSgO+++65c7EUSkfKpxMJKdHQ0pmkWeHKtSHH6z3/+g2majv/MU1NTCQ8Pp2LFipw6dcri6i5ffHw87du3B3ICWu50bhGRskh7VqRMe/311zFNk4cffhiApKQkqlSpQkhIiOM6PpcrLS2N1atXs23btouO/fzzL+jStatjJtObb77J9OnTWbBgAevXr+fgwYMXPe8kKyuL8PBwIOfiebmHvkREyipdg1vKhcmTJzN58mTuvfdepk2bxsmTJwkODqZatWrs3r270NfxSU1NZfPmzWzcuJENGzawZu16/tq1A7vdTmhYOFt+33zBK8a+O2UKq9ZvplLkFfTu3ZsXX32N5JMn8o3zr1CBkJBQwsPDqRYeTnh4GOHh4YSFhfHoo48C4Onpyddff012drbjztUiImWRwoqUKx9//DEff/wx/fr144svvuDo0aMEBAQQFRXFzp078fX1dYw9c+YMmzdvZsOGDY5gsuevXdjtdmyeXviG1cIWVpuKXa7Hq3J1Ts9/nTvu7MfSJYsLDA/Nml7Fhp37qNJnLJBN1Qc+pmJGFtlpSdjTkshOTfz760QS05I4mZrEtu1xGBt2YE9NJD3l/w9h5e5hsdlsVKxchdDQUKqFh1O1ak6oyf3IDTm5HwEBAY47XIuIlAYKK1Iuff7553z22Wf861//Yt68eRw4cAA/Pz+io6Np27Yta9dvZM9fuzBNE5unN77h0dhC61Cxa2d8qtbFK6Qmhkfe6whUuvkpfvni34wZMybPtP3zNWnShHPvTMbMzAByAo3h4YVnYAgEhly0btM0sZ9Nxn7uDNlpydjTcsJNdloiR9KSOHQsEfbvgLNryEpNJCM1iT6myTCgEmAAWw2D369swt3r14GuTyEipYDCipQ7ycnJbNq0iQ0bNhAQEEDtulewd/dfQM703yNnPfGOqEelbl3PCyYX/1HxrXklwe0H8PLLL3PttdfSvXv3fGOaNGmCadrJPHWY4L3ZfPj5J4zvMJg/wmsXqnbDMPDwD8bDPxivytUvOv75xe8zZMP3ZBo2lvkEkHwuhRtMkyZbfocbboBFi8DPr1DbFhGxisKKlGlJSUmO80vWr9/A2vUb2LcnJ5h4ePngHV4Lz7B6VLnxJryr1sWrSo18e0yKIuiaPmTE7aBf/7vY8vtmIiMj8zzeuHFjDMMg88QBIn49QL19m9gSXrfQYaUouv65miEbvifF5kknLy82Z6cz6L77uPq++6g0ZAisXAnPPw+6I7qIuDmFFSlzPv30U77/fj6/rVvPgX0598jx8PbFJ7w2HmENqHLTzXhXrYNXlUgMW/GemGoYNir3eJwTM0bQ9/Y7+GXF8jyXnQ4ICCCqVm1SEw5Sbf9qALr9uZrXOwws1jqyUk7ywKLJAEy0GbR76AG+efJJqlf/e2/Mu+9C+/bwzjs5geXv+wqJiLgjhRUpc96e/C5r1+QEAcPbn8BmNxLYrAeewWElsn0PvyAq9RzFus+fZvTo0fz3v//N8/jVTZuyb9NfBB45AkDdU4epkXScw8Hhl73tzMRjJP/2FRW3LqZ5dhYAj61ZTeXmzfMOvPZaiIyEQ4dgwQLo1++yty0i4iq6zoqUOUsXx/Ljjz/y5JNP0rjBFST/Npe49+4l/uOHOLloCmm7VpF97oxLa/Cp3oDgDvcyadIk5s2b51i+LS6Jkz7h3HB8D+bfM3LsGNywe+1lbS/jxAES5v+Xox88gPeh9Uy6q3/OA5Ur5w8quVq0yPm8adNlbVtExNW0Z0XKnICAALp370737t15/XVISEjg559/ZvHixSxctJgDm34Aw8Cv2hV4RTbBN+oqfGo0wuZVvPfVCWxxCxlx2xlwzz38sORX3tmQwtp9pziXXokx59IwyZmdYxrQ5a81zGxe9KvQph/9i5Q1X5L652qqVa/B+P+9wZAhQ/D/6COYORNq1iz4ybnn0+zbd0mvT0SkpCisSJkXEhJC37596du3LwAHDhxgyZIlLF68hEWLFxP/21c505OrN8S7Zk548a52xWWfz2IYBpVvfIzjM0bQteetVLv7dbB5ERwUzrV2u2O3podpcs2hbQSkp5Hqc/GL05mmSfqhbaT8Noe0vRupVacuz330EQMGDMDb2ztnUEpKzueAgIJXVKFCzudiupKviIirKKxIuRMVFcW9997Lvffei2mabN++nSVLlhC7eDE/L/uGxF8+wdM3AO/IGHxqXoVv1FU505cv4UJqNp8AKt/yNMc+fYqExR9SpetD3HA6jn/ON/KyZ9N+/yZ+qt+uwHWZpsm5ves589sc0g79QeOYK3n+iy/o06ePrmArImWawoqUa4ZhEBMTQ0xMDI899hhZWVmsW7eOJUuWsCh2MWtWTOd0ZgbegZUdh4x8o6/CM6jwJ+v6VK1L5c73c2rhZHxrNKLz3g1kQp7AkmnzoPPutU7DimnPJu3P1aT+Noezx/bQslVrXnj3e3r06FFwgAoMzPmcmlpwYWf+Pm8nKKjQr0VExAoKKyLn8fT0pE2bNrRp04bnnnuOtLQ0Vq5cyZIlS1gYu5gtP72FaZr4VqmOZ254iWqCh18Q4SkJhKQmOl9xeF0SazUn/ce36GSzOd2z0uWvNcQc242Zu9Cezdm9GzizdTFZyfG0bNmSoWOfokWPHhg1alz4hURH53w+dKjgMbmP5Y4VEXFTCisiF+Dv70/Xrl3p2rUrEybAqVOn+Pnnn3PCy6LF7J33Y87JulXr8FnKadqdOXnRddoLWB6Ynsr8GSMKfuK6dTkf110Hy5dfeCPNmuV8Pnky5wTaWrXyj1m/Pufz1VdfrGQREUtp6rJIEVSuXJnbbruNd999lz27/+TgwYNM+/hj/nXDNXxuy+IsBYeRXAX90F30h9EwwNcXhgy5eKE1akDLljlfz5qV//GVK3P2rPj4wE03XXx9IiIWUlgRuQyRkZEMGjSITz/9hLcTTxM3bx5JYWFkF/N2sg0b1KsHGzbAPfcU7knPPpvz+dVXYePG/19+8iQ8/HDO1488oqvXiojbU1gRKSaGYVD3lluotHcv3zTpDFx8L8vF5D7/6ys75QSORo0K/+TeveHRR3NOpL3mGrjxRujTB+rWha1boV07ePHFy6xQRMT1FFZEipndz58nbxzByJseJ8PDiyzj0n7MsgwbGR5ePNHjcZ668THsvpdwd+Q334TZs6FNG1i1KufS+jVq5OxtWbpUd1wWkVJBJ9iKFDObzcDLw2DulZ34vdoVTP36ZaISj+Bhmhd/8t+yDRsHKlXj/lufY09IJF4eBjZb0a/zAsDtt+d8iIiUUtqzIuICdcNyrg67O6QmPQa9ycJ6bYr0/IX1rqHHoDfZE5JzSfwrwgKLvUYRkdJCYUXEBVpFV8bj7z0hZ719OV6hCllG4a4ym2V4cLxCFc55+QLgYTNoGV3JZbWKiLg7hRURF+jbIpJse85hH8O003PHCjzNws0R8jSz6bljBYaZc3pttt2kb4tIl9UqIuLuFFZEXCCmejCtauXsXWket4OQtKR8Y3LPYHE2YygkLYmr43biYTNoVasyMdU1vVhEyi+FFREXee22JngYBj12rsx3CCjLsGH38mJaq15OZwxlGR7cvPMXPAyD125rUpJli4i4HYUVEReJDgng9dti8h0CyjZsHKxUjeWTJvFq56HcPOhNDlasRvZ5NyXMPRT0+m0xRIcEWFG+iIjbUFgRcaFeaQcch4ByD/d8FXMDtw75HymROeeh5M4YmhtzQ55xIWlJ9Dp7sIQrFhFxPworIq705ZcAmB4eZHl680SPx3n25scdM31ynfX25Zmbn2DkTY+T5emN6eGR5/kiIuWZwoqIq9jtOVePBYy6dfH+fRP3vj+GAa1r0iA8yDHMy8OgUbUgBrSuyeCpY/D+fRNGnTo5D37xRc56RETKMV3BVsRVzp6FOnWgRw945x3w9yeGnJlCmZmZLFiwgC0vdMXHxzvv86oH59wH6JFHYNeunPUE6LwVESm/FFZEXCUgAFauBFvBOzALvIR+QABMm5azV+UCzxcRKQ/0W1DElS43aCioiIgorIiIiIh7U1gRERERt+bW56yYZs4FyZOTky2u5OIyMzNJS0sjOTkZLy8vq8txG+qLc+pLfuqJc+qLc+qLc+7Sl9z/t3P/H79cbh1WUlJSAIiM1E3cRERESpuUlBSCgy//3maGWVyxxwXsdjtHjhwhMDAQwyhg1oSbSE5OJjIykkOHDhEUFHTxJ5QT6otz6kt+6olz6otz6otz7tIX0zRJSUkhIiICWzFMFHDrPSs2m40aNWpYXUaRBAUF6QfHCfXFOfUlP/XEOfXFOfXFOXfoS3HsUcmlE2xFRETErSmsiIiIiFtTWCkmPj4+jBkzBh8fH6tLcSvqi3PqS37qiXPqi3Pqi3NltS9ufYKtiIiIiPasiIiIiFtTWBERERG3prAiIiIibk1hRURERNyawoqIiIi4NYWVy3Dq1CnuuusugoKCqFixIkOGDOHMmTMXfE7Hjh0xDCPPx4MPPlhCFbvG5MmTiY6OxtfXl9atW7N27doLjp8zZw4NGjTA19eXK6+8kgULFpRQpSWrKH2ZPn16vveFr69vCVbreitWrKBnz55ERERgGAbffvvtRZ+zbNkyrr76anx8fKhbty7Tp093eZ0lrah9WbZsWb73imEYHDt2rGQKLgHjx4+nZcuWBAYGEhYWRu/evdm1a9dFn1fWf7dcSl/Kyu8WhZXLcNddd7F9+3ZiY2OZP38+K1as4P7777/o8+677z6OHj3q+HjttddKoFrXmD17Nk888QRjxoxh48aNXHXVVXTr1o34+Hin41etWkW/fv0YMmQImzZtonfv3vTu3Ztt27aVcOWuVdS+QM7lsc9/Xxw4cKAEK3a91NRUrrrqKiZPnlyo8fv27aNHjx5cf/31bN68mREjRjB06FAWLlzo4kpLVlH7kmvXrl153i9hYWEuqrDkLV++nGHDhrFmzRpiY2PJzMyka9eupKamFvic8vC75VL6AmXkd4spl+SPP/4wAXPdunWOZT/++KNpGIYZFxdX4PM6dOhgPvbYYyVQYclo1aqVOWzYMMf32dnZZkREhDl+/Hin42+//XazR48eeZa1bt3afOCBB1xaZ0kral+mTZtmBgcHl1B11gPMb7755oJjRo0aZTZu3DjPsjvuuMPs1q2bCyuzVmH68vPPP5uAefr06RKpyR3Ex8ebgLl8+fICx5SX3y3nK0xfysrvFu1ZuUSrV6+mYsWKtGjRwrGsc+fO2Gw2fvvttws+97PPPiMkJISYmBieeeYZ0tLSXF2uS2RkZLBhwwY6d+7sWGaz2ejcuTOrV692+pzVq1fnGQ/QrVu3AseXRpfSF4AzZ84QFRVFZGQkvXr1Yvv27SVRrtsqD++Vy9G0aVOqVatGly5d+PXXX60ux6WSkpIAqFy5coFjyuP7pTB9gbLxu0Vh5RIdO3Ys325XT09PKleufMFjx/379+fTTz/l559/5plnnuGTTz5hwIABri7XJRISEsjOziY8PDzP8vDw8AJ7cOzYsSKNL40upS/169fn448/Zt68eXz66afY7Xbatm3L4cOHS6Jkt1TQeyU5OZmzZ89aVJX1qlWrxnvvvcfcuXOZO3cukZGRdOzYkY0bN1pdmkvY7XZGjBhBu3btiImJKXBcefjdcr7C9qWs/G7xtLoAdzN69GgmTJhwwTE7duy45PWff07LlVdeSbVq1ejUqRN79uyhTp06l7xeKd3atGlDmzZtHN+3bduWhg0b8v777/Piiy9aWJm4m/r161O/fn3H923btmXPnj288cYbfPLJJxZW5hrDhg1j27ZtrFy50upS3Eph+1JWfrcorPzDyJEjGTRo0AXH1K5dm6pVq+Y7WTIrK4tTp05RtWrVQm+vdevWAOzevbvUhZWQkBA8PDw4fvx4nuXHjx8vsAdVq1Yt0vjS6FL68k9eXl40a9aM3bt3u6LEUqGg90pQUBB+fn4WVeWeWrVqVSb/M3/kkUcckxdq1KhxwbHl4XdLrqL05Z9K6+8WHQb6h9DQUBo0aHDBD29vb9q0aUNiYiIbNmxwPHfp0qXY7XZHACmMzZs3Azm7dksbb29vmjdvzpIlSxzL7HY7S5YsyZPkz9emTZs84wFiY2MLHF8aXUpf/ik7O5utW7eWyvdFcSkP75Xisnnz5jL1XjFNk0ceeYRvvvmGpUuXUqtWrYs+pzy8Xy6lL/9Uan+3WH2Gb2nWvXt3s1mzZuZvv/1mrly50rziiivMfv36OR4/fPiwWb9+ffO3334zTdM0d+/ebf7nP/8x169fb+7bt8+cN2+eWbt2bfO6666z6iVcti+++ML08fExp0+fbv7xxx/m/fffb1asWNE8duyYaZqmeffdd5ujR492jP/1119NT09Pc+LEieaOHTvMMWPGmF5eXubWrVutegkuUdS+jBs3zly4cKG5Z88ec8OGDeadd95p+vr6mtu3b7fqJRS7lJQUc9OmTeamTZtMwJw0aZK5adMm88CBA6Zpmubo0aPNu+++2zF+7969pr+/v/nUU0+ZO3bsMCdPnmx6eHiYP/30k1UvwSWK2pc33njD/Pbbb82//vrL3Lp1q/nYY4+ZNpvNXLx4sVUvodg99NBDZnBwsLls2TLz6NGjjo+0tDTHmPL4u+VS+lJWfrcorFyGkydPmv369TMrVKhgBgUFmYMHDzZTUlIcj+/bt88EzJ9//tk0TdM8ePCged1115mVK1c2fXx8zLp165pPPfWUmZSUZNErKB5vv/22WbNmTdPb29ts1aqVuWbNGsdjHTp0MAcOHJhn/JdffmnWq1fP9Pb2Nhs3bmz+8MMPJVxxyShKX0aMGOEYGx4ebt50003mxo0bLajadXKn3P7zI7cPAwcONDt06JDvOU2bNjW9vb3N2rVrm9OmTSvxul2tqH2ZMGGCWadOHdPX19esXLmy2bFjR3Pp0qXWFO8izvoB5Pn3L4+/Wy6lL2Xld4thmqZZYrtxRERERIpI56yIiIiIW1NYEREREbemsCIiIiJuTWFFRERE3JrCioiIiLg1hRURERFxaworIiIi4tYUVkRERMStKayIiIiIW1NYEREREbemsCIiIiJu7f8AvEzQfU2VZEoAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "image/png": "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cSHe3t727xs2bDC5GtegsCIiIuIiGjRoQEZGBpA980eyKayIiIi4gHvvvZe//voLgKSkpDI5RTk/6oSIiIjJPv74Y9577z0A/vzzTwICAkyuyLUorIiIiJho27ZtDB48GIAPPviARo0amVyR61FYERERMcm5c+do2LAhAEOGDOGee+4xuSLXpLAiIiJiApvNhr+/PwB16tRh1qxZJlfkuhRWRERETJATVNzc3Ni5c6fJ1bg2hRUREZFi1rJlS1JTUwFIT083uRrXp7AiIiJSjB599FHWrVsHwKlTpzRFuQDUIRERkWIyf/58Xn/9dQDWrFlDxYoVTa6oZFBYERERKQZ79+6lX79+ALz55ptcd911JldUciisiIiIONmFCxeoVasWAP369ePBBx80uaKSRWFFRETEiWw2Gz4+PgBEREQwb948kysqeZwaVl566SVatGiBv78/ISEh9O3bl127djlzkyIiIi4lKCgIAIvFwsGDB02upmRyalj59ddfGTVqFGvWrCE2NpaMjAxiYmJ0JUkRESkTbrzxRk6fPg1oivLVcHfmyn/66adct2fPnk1ISAgbNmygXbt2ecanpaWRlpZmv52cnAxARkaG/ZLZriqnPlevs7ipL46pL3mpJ46pL46VhL68+OKLrFmzBh8fH/7++28Mw3B6va7Sl6LevsUwDKNI13gJe/bs4ZprrmHr1q1ER0fnuX/SpElMnjw5z/I5c+bg6+tbHCWKiIjIVUpNTWXgwIEkJSUVyRWkiy2s2Gw2evfuzZkzZ1i5cqXDMY72rERERJCQkODyl8vOyMggNjaWLl264OHhYXY5LkN9cUx9yUs9cUx9ccyV+3LkyBHq1asHwNNPP81jjz1WbNt2lb4kJycTFBRUZGHFqR8DXWzUqFFs27Yt36AC4OXlhZeXV57lHh4eLvdizE9JqrU4qS+OqS95qSeOqS+OuVpf0tPTiYqKAqBr1648+eSTptRhdl+KetvFElZGjx7NokWLWLFiBVWrVi2OTYqIiBS7nP9wBwcH5zluU66cU8OKYRg8+OCDfPPNNyxfvpzq1as7c3MiIiKmCQ8Pt/984sQJEyspfZwaVkaNGsWcOXNYuHAh/v7+HDt2DIDAwED7CXJERERKul69enH06FGAXMdeStFw6nlWZsyYQVJSEh06dCAsLMz+NXfuXGduVkREpNi88sorLFq0CID9+/fj6elpckWlj9M/BhIRESmtfvvtNx5//HEAvvvuOyIjI02uqHTStYFERESuwIkTJ+wnOB0/fjw33XSTyRWVXgorIiIihZSZmUloaCgAbdq04aWXXjK5otJNYUVERKSQcqYoBwQEXPL8YVI0FFZEREQKoWbNmthsNgD7RQrFuRRWRERECmjgwIHs27cPgJSUFKxW/RktDuqyiIhIAcyYMYPPP/8cgJ07d+oCu8VIYUVEROQy1q9fzwMPPADAF198QZ06dUyuqGxRWBEREbmEM2fO0KJFCyD7WncDBgwwuaKyR2FFREQkHzabjQoVKgDQtGlT3nrrLZMrKpsUVkRERPLh7e1t/75x40aTqym7FFZEREQcaNiwIRkZGUD2zB8xj8KKiIjIv4wcOZJt27YBkJSUpCnKJlP3RURELvLpp5/y7rvvArBp0yYCAgJMrkgUVkRERP6xfft27rrrLgDee+89mjRpYm5BAiisiIiIAHDu3Dmio6MBGDx4MMOHDze5IsmhsCIiImWezWbD398fgNq1azN79mxzC5JcFFZERKTMyzkuxc3NjV27dplcjfybwoqIiJRp119/vX1qclpamsnViCMKKyIiUmaNHTuWtWvXAnDy5Enc3NxMrkgcUVgREZEy6ZtvvmHatGkArFq1iqCgIJMrkvworIiISJmzb98+brnlFgBef/11WrVqZXJFcikKKyIiUqZcuHCBmjVrAnDLLbcwZswYcwuSy1JYERGRMsNms+Hj4wNA1apVmT9/vskVSUEorIiISJkRHBxs//nQoUMmViKFobAiIiJlQqdOnUhMTASwX01ZSgaFFRERKfUmTZrEsmXLAIiPj8fd3d3kiqQwFFZERKRU+/nnn5k8eTIAS5YsITw83OSKpLAUVkREpNSKj4+na9euADz33HN06tTJ5IrkSiisiIhIqZSenk7VqlUBiImJYcKECSZXJFdKYUVEREolLy8vAIKCgli8eLHJ1cjVUFgREZFSp0qVKvafT548aWIlUhQUVkREpFTp27cvR44cAeD8+fMmVyNFQWFFRERKjddee42FCxcCEBcXh7e3t8kVSVFwalhZsWIFvXr1Ijw8HIvFwoIFC5y5ORERKcNWrlzJY489BsDChQuJiooytyApMk4NKykpKTRu3Jjp06c7czMiIlLGJSQk0LZtWwAef/xxevfu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//tfUlJSGDp0qLM3LSIiV6FNmzacO3cOINfkB5Hi5vSwMmDAAE6ePMkzzzzDsWPHaNKkCT/99BOhoaHO3rSIiFyhJ554glWrVgFw8uRJ3N1d6hBHKWOK5dU3evRoRo8eXRybEhGRq/Ttt98ydepUAH777TeCgoJMrkjKOp3NR0RE7Pbv30+fPn0AePXVV7nhhhtMrkhEYUVERP5x4cIFqlevDkCfPn0YO3asyRWJZFNYERERAHx8fAAIDw9nwYIF5hYjchGFFRERITg42P5zfHy8iZWI5KWwIiJSxsXExJCQkABoirK4JoUVEZEy7Pnnnyc2NhaAQ4cO4enpaXJFInkprIiIlFFLly7l6aefBuCnn36iatWqJlck4pjCiohIGXTkyBE6d+4MwMSJE+natavJFYnkT2FFRKSMyczMpEqVKgB06tSJSZMmmVuQyGUorIiIlDE5V8StWLEiS5YsMbkakctTWBERKUMiIiLsP588edLESkQKTmFFRKSMuPXWWzl8+DAA58+fx2rVnwApGfRKFREpA9544w2+/vprAPbu3Yu3t7fJFYkUnMKKiEgpt3r1asaMGQPA119/TY0aNcwtSKSQFFZEREqxhIQEWrduDcDYsWO5+eabTa5IpPAUVkRESqnMzEz7NX+uu+46Xn31VZMrErkyCisiIqVUznEpfn5+rFmzxuRqRK6cwoqISClUu3ZtsrKyAEhOTja5GpGro7AiIlLKDB48mN27dwNw9uxZTVGWEk+vYBGRUuSDDz7g448/BmDbtm2UK1fO5IpErp7CiohIKbF582aGDx8OwCeffEKDBg1MrkikaCisiIiUAsnJyTRt2hSAe++9l0GDBplckUjRUVgRESnhbDYbgYGBADRs2JCZM2eaXJFI0VJYEREp4fz8/ADw8PRky5YtJlcjUvQUVkRESrCmTZty4cIFAC6cP29yNSLOobAiIlJCPfjgg2zevBmA06dPa4qylFp6ZYuIlEBz587l7bffBmDdunWUL1/e3IJEnEhhRUSkhNm1axe33347ADNmzKB58+YmVyTiXAorIiIlSGpqKnXr1gVg4MCB3HfffSZXJOJ8CisiIiWEzWazz/ypUaMGn332mckViRQPhRURkRIi57gUq9XK3r17zS1GpBgprIiIlADdunXj7NmzAKSlpZlcjUjxUlgRESkBVq9eDcDx48dx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utJv79699OvXD4A33niD6667zuSKREQKTmFFilV4eDjnz59n//79eHh4APDUU09hsVj473//a25xpdSFCxeoVasWAP369eOhhx4yuSIRkcJRWBFTREZGkp6ezs6dO3FzcwPgkUcewWKx8O6775pcXelhs9nw8fEBICIignnz5plckYhI4SmsiKnq1KlDZmYmW7duxWKxADBy5EgsFgsff/yxydWVfEFBQQBYLJZcBzuLiJQkxRJW0tLSaNKkCRaLhc2bNxfHJqWEiY6OxmazsW7dOvuywYMHY7FYtDfgCnXq1InTp08DmqIsIiVbsYSVxx9/3H6iMJFLad68OYZhsHLlSvuy2267DYvFwqJFi0ysrGSZOHEiy5YtA+Do0aO4u7ubXJGIyJVzelj58ccf+fnnn3n11VedvSkpRdq0aYNhGCxdutS+rFevXlgsllzLJK/Fixfz7LPPAtnXa6pcubLJFYmIXB2n/nfr+PHjjBgxggULFuDr63vZ8WlpaaSlpdlvJycnA5CRkUFGRobT6iwKOfW5ep3F7Wr70rZtW9LT0/n555/p378/kB1aAH766SdatWpVNIUWM2e9Xo4cOcLNN9+Mj48PTz/9NG3bti0xr0n9DjmmvjimvjjmKn0p6u1bDMMwinSN/zAMgx49etCmTRsmTJjA/v37qV69Ops2baJJkyYOHzNp0iQmT56cZ/mcOXMKFHZERETEfKmpqQwcOJCkpCQCAgKuen2FDivjx49nypQplxyzY8cOfv75Z7788kt+/fVX3NzcChRWHO1ZiYiIICEhoUierDNlZGQQGxtLly5d7OcPEef1Ze7cudx777322xaLhd9//50GDRoU2TacyRl9yTlbcFBQEHv37i2SdRYn/Q45pr44pr445ip9SU5OJigoqMjCSqE/Bho7dixDhgy55JgaNWqwbNkyVq9ejZeXV677mjdvzp133slHH32U53FeXl55xgN4eHiUmBdjSaq1OBV1XwYNGsSgQYN4//33GTFiBABNmzbFarXy119/UadOnSLbljMVVV9yTrYHlPgpyvodckx9cUx9cczsvhT1tgsdVoKDg3NdTTc/b775Js8//7z99pEjR+jatStz587Vqb6lyAwfPpzhw4fzxhtvMGbMGGw2G3Xr1sXd3Z09e/YQGRlpdolO16dPH44ePQpkn61WRKS0cdpsoGrV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9mX58uV5XisWi4Vjx44VT8HF4KWXXqJFixb4+/sTEhJC37592bVr12UfV9rfW66kL6XlvUVh5SrceeedbN++ndjYWBYtWsSKFSu49957L/u4ESNGcPToUfvX1KlTi6Fa55g7dy6PPvooEydOZOPGjTRu3JiuXbty4sQJh+NXrVrFHXfcwbBhw9i0aRN9+/alb9++bNu2rZgrd67C9gWyT4998eviwIEDxVix86WkpNC4cWOmT59eoPFxcXH07NmTjh07snnzZsaMGcPw4cNZvHixkystXoXtS45du3bler2EhIQ4qcLi9+uvvzJq1CjWrFlDbGwsGRkZxMTEkJKSku9jysJ7y5X0BUrJe4shV+Svv/4yAGPdunX2ZT/++KNhsViM+Pj4fB/Xvn174+GHHy6GCotHy5YtjVGjRtlvZ2VlGeHh4cZLL73kcPxtt91m9OzZM9ey6667zhg5cqRT6yxuhe3LrFmzjMDAwGKqznyA8c0331xyzOOPP240aNAg17IBAwYYXbt2dWJl5ipIX3755RcDME6fPl0sNbmCEydOGIDx66+/5jumrLy3XKwgfSkt7y3as3KFVq9eTfny5WnevLl9WefOnbFaraxdu/aSj/3ss88ICgoiOjqaJ598ktTUVGeX6xTp6els2LCBzp0725dZrVY6d+7M6tWrHT5m9erVucYDdO3aNd/xJdGV9AXg3LlzREZGEhERQZ8+fdi+fXtxlOuyysJr5Wo0adKEsLAwunTpwu+//252OU6VlJQEQMWKFfMdUxZfLwXpC5SO9xaFlSt07NixPLtd3d3dqVix4iU/Ox44cCCffvopv/zyC08++SSffPIJgwYNcna5TpGQkEBWVhahoaG5loeGhubbg2PHjhVqfEl0JX2pU6cOH374IQsXLuTTTz/FZrPRunVrDh8+XBwlu6T8XivJycmcP3/epKrMFxYWxv/+9z/mz5/P/PnziYiIoEOHDmzcuNHs0pzCZrMxZswY2rRpQ3R0dL7jysJ7y8UK2pfS8t7ibnYBrmb8+PFMmTLlkmN27Nhxxeu/+JiWhg0bEhYWRqdOndi7dy81a9a84vVKydaqVStatWplv926dWvq1avHzJkzee6550ysTFxNnTp1qFOnjv1269at2bt3L6+//jqffPKJiZU5x6hRo9i2bRsrV640uxSXUtC+lJb3FoWVfxk7dixDhgy55JgaNWpQuXLlPAdLZmZmkpiYSOXKlQu8veuuuw6APXv2lLiwEhQUhJubG8ePH8+1/Pjx4/n2oHLlyoUaXxJdSV/+zcPDg6ZNm7Jnzx5nlFgi5PdaCQgIwMfHx6SqXFPLli1L5R/z0aNH2ycvVK1a9ZJjy8J7S47C9OXfSup7iz4G+pfg4GDq1q17yS9PT09atWrFmTNn2LBhg/2xy5Ytw2az2QNIQWzevBnI3rVb0nh6etKsWTOWLl1qX2az2Vi6dGmuJH+xVq1a5RoPEBsbm+/4kuhK+vJvWVlZbN26tUS+LopKWXitFJXNmzeXqteKYRiMHj2ab775hmXLllG9evXLPqYsvF6upC//VmLfW8w+wrck69atm9G0aVNj7dq1xsqVK41rrrnGuOOOO+z3Hz582KhTp46xdu1awzAMY8+ePcazzz5rrF+/3oiLizMWLlxo1KhRw2jXrp1ZT+GqffHFF4aXl5cxe/Zs46+//jLuvfdeo3z58saxY8cMwzCMu+66yxg/frx9/O+//264u7sbr776qrFjxw5j4sSJhoeHh7F161aznoJTFLYvkydPNhYvXmzs3bvX2LBhg3H77bcb3t7exvbt2816CkXu7NmzxqZNm4xNmzYZgDFt2jRj06ZNxoEDBwzDMIzx48cbd911l338vn37DF9fX2PcuHHGjh07jOnTpxtubm7GTz/9ZNZTcIrC9uX11183FixYYOzevdvYunWr8fDDDxtWq9VYsmSJWU+hyN1///1GYGCgsXz5cuPo0aP2r9TUVPuYsvjeciV9KS3vLQorV+HUqVPGHXfcYZQrV84ICAgwhg4dapw9e9Z+f1xcnAEYv/zyi2EYhnHw4EGjXbt2RsWKFQ0vLy+jVq1axrhx44ykpCSTnkHReOutt4xq1aoZnp6eRsuWLY01a9bY72vfvr0xePDgXOO//PJLo3bt2oanp6fRoEED4/vvvy/miotHYfoyZswY+9jQ0FCjR48exsaNG02o2nlyptz++yunD4MHDzbat2+f5zFNmjQxPD09jRo1ahizZs0q9rqdrbB9mTJlilGzZk3D29vbqFixotGhQwdj2bJl5hTvJI76AeT69y+L7y1X0pfS8t5iMQzDKLbdOCIiIiKFpGNWRERExKUprIiIiIhLU1gRERERl6awIiIiIi5NYUVERERcmsKKiIiIuDSFFREREXFpCisiIiLi0hRWRERExKUprIiIiIhLU1gRERERl/Z/dpYRpxIG8tgAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Put the solution in a way that is compatible with the classical variables\n", "x_quantum = np.zeros(n**2)\n", "kk = 0\n", "for ii in range(n**2):\n", " if ii // n != ii % n:\n", " x_quantum[ii] = quantum_solution[kk]\n", " kk += 1\n", "\n", "\n", "# visualize the solution\n", "visualize_solution(xc, yc, x_quantum, quantum_cost, n, K, \"Quantum\")\n", "\n", "# and visualize the classical for comparison\n", "if x is not None:\n", " visualize_solution(xc, yc, x, classical_cost, n, K, \"Classical\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The plots present the depot with a star and the selected routes for the vehicles with arrows. Note that in this particular case, we can find the optimal solution of the QP formulation, which happens to coincide with the optimal solution of the ILP.\n", "\n", "Keep in mind that VQE is an heuristic working on the QP formulation of the Ising Hamiltonian, though. For suitable choices of A, local optima of the QP formulation will be feasible solutions to the ILP. While for some small instances, as above, we can find optimal solutions of the QP formulation which coincide with optima of the ILP, finding optimal solutions of the ILP is harder than finding local optima of the QP formulation, in general, which in turn is harder than finding feasible solutions of the ILP. Even within the VQE, one may provide stronger guarantees, for specific variational forms (trial wave functions). " ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/html": [ "

Version Information

Qiskit SoftwareVersion
qiskit-terra0.23.0
qiskit-aer0.11.1
qiskit-optimization0.5.0
qiskit-machine-learning0.6.0
System information
Python version3.9.15
Python compilerClang 14.0.0 (clang-1400.0.29.102)
Python buildmain, Oct 11 2022 22:27:25
OSDarwin
CPUs4
Memory (Gb)16.0
Tue Dec 06 21:53:30 2022 JST
" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "data": { "text/html": [ "

This code is a part of Qiskit

© Copyright IBM 2017, 2022.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import tutorial_magics\n", "\n", "%qiskit_version_table\n", "%qiskit_copyright" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "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.9.7" } }, "nbformat": 4, "nbformat_minor": 4 }