TP-recherche-operationnelle/notebook.ipynb
2021-12-05 16:21:15 +01:00

563 lines
58 KiB
Plaintext

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# TP 2-3 : Branch-and-bound applied to a knapsack problem"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Initialisation (à faire une seule fois)"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `~/.julia/registries/General`\n",
"\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n",
"\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n",
"\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n",
"\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n",
"\u001b[32m ✓ \u001b[39mTestOptinum\n",
" 1 dependency successfully precompiled in 7 seconds (270 already precompiled)\n",
"\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n",
"\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Project.toml`\n",
"\u001b[32m\u001b[1m No Changes\u001b[22m\u001b[39m to `~/.julia/environments/v1.6/Manifest.toml`\n",
"\u001b[32m\u001b[1mPrecompiling\u001b[22m\u001b[39m project...\n",
"\u001b[32m ✓ \u001b[39mTestOptinum\n",
" 1 dependency successfully precompiled in 4 seconds (270 already precompiled)\n"
]
}
],
"source": [
"import Pkg;\n",
"Pkg.add(\"GraphRecipes\");\n",
"Pkg.add(\"Plots\");\n",
"using GraphRecipes, Plots #only used to visualize the search tree at the end of the branch-and-bound"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Récupération des données"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"readKnapInstance"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\"\"\"Open and read a KnapFile.\n",
"\n",
"Args: \\\\\n",
" - filename (String): the name of the file to read.\n",
"\n",
"Returns: \\\\\n",
" - price (Vector{Integer}): prices of items to put in the KnapSack. \\\\\n",
" - weight (Vector{Integer}): weights of items to put in the KnapSack. \\\\\n",
" - capacity (Integer): the maximum capacity of the KnapSack.\n",
"\"\"\"\n",
"function readKnapInstance(filename)\n",
" price = []\n",
" weight = []\n",
" capacity = -1\n",
" open(filename) do f\n",
" for i = 1:3\n",
" tok = split(readline(f))\n",
" if (tok[1] == \"ListPrices=\")\n",
" for i = 2:(length(tok)-1)\n",
" push!(price, parse(Int64, tok[i]))\n",
" end\n",
" elseif (tok[1] == \"ListWeights=\")\n",
" for i = 2:(length(tok)-1)\n",
" push!(weight, parse(Int64, tok[i]))\n",
" end\n",
" elseif (tok[1] == \"Capacity=\")\n",
" capacity = parse(Int64, tok[2])\n",
" else\n",
" println(\"Unknown read :\", tok)\n",
" end\n",
" end\n",
" end\n",
" return price, weight, capacity\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# on teste de lire tous les fichiers .opb\n",
"for (root, dirs, files) in walkdir(\"data\")\n",
" for file in files\n",
" if endswith(file, \".opb\")\n",
" readKnapInstance(root * \"/\" * file)\n",
" end\n",
" end\n",
"end"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Procédure d'application des tests de sondabilités TA, TO et TR pour le cas de la relaxation linéaire"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"TestsSondabilite_relaxlin"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\"\"\"Test if a node should be pruned.\n",
"\n",
"Args: \\\\\n",
" - x (Vector{Integer}): the node to be tested. \\\\\n",
" - price (Vector{Integer}): prices of items to put in the KnapSack. \\\\\n",
" - weight (Vector{Integer}): weights of items to put in the KnapSack. \\\\\n",
" - capacity (Integer): the maximum capacity of the KnapSack. \\\\\n",
" - BestProfit (Integer): the current BestProfit value. \\\\\n",
" - Bestsol (Integer): the current BestSol values. \\\\\n",
" - affich (Bool): determine if the function should print to stdout.\n",
"\n",
"Returns: \\\\\n",
" - TA (Bool): true if the node is feasible. \\\\\n",
" - TO (Bool): true if the node is optimal. \\\\\n",
" - TR (Bool): true if the node is resolvable. \\\\\n",
" - BestProfit (Integer): the updated value of BestProfit. \\\\\n",
" - Bestsol (Vector{Integer}): the updated values of BestSol.\n",
"\"\"\"\n",
"function TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, affich)\n",
" TA, TO, TR = false, false, false\n",
"\n",
" if (!Constraints(x, weight, capacity)) # Test de faisabilite\n",
" TA = true\n",
" if affich\n",
" println(\"TA\\n\")\n",
" end\n",
"\n",
" elseif (Objective(x, price) <= BestProfit) # Test d'optimalite\n",
" TO = true\n",
" if affich\n",
" println(\"TO\\n\")\n",
" end\n",
"\n",
" elseif (AllDef(x)) # Test de resolution\n",
" TR = true\n",
" if affich\n",
" println(\"TR : solution \", \" de profit \", Objective(x, price), \"\\n\")\n",
" end\n",
" if (Objective(x, price) >= BestProfit) # Le profit de la solution trouvée est meilleur que les autres\n",
" if affich\n",
" println(\"\\t-> Cette solution a un meilleur profit.\\n\")\n",
" end\n",
" # On remplace la solution et le profit par les nouvelles valeurs\n",
" Bestsol = x\n",
" BestProfit = Objective(x, price)\n",
" else\n",
" if affich\n",
" println(\"\\t-> Cette solution est moins bonne.\\n\")\n",
" end\n",
" end\n",
"\n",
" elseif affich\n",
" println(\"non sondable\\n\")\n",
" end\n",
"\n",
" return TA, TO, TR, Bestsol, BestProfit\n",
"end"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Procédure de séparation et stratégie d'exploration permettant de se placer au prochain noeud à traiter"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"SeparerNoeud_relaxlin"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\"\"\"Split a node in two.\n",
"\n",
"Args: \\\\\n",
" - price (Vector{Integer}): prices of items to put in the KnapSack. \\\\\n",
" - listvars (Vector{Vector{Integer}}): the current values of listvars. \\\\\n",
" - listvals (Vector{Integer}): the current values of listvals.\n",
"\n",
"Returns: \\\\\n",
" - listvars (Vector{Vector{Integer}}): the updated values of listvars. \\\\\n",
" - listvals (Vector{Integer}): the updated values of listvals.\n",
"\"\"\"\n",
"function SeparerNoeud_relaxlin(price, listvars, listvals)\n",
" # Le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds \n",
"\n",
" # Cas du noeud le plus à gauche\n",
"\n",
" # On sépare le noeud actuel en 2 sous-noeuds\n",
" predX = pop!(listvars)\n",
" nextX0 = copy(predX)\n",
" nextX1 = copy(predX)\n",
"\n",
" # On initialise leurs valeurs à zéro\n",
" val0 = 0\n",
" val1 = 0\n",
"\n",
" # On fixe la nouvelle variable des deux sous-noeuds\n",
" n = length(predX)\n",
" for i = 1:n\n",
" if predX[i] == -1\n",
" # L'un a zéro\n",
" nextX0[i] = 0\n",
" # L'autre a un\n",
" nextX1[i] = 1\n",
"\n",
" # On calcule leurs valeurs\n",
" val0 = Objective(nextX0, price)\n",
" val1 = Objective(nextX1, price)\n",
" break\n",
" end\n",
" end\n",
"\n",
" # On ajoute les sous-noeuds a la pile des noeuds a explorer\n",
" push!(listvars, nextX0)\n",
" push!(listvars, nextX1)\n",
"\n",
" # On ajoute aussi leurs valeurs\n",
" push!(listvals, val0)\n",
" push!(listvals, val1)\n",
"\n",
" return listvars, listvals\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ExplorerAutreNoeud_relaxlin"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\"\"\"Pop node fom the list to explore another node.\n",
"\n",
"Args: \\\\\n",
" - price (Vector{Integer}): prices of items to put in the KnapSack. \\\\\n",
" - listvars (Vector{Vector{Integer}}): the current values of listvars. \\\\\n",
" - listvals (Vector{Integer}): the current values of listvals.\n",
"\n",
"Returns: \\\\\n",
" - listvars (Vector{Vector{Integer}}): the updated values of listvars. \\\\\n",
" - listvals (Vector{Integer}): the updated values of listvals. \\\\\n",
" - stop (Bool): true if the tree search is finished.\n",
"\"\"\"\n",
"function ExplorerAutreNoeud_relaxlin(listvars, listvals)\n",
" # Le noeud est sondable, on l'enlève de la pile des noeuds à sonder\n",
"\n",
" stop = false\n",
" if (length(listvars) > 1)\n",
" # On passe au noeud suivant\n",
" var = pop!(listvars)\n",
" val = pop!(listvals)\n",
" else\n",
" # Il n'y a pas d'autre noeud\n",
" stop = true\n",
" end\n",
"\n",
" return listvars, listvals, stop\n",
"end"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Fonctions décrivant l'objectif et les contraintes"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"AllDef (generic function with 1 method)"
]
},
"execution_count": 14,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Fonction objectif que l'on souhaite maximiser/minimiser (évalué dans le meilleur des cas)\n",
"Objective(x, price) =\n",
" sum(\n",
" if x[i] < 0\n",
" price[i]\n",
" else\n",
" price[i] * x[i]\n",
" end\n",
" for i = 1:length(x)\n",
" )\n",
"\n",
"# Fonction permettant de vérfier toutes les contraintes du modèle (dans le meilleur des cas)\n",
"Constraints(x, weight, capacity) =\n",
" sum(\n",
" if x[i] < 0\n",
" 0\n",
" else\n",
" weight[i] * x[i]\n",
" end\n",
" for i = 1:length(x)\n",
" ) <= capacity\n",
"\n",
"# Fonction qui nous dis si toutes les variables de x sont fixées\n",
"function AllDef(x)\n",
" for i = 1:length(x)\n",
" if x[i] < 0\n",
" return false\n",
" end\n",
" end\n",
" return true\n",
"end"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Résolution du problème KnapSack"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"SolveKnapInstance"
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\"\"\"Solve the KnapSack problem for the data contained in `filename`.\n",
"\n",
"Args: \\\\\n",
" - filename (String): the name of the file to read.\n",
"\n",
"Returns: \\\\\n",
" - trParentnodes (Vector{Integer}): the parents nodes, to plot the tree.\n",
" - trChildnodes (Vector{Integer}): the child nodes, to plot the tree.\n",
" - trNamenodes (Vector{Integer}): the name of the nodes, to plot the tree.\n",
"\"\"\"\n",
"function SolveKnapInstance(filename)\n",
"\n",
" stop = false\n",
" affich = false\n",
"\n",
" # Extraction des données\n",
" price, weight, capacity = readKnapInstance(filename)\n",
"\n",
" if affich\n",
" println(\"Capacity : \", capacity, \" | Number of objects : \", length(price), \"\\n\")\n",
" end\n",
"\n",
" # Pour dessiner le graph\n",
" trParentnodes = Int64[]\n",
" trChildnodes = Int64[]\n",
" trNamenodes = []\n",
"\n",
" # Liste des variable pour naviguer de noeuds en noeuds\n",
" listvars = []\n",
" listvals = []\n",
" listnodes = []\n",
"\n",
" # La meilleur solution et sa valeur\n",
" BestProfit = -1\n",
" Bestsol = []\n",
"\n",
" # Compter le nombre de noeud explorés\n",
" current_node_number = 0\n",
"\n",
" # On ajoute le premier noeud à explorer (la racine)\n",
" push!(listvars, [-1 for p in price])\n",
" push!(listvals, Objective(last(listvars), price))\n",
" push!(listnodes, 1)\n",
" push!(trNamenodes, 0)\n",
" newnodeid = 2\n",
"\n",
" while (!stop)\n",
"\n",
" # Le noeud actuel\n",
" x = last(listvars)\n",
"\n",
" if affich && current_node_number % 10000 == 0\n",
" println(\"----------\\nNode n°\", current_node_number, \" :\\n\")\n",
" println(\"Previous Solution memorized \", \" with bestprofit \", BestProfit, \"\\n\")\n",
" end\n",
"\n",
" # Test de sondabilité du noeud actuel\n",
" # -> On mets a jour la solution et sa valeur si besoin\n",
" TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, affich)\n",
"\n",
" is_node_sondable = TA || TO || TR\n",
" if (!is_node_sondable)\n",
" # Le noeud n'est pas sondable, on le sépare en 2 sous-noeuds\n",
" listvars, listvals = SeparerNoeud_relaxlin(price, listvars, listvals)\n",
"\n",
" curnode = pop!(listnodes)\n",
"\n",
" push!(trParentnodes, curnode)\n",
" push!(trParentnodes, curnode)\n",
"\n",
" push!(listnodes, newnodeid + 1)\n",
" push!(listnodes, newnodeid)\n",
"\n",
" push!(trChildnodes, newnodeid)\n",
" push!(trChildnodes, newnodeid + 1)\n",
"\n",
" push!(trNamenodes, newnodeid - 1)\n",
" push!(trNamenodes, newnodeid)\n",
"\n",
" newnodeid += 2\n",
"\n",
" else\n",
" # Le noeud est sondable, on passe au noeud suivant\n",
" listvars, listvals, stop = ExplorerAutreNoeud_relaxlin(listvars, listvals)\n",
"\n",
" pop!(listnodes)\n",
" end\n",
"\n",
" current_node_number += 1\n",
" end\n",
"\n",
" if affich\n",
" println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x = \", Bestsol)\n",
" end\n",
" \n",
" return trParentnodes, trChildnodes, trNamenodes\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<svg xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" width=\"600\" height=\"400\" viewBox=\"0 0 2400 1600\">\n<defs>\n <clipPath id=\"clip020\">\n <rect x=\"0\" y=\"0\" width=\"2400\" height=\"1600\"/>\n </clipPath>\n</defs>\n<path clip-path=\"url(#clip020)\" d=\"\nM0 1600 L2400 1600 L2400 0 L0 0 Z\n \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<defs>\n <clipPath id=\"clip021\">\n <rect x=\"480\" y=\"0\" width=\"1681\" height=\"1600\"/>\n </clipPath>\n</defs>\n<path clip-path=\"url(#clip020)\" d=\"\nM447.244 1552.76 L1952.76 1552.76 L1952.76 47.2441 L447.244 47.2441 Z\n \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<defs>\n <clipPath id=\"clip022\">\n <rect x=\"447\" y=\"47\" width=\"1507\" height=\"1507\"/>\n </clipPath>\n</defs>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1202,262.317 1202.54,272.583 1204.12,282.81 1206.66,293.002 1210.08,303.16 1214.3,313.289 1219.26,323.39 1224.87,333.466 1231.05,343.522 1237.73,353.558 \n 1244.83,363.579 1252.28,373.587 1260,383.585 1267.91,393.576 1275.93,403.563 1283.99,413.548 1292.01,423.534 1299.92,433.525 1307.64,443.523 1315.09,453.531 \n 1322.19,463.552 1328.87,473.589 1335.05,483.644 1340.66,493.721 1345.62,503.822 1349.84,513.95 1353.26,524.109 1355.8,534.3 1357.38,544.527 1357.92,554.793 \n \n \"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1202,262.317 1201.46,272.171 1199.91,281.977 1197.42,291.737 1194.07,301.456 1189.92,311.137 1185.06,320.784 1179.56,330.4 1173.5,339.989 1166.94,349.555 \n 1159.97,359.1 1152.67,368.63 1145.1,378.147 1137.34,387.655 1129.47,397.157 1121.56,406.658 1113.69,416.161 1105.93,425.669 1098.36,435.186 1091.05,444.715 \n 1084.08,454.261 1077.53,463.827 1071.46,473.416 1065.96,483.032 1061.1,492.679 1056.96,502.36 1053.6,512.079 1051.11,521.839 1049.56,531.644 1049.03,541.499 \n \n \"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1357.92,554.793 1357.8,560.931 1357.42,567.175 1356.83,573.519 1356.02,579.953 1355.03,586.472 1353.87,593.065 1352.55,599.727 1351.09,606.447 1349.52,613.22 \n 1347.85,620.036 1346.1,626.887 1344.29,633.767 1342.43,640.666 1340.54,647.577 1338.65,654.493 1336.76,661.404 1334.9,668.303 1333.09,675.183 1331.34,682.035 \n 1329.67,688.851 1328.1,695.623 1326.65,702.344 1325.33,709.005 1324.16,715.599 1323.17,722.117 1322.37,728.552 1321.77,734.895 1321.4,741.14 1321.27,747.277 \n \n \"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1357.92,554.793 1358.42,562.835 1359.85,570.771 1362.16,578.609 1365.28,586.358 1369.12,594.025 1373.63,601.617 1378.74,609.143 1384.36,616.61 1390.44,624.027 \n 1396.91,631.4 1403.69,638.739 1410.71,646.05 1417.91,653.341 1425.21,660.621 1432.55,667.897 1439.85,675.177 1447.05,682.469 1454.07,689.78 1460.85,697.118 \n 1467.31,704.492 1473.39,711.908 1479.02,719.376 1484.12,726.902 1488.63,734.494 1492.48,742.16 1495.59,749.909 1497.9,757.747 1499.34,765.684 1499.83,773.725 \n \n \"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1499.83,773.725 1499.72,782.018 1499.4,790.473 1498.89,799.08 1498.2,807.826 1497.34,816.698 1496.34,825.686 1495.2,834.776 1493.95,843.956 1492.6,853.215 \n 1491.16,862.541 1489.65,871.921 1488.09,881.343 1486.49,890.796 1484.87,900.266 1483.24,909.743 1481.61,919.213 1480.01,928.666 1478.45,938.088 1476.94,947.468 \n 1475.5,956.794 1474.15,966.053 1472.9,975.233 1471.77,984.323 1470.76,993.311 1469.91,1002.18 1469.21,1010.93 1468.7,1019.54 1468.38,1027.99 1468.27,1036.28 \n \n \"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1499.83,773.725 1500.2,785.618 1501.26,797.665 1502.98,809.854 1505.28,822.176 1508.14,834.617 1511.48,847.167 1515.26,859.813 1519.43,872.546 1523.94,885.353 \n 1528.74,898.223 1533.76,911.144 1538.97,924.105 1544.31,937.095 1549.72,950.102 1555.16,963.114 1560.57,976.121 1565.91,989.111 1571.12,1002.07 1576.14,1014.99 \n 1580.94,1027.86 1585.44,1040.67 1589.62,1053.4 1593.4,1066.05 1596.74,1078.6 1599.59,1091.04 1601.9,1103.36 1603.62,1115.55 1604.68,1127.6 1605.05,1139.49 \n \n \"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1468.27,1036.28 1468.02,1044.75 1467.3,1053.33 1466.15,1062.02 1464.59,1070.81 1462.67,1079.69 1460.41,1088.65 1457.86,1097.68 1455.04,1106.79 1452,1115.94 \n 1448.77,1125.15 1445.38,1134.39 1441.86,1143.66 1438.26,1152.96 1434.61,1162.27 1430.94,1171.58 1427.28,1180.89 1423.68,1190.19 1420.17,1199.46 1416.78,1208.7 \n 1413.54,1217.91 1410.5,1227.06 1407.69,1236.16 1405.13,1245.2 1402.88,1254.16 1400.95,1263.04 1399.4,1271.83 1398.24,1280.52 1397.52,1289.1 1397.27,1297.57 \n \n \"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1468.27,1036.28 1468.44,1045.85 1468.92,1055.59 1469.69,1065.49 1470.72,1075.55 1472.01,1085.74 1473.51,1096.06 1475.21,1106.5 1477.09,1117.03 1479.11,1127.64 \n 1481.27,1138.33 1483.53,1149.08 1485.87,1159.88 1488.27,1170.71 1490.71,1181.56 1493.15,1192.41 1495.59,1203.26 1497.99,1214.09 1500.33,1224.88 1502.59,1235.63 \n 1504.74,1246.32 1506.77,1256.94 1508.65,1267.47 1510.35,1277.9 1511.85,1288.22 1513.14,1298.42 1514.17,1308.48 1514.94,1318.38 1515.42,1328.12 1515.59,1337.68 \n \n \"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1605.05,1139.49 1605.51,1146.51 1606.85,1153.4 1609.01,1160.16 1611.92,1166.82 1615.52,1173.37 1619.73,1179.83 1624.5,1186.21 1629.76,1192.52 1635.44,1198.77 \n 1641.48,1204.96 1647.82,1211.11 1654.38,1217.22 1661.11,1223.31 1667.94,1229.39 1674.79,1235.46 1681.62,1241.53 1688.35,1247.62 1694.91,1253.74 1701.25,1259.88 \n 1707.29,1266.08 1712.97,1272.32 1718.23,1278.63 1723,1285.01 1727.21,1291.47 1730.81,1298.02 1733.72,1304.68 1735.88,1311.45 1737.22,1318.33 1737.68,1325.35 \n \n \"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1605.05,1139.49 1605.26,1145.49 1605.87,1151.55 1606.85,1157.67 1608.17,1163.84 1609.81,1170.06 1611.73,1176.32 1613.9,1182.63 1616.29,1188.97 1618.87,1195.34 \n 1621.62,1201.73 1624.51,1208.15 1627.49,1214.58 1630.55,1221.03 1633.66,1227.48 1636.78,1233.94 1639.88,1240.39 1642.94,1246.83 1645.93,1253.27 1648.81,1259.68 \n 1651.56,1266.08 1654.14,1272.45 1656.54,1278.79 1658.71,1285.1 1660.62,1291.36 1662.26,1297.58 1663.58,1303.75 1664.56,1309.87 1665.17,1315.93 1665.38,1321.93 \n \n \"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1049.03,541.499 1048.58,551.762 1047.26,562.068 1045.16,572.415 1042.32,582.798 1038.81,593.216 1034.69,603.664 1030.04,614.139 1024.9,624.638 1019.36,635.158 \n 1013.46,645.696 1007.27,656.249 1000.87,666.812 994.3,677.384 987.638,687.961 980.944,698.539 974.281,709.115 967.714,719.687 961.307,730.251 955.122,740.803 \n 949.224,751.341 943.677,761.861 938.543,772.361 933.887,782.836 929.773,793.284 926.264,803.701 923.424,814.085 921.316,824.431 920.005,834.738 919.554,845.001 \n \n \"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1049.03,541.499 1049.16,550.951 1049.53,560.589 1050.12,570.398 1050.93,580.365 1051.93,590.477 1053.09,600.719 1054.41,611.077 1055.87,621.538 1057.44,632.089 \n 1059.11,642.715 1060.87,653.403 1062.68,664.139 1064.55,674.909 1066.44,685.7 1068.33,696.498 1070.22,707.289 1072.09,718.059 1073.9,728.795 1075.66,739.483 \n 1077.33,750.109 1078.9,760.66 1080.36,771.122 1081.68,781.48 1082.85,791.722 1083.84,801.833 1084.65,811.8 1085.24,821.61 1085.62,831.248 1085.74,840.7 \n \n \"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 919.554,845.001 919.605,853.134 919.755,861.436 919.995,869.895 920.319,878.499 920.719,887.234 921.188,896.088 921.719,905.049 922.305,914.104 922.937,923.241 \n 923.61,932.446 924.315,941.709 925.046,951.015 925.795,960.352 926.554,969.708 927.318,979.071 928.077,988.427 928.826,997.764 929.557,1007.07 930.262,1016.33 \n 930.935,1025.54 931.567,1034.67 932.153,1043.73 932.684,1052.69 933.153,1061.54 933.553,1070.28 933.877,1078.88 934.117,1087.34 934.267,1095.64 934.318,1103.78 \n \n \"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 919.554,845.001 919.042,851.473 917.555,857.695 915.165,863.687 911.944,869.466 907.964,875.052 903.298,880.462 898.018,885.715 892.196,890.83 885.905,895.825 \n 879.216,900.718 872.202,905.529 864.935,910.274 857.487,914.974 849.932,919.645 842.34,924.308 834.784,928.98 827.336,933.679 820.069,938.425 813.055,943.235 \n 806.367,948.128 800.075,953.123 794.253,958.238 788.973,963.491 784.307,968.901 780.327,974.487 777.106,980.266 774.716,986.258 773.229,992.48 772.717,998.952 \n \n \"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 934.318,1103.78 934.604,1109.72 935.436,1115.67 936.772,1121.62 938.572,1127.58 940.797,1133.54 943.405,1139.5 946.357,1145.46 949.611,1151.43 953.128,1157.4 \n 956.867,1163.37 960.788,1169.34 964.85,1175.32 969.013,1181.29 973.237,1187.27 977.481,1193.24 981.705,1199.22 985.868,1205.19 989.93,1211.17 993.851,1217.14 \n 997.59,1223.11 1001.11,1229.08 1004.36,1235.05 1007.31,1241.01 1009.92,1246.97 1012.15,1252.93 1013.95,1258.89 1015.28,1264.84 1016.11,1270.79 1016.4,1276.73 \n \n \"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 934.318,1103.78 934.069,1110.94 933.343,1118.17 932.178,1125.48 930.607,1132.85 928.666,1140.27 926.39,1147.76 923.815,1155.29 920.976,1162.86 917.908,1170.47 \n 914.646,1178.11 911.225,1185.78 907.681,1193.46 904.049,1201.16 900.364,1208.87 896.662,1216.58 892.977,1224.29 889.345,1231.99 885.801,1239.68 882.38,1247.35 \n 879.118,1254.99 876.05,1262.6 873.211,1270.17 870.636,1277.7 868.36,1285.18 866.419,1292.61 864.848,1299.98 863.683,1307.29 862.958,1314.52 862.708,1321.68 \n \n \"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 772.717,998.952 772.626,1009.35 772.362,1019.96 771.937,1030.76 771.364,1041.75 770.657,1052.9 769.827,1064.21 768.888,1075.65 767.853,1087.2 766.735,1098.86 \n 765.545,1110.61 764.298,1122.42 763.006,1134.3 761.682,1146.21 760.339,1158.14 758.989,1170.09 757.645,1182.02 756.321,1193.93 755.029,1205.81 753.782,1217.62 \n 752.593,1229.37 751.474,1241.03 750.439,1252.58 749.5,1264.02 748.671,1275.33 747.963,1286.48 747.391,1297.47 746.966,1308.27 746.701,1318.88 746.61,1329.28 \n \n \"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 772.717,998.952 772.333,1008.16 771.215,1017.42 769.417,1026.73 766.996,1036.08 764.004,1045.48 760.495,1054.92 756.526,1064.39 752.148,1073.89 747.418,1083.42 \n 742.389,1092.97 737.115,1102.54 731.652,1112.12 726.052,1121.71 720.371,1131.31 714.663,1140.91 708.982,1150.51 703.383,1160.1 697.919,1169.69 692.646,1179.25 \n 687.617,1188.8 682.886,1198.33 678.509,1207.83 674.539,1217.31 671.031,1226.74 668.039,1236.14 665.617,1245.5 663.82,1254.81 662.702,1264.07 662.317,1273.27 \n \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM1215.78 262.317 L1208.89 250.377 L1195.1 250.377 L1188.21 262.317 L1195.1 274.257 L1208.89 274.257 L1215.78 262.317 L1215.78 262.317 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1215.78,262.317 1208.89,250.377 1195.1,250.377 1188.21,262.317 1195.1,274.257 1208.89,274.257 1215.78,262.317 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM1371.71 554.793 L1364.82 542.853 L1351.03 542.853 L1344.14 554.793 L1351.03 566.733 L1364.82 566.733 L1371.71 554.793 L1371.71 554.793 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1371.71,554.793 1364.82,542.853 1351.03,542.853 1344.14,554.793 1351.03,566.733 1364.82,566.733 1371.71,554.793 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM1062.81 541.499 L1055.92 529.558 L1042.13 529.558 L1035.24 541.499 L1042.13 553.439 L1055.92 553.439 L1062.81 541.499 L1062.81 541.499 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1062.81,541.499 1055.92,529.558 1042.13,529.558 1035.24,541.499 1042.13,553.439 1055.92,553.439 1062.81,541.499 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM1335.06 747.277 L1328.16 735.337 L1314.38 735.337 L1307.48 747.277 L1314.38 759.217 L1328.16 759.217 L1335.06 747.277 L1335.06 747.277 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1335.06,747.277 1328.16,735.337 1314.38,735.337 1307.48,747.277 1314.38,759.217 1328.16,759.217 1335.06,747.277 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM1513.62 773.725 L1506.72 761.785 L1492.94 761.785 L1486.04 773.725 L1492.94 785.665 L1506.72 785.665 L1513.62 773.725 L1513.62 773.725 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1513.62,773.725 1506.72,761.785 1492.94,761.785 1486.04,773.725 1492.94,785.665 1506.72,785.665 1513.62,773.725 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM1482.06 1036.28 L1475.16 1024.34 L1461.38 1024.34 L1454.48 1036.28 L1461.38 1048.22 L1475.16 1048.22 L1482.06 1036.28 L1482.06 1036.28 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1482.06,1036.28 1475.16,1024.34 1461.38,1024.34 1454.48,1036.28 1461.38,1048.22 1475.16,1048.22 1482.06,1036.28 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM1618.84 1139.49 L1611.94 1127.55 L1598.15 1127.55 L1591.26 1139.49 L1598.15 1151.43 L1611.94 1151.43 L1618.84 1139.49 L1618.84 1139.49 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1618.84,1139.49 1611.94,1127.55 1598.15,1127.55 1591.26,1139.49 1598.15,1151.43 1611.94,1151.43 1618.84,1139.49 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM1411.06 1297.57 L1404.17 1285.63 L1390.38 1285.63 L1383.49 1297.57 L1390.38 1309.51 L1404.17 1309.51 L1411.06 1297.57 L1411.06 1297.57 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1411.06,1297.57 1404.17,1285.63 1390.38,1285.63 1383.49,1297.57 1390.38,1309.51 1404.17,1309.51 1411.06,1297.57 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM1529.38 1337.68 L1522.48 1325.74 L1508.69 1325.74 L1501.8 1337.68 L1508.69 1349.62 L1522.48 1349.62 L1529.38 1337.68 L1529.38 1337.68 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1529.38,1337.68 1522.48,1325.74 1508.69,1325.74 1501.8,1337.68 1508.69,1349.62 1522.48,1349.62 1529.38,1337.68 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM1751.47 1325.35 L1744.58 1313.41 L1730.79 1313.41 L1723.9 1325.35 L1730.79 1337.29 L1744.58 1337.29 L1751.47 1325.35 L1751.47 1325.35 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1751.47,1325.35 1744.58,1313.41 1730.79,1313.41 1723.9,1325.35 1730.79,1337.29 1744.58,1337.29 1751.47,1325.35 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM1689.39 1321.93 L1677.39 1301.14 L1653.38 1301.14 L1641.38 1321.93 L1653.38 1342.72 L1677.39 1342.72 L1689.39 1321.93 L1689.39 1321.93 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1689.39,1321.93 1677.39,1301.14 1653.38,1301.14 1641.38,1321.93 1653.38,1342.72 1677.39,1342.72 1689.39,1321.93 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM943.559 845.001 L931.556 824.212 L907.551 824.212 L895.549 845.001 L907.551 865.79 L931.556 865.79 L943.559 845.001 L943.559 845.001 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 943.559,845.001 931.556,824.212 907.551,824.212 895.549,845.001 907.551,865.79 931.556,865.79 943.559,845.001 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM1109.75 840.7 L1097.75 819.911 L1073.74 819.911 L1061.74 840.7 L1073.74 861.489 L1097.75 861.489 L1109.75 840.7 L1109.75 840.7 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1109.75,840.7 1097.75,819.911 1073.74,819.911 1061.74,840.7 1073.74,861.489 1097.75,861.489 1109.75,840.7 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM958.323 1103.78 L946.321 1082.99 L922.316 1082.99 L910.313 1103.78 L922.316 1124.57 L946.321 1124.57 L958.323 1103.78 L958.323 1103.78 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 958.323,1103.78 946.321,1082.99 922.316,1082.99 910.313,1103.78 922.316,1124.57 946.321,1124.57 958.323,1103.78 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM796.723 998.952 L784.72 978.163 L760.715 978.163 L748.712 998.952 L760.715 1019.74 L784.72 1019.74 L796.723 998.952 L796.723 998.952 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 796.723,998.952 784.72,978.163 760.715,978.163 748.712,998.952 760.715,1019.74 784.72,1019.74 796.723,998.952 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM1040.4 1276.73 L1028.4 1255.94 L1004.4 1255.94 L992.395 1276.73 L1004.4 1297.52 L1028.4 1297.52 L1040.4 1276.73 L1040.4 1276.73 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1040.4,1276.73 1028.4,1255.94 1004.4,1255.94 992.395,1276.73 1004.4,1297.52 1028.4,1297.52 1040.4,1276.73 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM886.713 1321.68 L874.711 1300.89 L850.705 1300.89 L838.703 1321.68 L850.705 1342.47 L874.711 1342.47 L886.713 1321.68 L886.713 1321.68 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 886.713,1321.68 874.711,1300.89 850.705,1300.89 838.703,1321.68 850.705,1342.47 874.711,1342.47 886.713,1321.68 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM770.615 1329.28 L758.613 1308.49 L734.608 1308.49 L722.605 1329.28 L734.608 1350.07 L758.613 1350.07 L770.615 1329.28 L770.615 1329.28 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 770.615,1329.28 758.613,1308.49 734.608,1308.49 722.605,1329.28 734.608,1350.07 758.613,1350.07 770.615,1329.28 \n \"/>\n<path clip-path=\"url(#clip022)\" d=\"\nM686.322 1273.27 L674.32 1252.49 L650.315 1252.49 L638.312 1273.27 L650.315 1294.06 L674.32 1294.06 L686.322 1273.27 L686.322 1273.27 Z\n \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<polyline clip-path=\"url(#clip022)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 686.322,1273.27 674.32,1252.49 650.315,1252.49 638.312,1273.27 650.315,1294.06 674.32,1294.06 686.322,1273.27 \n \"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1202\" cy=\"262.317\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1357.92\" cy=\"554.793\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1049.03\" cy=\"541.499\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1321.27\" cy=\"747.277\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1499.83\" cy=\"773.725\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1468.27\" cy=\"1036.28\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1605.05\" cy=\"1139.49\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1397.27\" cy=\"1297.57\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1515.59\" cy=\"1337.68\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1737.68\" cy=\"1325.35\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1665.38\" cy=\"1321.93\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"919.554\" cy=\"845.001\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1085.74\" cy=\"840.7\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"934.318\" cy=\"1103.78\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"772.717\" cy=\"998.952\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1016.4\" cy=\"1276.73\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"862.708\" cy=\"1321.68\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"746.61\" cy=\"1329.28\" r=\"2\"/>\n<circle clip-path=\"url(#clip022)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"662.317\" cy=\"1273.27\" r=\"2\"/>\n<path clip-path=\"url(#clip020)\" d=\"M1202 249.891 Q1198.84 249.891 1197.24 253.01 Q1195.66 256.109 1195.66 262.348 Q1195.66 268.566 1197.24 271.685 Q1198.84 274.784 1202 274.784 Q1205.18 274.784 1206.76 271.685 Q1208.36 268.566 1208.36 262.348 Q1208.36 256.109 1206.76 253.01 Q1205.18 249.891 1202 249.891 M1202 246.65 Q1207.08 246.65 1209.75 250.681 Q1212.45 254.691 1212.45 262.348 Q1212.45 269.984 1209.75 274.014 Q1207.08 278.025 1202 278.025 Q1196.91 278.025 1194.22 274.014 Q1191.55 269.984 1191.55 262.348 Q1191.55 254.691 1194.22 250.681 Q1196.91 246.65 1202 246.65 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M1349.51 566.47 L1356.19 566.47 L1356.19 543.4 L1348.92 544.858 L1348.92 541.132 L1356.15 539.673 L1360.24 539.673 L1360.24 566.47 L1366.93 566.47 L1366.93 569.913 L1349.51 569.913 L1349.51 566.47 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M1044.35 553.175 L1058.63 553.175 L1058.63 556.619 L1039.43 556.619 L1039.43 553.175 Q1041.76 550.765 1045.77 546.714 Q1049.8 542.643 1050.83 541.468 Q1052.79 539.26 1053.56 537.741 Q1054.35 536.202 1054.35 534.723 Q1054.35 532.313 1052.65 530.794 Q1050.97 529.275 1048.26 529.275 Q1046.33 529.275 1044.19 529.943 Q1042.06 530.612 1039.63 531.969 L1039.63 527.837 Q1042.1 526.844 1044.25 526.338 Q1046.39 525.832 1048.18 525.832 Q1052.88 525.832 1055.67 528.181 Q1058.47 530.531 1058.47 534.46 Q1058.47 536.323 1057.76 538.005 Q1057.07 539.665 1055.23 541.934 Q1054.72 542.521 1052 545.337 Q1049.29 548.132 1044.35 553.175 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M1324.99 746.092 Q1327.92 746.72 1329.56 748.705 Q1331.23 750.69 1331.23 753.606 Q1331.23 758.083 1328.15 760.533 Q1325.07 762.984 1319.4 762.984 Q1317.49 762.984 1315.47 762.599 Q1313.46 762.235 1311.32 761.485 L1311.32 757.536 Q1313.02 758.528 1315.04 759.035 Q1317.07 759.541 1319.28 759.541 Q1323.12 759.541 1325.13 758.022 Q1327.15 756.503 1327.15 753.606 Q1327.15 750.933 1325.27 749.434 Q1323.41 747.915 1320.07 747.915 L1316.54 747.915 L1316.54 744.553 L1320.23 744.553 Q1323.25 744.553 1324.85 743.358 Q1326.45 742.142 1326.45 739.874 Q1326.45 737.545 1324.78 736.309 Q1323.14 735.053 1320.07 735.053 Q1318.38 735.053 1316.46 735.418 Q1314.54 735.782 1312.23 736.552 L1312.23 732.906 Q1314.56 732.258 1316.58 731.934 Q1318.63 731.61 1320.43 731.61 Q1325.09 731.61 1327.8 733.737 Q1330.52 735.843 1330.52 739.449 Q1330.52 741.96 1329.08 743.702 Q1327.64 745.424 1324.99 746.092 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M1502.46 762.17 L1492.13 778.313 L1502.46 778.313 L1502.46 762.17 M1501.39 758.605 L1506.54 758.605 L1506.54 778.313 L1510.85 778.313 L1510.85 781.716 L1506.54 781.716 L1506.54 788.845 L1502.46 788.845 L1502.46 781.716 L1488.81 781.716 L1488.81 777.766 L1501.39 758.605 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M1459.76 1021.16 L1475.83 1021.16 L1475.83 1024.61 L1463.51 1024.61 L1463.51 1032.02 Q1464.4 1031.72 1465.29 1031.57 Q1466.18 1031.41 1467.08 1031.41 Q1472.14 1031.41 1475.1 1034.19 Q1478.05 1036.96 1478.05 1041.7 Q1478.05 1046.58 1475.02 1049.3 Q1471.98 1051.99 1466.45 1051.99 Q1464.54 1051.99 1462.56 1051.67 Q1460.59 1051.34 1458.49 1050.7 L1458.49 1046.58 Q1460.31 1047.58 1462.26 1048.06 Q1464.2 1048.55 1466.37 1048.55 Q1469.87 1048.55 1471.92 1046.7 Q1473.96 1044.86 1473.96 1041.7 Q1473.96 1038.54 1471.92 1036.7 Q1469.87 1034.86 1466.37 1034.86 Q1464.73 1034.86 1463.09 1035.22 Q1461.47 1035.59 1459.76 1036.35 L1459.76 1021.16 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M1605.4 1137.86 Q1602.65 1137.86 1601.03 1139.74 Q1599.43 1141.63 1599.43 1144.91 Q1599.43 1148.17 1601.03 1150.07 Q1602.65 1151.96 1605.4 1151.96 Q1608.16 1151.96 1609.76 1150.07 Q1611.38 1148.17 1611.38 1144.91 Q1611.38 1141.63 1609.76 1139.74 Q1608.16 1137.86 1605.4 1137.86 M1613.52 1125.04 L1613.52 1128.77 Q1611.98 1128.04 1610.41 1127.65 Q1608.85 1127.27 1607.31 1127.27 Q1603.26 1127.27 1601.11 1130 Q1598.98 1132.74 1598.68 1138.27 Q1599.87 1136.5 1601.68 1135.57 Q1603.48 1134.62 1605.65 1134.62 Q1610.2 1134.62 1612.84 1137.39 Q1615.49 1140.15 1615.49 1144.91 Q1615.49 1149.57 1612.73 1152.38 Q1609.98 1155.2 1605.4 1155.2 Q1600.16 1155.2 1597.38 1151.19 Q1594.61 1147.16 1594.61 1139.52 Q1594.61 1132.35 1598.01 1128.1 Q1601.41 1123.82 1607.14 1123.82 Q1608.68 1123.82 1610.24 1124.13 Q1611.82 1124.43 1613.52 1125.04 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M1387.55 1282.45 L1407 1282.45 L1407 1284.19 L1396.02 1312.69 L1391.74 1312.69 L1402.07 1285.89 L1387.55 1285.89 L1387.55 1282.45 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M1515.59 1338.44 Q1512.67 1338.44 1510.99 1340 Q1509.33 1341.56 1509.33 1344.3 Q1509.33 1347.03 1510.99 1348.59 Q1512.67 1350.15 1515.59 1350.15 Q1518.5 1350.15 1520.19 1348.59 Q1521.87 1347.01 1521.87 1344.3 Q1521.87 1341.56 1520.19 1340 Q1518.52 1338.44 1515.59 1338.44 M1511.5 1336.7 Q1508.86 1336.05 1507.38 1334.25 Q1505.93 1332.45 1505.93 1329.85 Q1505.93 1326.23 1508.5 1324.12 Q1511.09 1322.02 1515.59 1322.02 Q1520.1 1322.02 1522.68 1324.12 Q1525.25 1326.23 1525.25 1329.85 Q1525.25 1332.45 1523.77 1334.25 Q1522.31 1336.05 1519.7 1336.7 Q1522.66 1337.39 1524.3 1339.39 Q1525.96 1341.4 1525.96 1344.3 Q1525.96 1348.69 1523.26 1351.04 Q1520.59 1353.39 1515.59 1353.39 Q1510.59 1353.39 1507.89 1351.04 Q1505.22 1348.69 1505.22 1344.3 Q1505.22 1341.4 1506.88 1339.39 Q1508.54 1337.39 1511.5 1336.7 M1510 1330.24 Q1510 1332.59 1511.46 1333.91 Q1512.93 1335.22 1515.59 1335.22 Q1518.22 1335.22 1519.7 1333.91 Q1521.2 1332.59 1521.2 1330.24 Q1521.2 1327.89 1519.7 1326.57 Q1518.22 1325.26 1515.59 1325.26 Q1512.93 1325.26 1511.46 1326.57 Q1510 1327.89 1510 1330.24 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M1729.2 1339.84 L1729.2 1336.12 Q1730.74 1336.85 1732.32 1337.23 Q1733.9 1337.62 1735.41 1337.62 Q1739.47 1337.62 1741.59 1334.9 Q1743.74 1332.17 1744.04 1326.62 Q1742.87 1328.36 1741.07 1329.29 Q1739.26 1330.22 1737.08 1330.22 Q1732.54 1330.22 1729.88 1327.49 Q1727.25 1324.73 1727.25 1319.97 Q1727.25 1315.32 1730.01 1312.5 Q1732.76 1309.68 1737.34 1309.68 Q1742.58 1309.68 1745.34 1313.72 Q1748.11 1317.73 1748.11 1325.38 Q1748.11 1332.53 1744.71 1336.81 Q1741.33 1341.06 1735.6 1341.06 Q1734.06 1341.06 1732.48 1340.75 Q1730.9 1340.45 1729.2 1339.84 M1737.34 1327.02 Q1740.09 1327.02 1741.69 1325.14 Q1743.31 1323.25 1743.31 1319.97 Q1743.31 1316.71 1741.69 1314.83 Q1740.09 1312.93 1737.34 1312.93 Q1734.58 1312.93 1732.96 1314.83 Q1731.36 1316.71 1731.36 1319.97 Q1731.36 1323.25 1732.96 1325.14 Q1734.58 1327.02 1737.34 1327.02 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M1643.24 1333.6 L1649.92 1333.6 L1649.92 1310.53 L1642.65 1311.99 L1642.65 1308.27 L1649.88 1306.81 L1653.97 1306.81 L1653.97 1333.6 L1660.66 1333.6 L1660.66 1337.05 L1643.24 1337.05 L1643.24 1333.6 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M1677.67 1309.5 Q1674.51 1309.5 1672.91 1312.62 Q1671.33 1315.72 1671.33 1321.96 Q1671.33 1328.18 1672.91 1331.29 Q1674.51 1334.39 1677.67 1334.39 Q1680.85 1334.39 1682.43 1331.29 Q1684.03 1328.18 1684.03 1321.96 Q1684.03 1315.72 1682.43 1312.62 Q1680.85 1309.5 1677.67 1309.5 M1677.67 1306.26 Q1682.75 1306.26 1685.43 1310.29 Q1688.12 1314.3 1688.12 1321.96 Q1688.12 1329.59 1685.43 1333.62 Q1682.75 1337.63 1677.67 1337.63 Q1672.59 1337.63 1669.89 1333.62 Q1667.22 1329.59 1667.22 1321.96 Q1667.22 1314.3 1669.89 1310.29 Q1672.59 1306.26 1677.67 1306.26 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M897.942 856.678 L904.626 856.678 L904.626 833.608 L897.355 835.066 L897.355 831.339 L904.586 829.881 L908.677 829.881 L908.677 856.678 L915.361 856.678 L915.361 860.121 L897.942 860.121 L897.942 856.678 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M924.334 856.678 L931.018 856.678 L931.018 833.608 L923.747 835.066 L923.747 831.339 L930.977 829.881 L935.069 829.881 L935.069 856.678 L941.753 856.678 L941.753 860.121 L924.334 860.121 L924.334 856.678 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M1064.29 852.377 L1070.98 852.377 L1070.98 829.307 L1063.71 830.765 L1063.71 827.038 L1070.94 825.58 L1075.03 825.58 L1075.03 852.377 L1081.71 852.377 L1081.71 855.82 L1064.29 855.82 L1064.29 852.377 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M1093.5 852.377 L1107.78 852.377 L1107.78 855.82 L1088.58 855.82 L1088.58 852.377 Q1090.91 849.966 1094.92 845.916 Q1098.95 841.844 1099.98 840.67 Q1101.95 838.462 1102.72 836.943 Q1103.51 835.403 1103.51 833.925 Q1103.51 831.515 1101.81 829.995 Q1100.12 828.476 1097.41 828.476 Q1095.49 828.476 1093.34 829.145 Q1091.21 829.813 1088.78 831.17 L1088.78 827.038 Q1091.25 826.046 1093.4 825.54 Q1095.55 825.033 1097.33 825.033 Q1102.03 825.033 1104.82 827.383 Q1107.62 829.732 1107.62 833.662 Q1107.62 835.525 1106.91 837.206 Q1106.22 838.867 1104.38 841.135 Q1103.87 841.723 1101.16 844.538 Q1098.44 847.333 1093.5 852.377 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M912.453 1115.45 L919.137 1115.45 L919.137 1092.38 L911.866 1093.84 L911.866 1090.12 L919.097 1088.66 L923.188 1088.66 L923.188 1115.45 L929.872 1115.45 L929.872 1118.9 L912.453 1118.9 L912.453 1115.45 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M950.532 1102.59 Q953.469 1103.22 955.109 1105.21 Q956.77 1107.19 956.77 1110.11 Q956.77 1114.58 953.692 1117.03 Q950.613 1119.49 944.942 1119.49 Q943.038 1119.49 941.012 1119.1 Q939.007 1118.74 936.86 1117.99 L936.86 1114.04 Q938.561 1115.03 940.587 1115.54 Q942.612 1116.04 944.82 1116.04 Q948.668 1116.04 950.674 1114.52 Q952.699 1113 952.699 1110.11 Q952.699 1107.43 950.815 1105.93 Q948.952 1104.42 945.61 1104.42 L942.086 1104.42 L942.086 1101.05 L945.772 1101.05 Q948.79 1101.05 950.39 1099.86 Q951.99 1098.64 951.99 1096.37 Q951.99 1094.05 950.329 1092.81 Q948.689 1091.55 945.61 1091.55 Q943.929 1091.55 942.005 1091.92 Q940.081 1092.28 937.772 1093.05 L937.772 1089.41 Q940.101 1088.76 942.126 1088.44 Q944.172 1088.11 945.975 1088.11 Q950.633 1088.11 953.347 1090.24 Q956.061 1092.34 956.061 1095.95 Q956.061 1098.46 954.623 1100.2 Q953.185 1101.92 950.532 1102.59 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M750.356 1010.63 L757.04 1010.63 L757.04 987.559 L749.769 989.017 L749.769 985.291 L757 983.832 L761.091 983.832 L761.091 1010.63 L767.775 1010.63 L767.775 1014.07 L750.356 1014.07 L750.356 1010.63 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M787.28 987.397 L776.951 1003.54 L787.28 1003.54 L787.28 987.397 M786.207 983.832 L791.352 983.832 L791.352 1003.54 L795.666 1003.54 L795.666 1006.94 L791.352 1006.94 L791.352 1014.07 L787.28 1014.07 L787.28 1006.94 L773.629 1006.94 L773.629 1002.99 L786.207 983.832 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M994.687 1288.41 L1001.37 1288.41 L1001.37 1265.34 L994.1 1266.8 L994.1 1263.07 L1001.33 1261.61 L1005.42 1261.61 L1005.42 1288.41 L1012.11 1288.41 L1012.11 1291.85 L994.687 1291.85 L994.687 1288.41 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M1020.41 1261.61 L1036.47 1261.61 L1036.47 1265.06 L1024.16 1265.06 L1024.16 1272.47 Q1025.05 1272.17 1025.94 1272.02 Q1026.83 1271.86 1027.72 1271.86 Q1032.79 1271.86 1035.74 1274.64 Q1038.7 1277.41 1038.7 1282.15 Q1038.7 1287.03 1035.66 1289.75 Q1032.62 1292.44 1027.09 1292.44 Q1025.19 1292.44 1023.21 1292.12 Q1021.24 1291.79 1019.13 1291.14 L1019.13 1287.03 Q1020.96 1288.02 1022.9 1288.51 Q1024.85 1289 1027.01 1289 Q1030.52 1289 1032.56 1287.15 Q1034.61 1285.31 1034.61 1282.15 Q1034.61 1278.99 1032.56 1277.15 Q1030.52 1275.3 1027.01 1275.3 Q1025.37 1275.3 1023.73 1275.67 Q1022.11 1276.03 1020.41 1276.8 L1020.41 1261.61 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M840.489 1333.36 L847.173 1333.36 L847.173 1310.29 L839.901 1311.74 L839.901 1308.02 L847.132 1306.56 L851.224 1306.56 L851.224 1333.36 L857.908 1333.36 L857.908 1336.8 L840.489 1336.8 L840.489 1333.36 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M875.428 1320.05 Q872.673 1320.05 871.053 1321.93 Q869.453 1323.82 869.453 1327.1 Q869.453 1330.36 871.053 1332.26 Q872.673 1334.15 875.428 1334.15 Q878.182 1334.15 879.783 1332.26 Q881.403 1330.36 881.403 1327.1 Q881.403 1323.82 879.783 1321.93 Q878.182 1320.05 875.428 1320.05 M883.55 1307.23 L883.55 1310.95 Q882.011 1310.23 880.431 1309.84 Q878.871 1309.46 877.332 1309.46 Q873.281 1309.46 871.134 1312.19 Q869.007 1314.92 868.703 1320.45 Q869.898 1318.69 871.701 1317.76 Q873.504 1316.81 875.671 1316.81 Q880.228 1316.81 882.861 1319.58 Q885.515 1322.34 885.515 1327.1 Q885.515 1331.76 882.76 1334.57 Q880.005 1337.39 875.428 1337.39 Q870.182 1337.39 867.407 1333.38 Q864.632 1329.35 864.632 1321.71 Q864.632 1314.54 868.035 1310.29 Q871.438 1306.01 877.17 1306.01 Q878.709 1306.01 880.269 1306.32 Q881.848 1306.62 883.55 1307.23 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M724.857 1340.95 L731.541 1340.95 L731.541 1317.88 L724.27 1319.34 L724.27 1315.62 L731.5 1314.16 L735.592 1314.16 L735.592 1340.95 L742.276 1340.95 L742.276 1344.4 L724.857 1344.4 L724.857 1340.95 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M749.507 1314.16 L768.951 1314.16 L768.951 1315.9 L757.973 1344.4 L753.699 1344.4 L764.029 1317.6 L749.507 1317.6 L749.507 1314.16 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M640.209 1284.95 L646.893 1284.95 L646.893 1261.88 L639.622 1263.34 L639.622 1259.61 L646.853 1258.15 L650.944 1258.15 L650.944 1284.95 L657.628 1284.95 L657.628 1288.39 L640.209 1288.39 L640.209 1284.95 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip020)\" d=\"M674.642 1274.03 Q671.725 1274.03 670.044 1275.59 Q668.383 1277.15 668.383 1279.89 Q668.383 1282.62 670.044 1284.18 Q671.725 1285.74 674.642 1285.74 Q677.559 1285.74 679.24 1284.18 Q680.921 1282.6 680.921 1279.89 Q680.921 1277.15 679.24 1275.59 Q677.579 1274.03 674.642 1274.03 M670.551 1272.29 Q667.918 1271.64 666.439 1269.84 Q664.981 1268.04 664.981 1265.45 Q664.981 1261.82 667.553 1259.71 Q670.146 1257.61 674.642 1257.61 Q679.159 1257.61 681.731 1259.71 Q684.303 1261.82 684.303 1265.45 Q684.303 1268.04 682.825 1269.84 Q681.367 1271.64 678.754 1272.29 Q681.711 1272.98 683.352 1274.99 Q685.012 1276.99 685.012 1279.89 Q685.012 1284.28 682.319 1286.63 Q679.645 1288.98 674.642 1288.98 Q669.639 1288.98 666.945 1286.63 Q664.272 1284.28 664.272 1279.89 Q664.272 1276.99 665.933 1274.99 Q667.594 1272.98 670.551 1272.29 M669.052 1265.83 Q669.052 1268.18 670.51 1269.5 Q671.989 1270.81 674.642 1270.81 Q677.275 1270.81 678.754 1269.5 Q680.253 1268.18 680.253 1265.83 Q680.253 1263.48 678.754 1262.17 Q677.275 1260.85 674.642 1260.85 Q671.989 1260.85 670.51 1262.17 Q669.052 1263.48 669.052 1265.83 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /></svg>\n"
},
"execution_count": 17,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/test.opb\")\n",
"graphplot(trParentnodes, trChildnodes, names = trNamenodes, method = :tree)"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"# # on teste de résoudre tous les fichiers .opb\n",
"# for (root, dirs, files) in walkdir(\"data\")\n",
"# for file in files\n",
"# if endswith(file, \".opb\")\n",
"# SolveKnapInstance(root * \"/\" * file)\n",
"# end\n",
"# end\n",
"# end"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.6.3",
"language": "julia",
"name": "julia-1.6"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.6.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}