From 75e9c40e9f52ae8c1229ac8bc51a0719f9afb621 Mon Sep 17 00:00:00 2001 From: gdamms Date: Sat, 27 Nov 2021 11:44:55 +0100 Subject: [PATCH] TP almost done | TODO : rapport, bonus --- notebook.ipynb | 94 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 61 insertions(+), 33 deletions(-) diff --git a/notebook.ipynb b/notebook.ipynb index d299f27..7dda3e5 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -140,13 +140,12 @@ " if affich\n", " println(\"TR : solution \", \" de profit \", Objective(x, price))\n", " end\n", - " #if (value(benef) >= BestProfit)\n", - " if (Objective(x, price) >= BestProfit)\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", " end\n", + " # On remplace la solution et le profit par les nouvelles valeurs\n", " Bestsol = x\n", - " #BestProfit=value(benef)\n", " BestProfit = Objective(x, price)\n", " else\n", " if affich\n", @@ -191,47 +190,60 @@ "source": [ "\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 et choisir un noeud-fils le plus à gauche \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", - " n = length(predX)\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 in 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", + " # On ajoute les sous-noeuds a la pile des noeuds a explorer\n", " push!(listvars, nextX1)\n", " push!(listvars, nextX0)\n", + "\n", + " # On ajoute aussi leurs valeurs\n", " push!(listvals, val1)\n", " push!(listvals, val0)\n", + "\n", " listvars, listvals\n", "end\n", "\n", "\n", "function ExplorerAutreNoeud_relaxlin(listvars, listvals)\n", - " # this node is sondable, go back to parent node then right child if possible\n", + " # Le noeud est sondable, on l'enlève de la pile des noeuds à sonder\n", " \n", " stop = false\n", - " # check if we are not at the root node\n", " if (length(listvars) > 1)\n", - " # go back to parent node\n", + " # On passe au noeud suivant\n", " var = pop!(listvars)\n", " val = pop!(listvals)\n", " else\n", - " # the root node was sondable\n", + " # Il n'y a pas d'autre noeud\n", " println(\"\\nFINISHED\")\n", " stop = true\n", " end\n", + "\n", " listvars, listvals, stop \n", "end" ] @@ -253,7 +265,7 @@ } ], "source": [ - "# fonction objectif que l'on souhaite maximiser/minimiser\n", + "# 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", @@ -264,7 +276,7 @@ " for i in 1:length(x)\n", " )\n", "\n", - "# fonction permettant de vérfier toutes les contraintes du modèle\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", @@ -275,7 +287,7 @@ " for i in 1:length(x)\n", " ) <= capacity\n", "\n", - "\n", + "# Fonction qui nous dis si toutes les variables de x sont fixées\n", "function AllDef(x)\n", " for i in 1:length(x)\n", " if x[i] < 0\n", @@ -288,21 +300,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [ { - "ename": "Error", - "evalue": "Session cannot generate requests", - "output_type": "error", - "traceback": [ - "Error: Session cannot generate requests", - "at S.executeCodeCell (/home/damien/.vscode/extensions/ms-toolsai.jupyter-2021.10.1101450599/out/client/extension.js:66:301742)", - "at S.execute (/home/damien/.vscode/extensions/ms-toolsai.jupyter-2021.10.1101450599/out/client/extension.js:66:300732)", - "at S.start (/home/damien/.vscode/extensions/ms-toolsai.jupyter-2021.10.1101450599/out/client/extension.js:66:296408)", - "at processTicksAndRejections (internal/process/task_queues.js:93:5)", - "at async t.CellExecutionQueue.executeQueuedCells (/home/damien/.vscode/extensions/ms-toolsai.jupyter-2021.10.1101450599/out/client/extension.js:66:312326)", - "at async t.CellExecutionQueue.start (/home/damien/.vscode/extensions/ms-toolsai.jupyter-2021.10.1101450599/out/client/extension.js:66:311862)" + "name": "stdout", + "output_type": "stream", + "text": [ + "Capacity : 994 | Number of objects : 50\n", + "\n", + "----------\n", + "Node n°1001 : \n", + "\n", + "Previous Solution memorized with bestprofit 994\n", + "\n", + "non sondable\n", + "\n", + "\n", + "\n", + "FINISHED\n", + "\n", + "******\n", + "\n", + "Optimal value = 994\n", + "\n", + "Optimal x=[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\n" ] } ], @@ -313,26 +335,26 @@ "\n", " println(\"Capacity : \", capacity, \" | Number of objects : \", length(price), \"\\n\")\n", "\n", - " #create the structure to memorize the search tree for visualization at the end\n", - " trParentnodes=Int64[] #will store orig node of arc in search tree\n", - " trChildnodes=Int64[] #will store destination node of arc in search tree\n", - " trNamenodes=[] #will store names of nodes in search tree\n", - " \n", - " #intermediate structure to navigate in the search tree\n", + " # Liste des variable pour naviguer de noeuds en noeuds\n", " listvars=[]\n", " listvals=[]\n", "\n", + " # La meilleur solution et sa valeur\n", " BestProfit=-1\n", " Bestsol=[]\n", "\n", - " current_node_number=0\n", + " # Compter le nombre de noeud explorés\n", + " current_node_number = 0\n", + "\n", " stop = false\n", " affich = false\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", "\n", " while (!stop)\n", + " # Le noeud actuel\n", " x = last(listvars)\n", "\n", " if affich\n", @@ -341,20 +363,26 @@ " println(\"\\nPrevious 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", " else\n", + " # Le noeud est sondable, on passe au noeud suivant\n", " listvars, listvals, stop = ExplorerAutreNoeud_relaxlin(listvars, listvals)\n", " end\n", "\n", - " if current_node_number % 1000000 == 1000\n", + " # On évite de spammer l'output donc on n'affiche pas tout les résultats\n", + " if current_node_number % 1000000 == 100\n", " affich = true\n", " else\n", " affich = false\n", " end\n", + "\n", " current_node_number += 1\n", " end\n", "\n", @@ -362,7 +390,7 @@ "\n", "end\n", "\n", - "SolveKnapInstance(\"data/subset_sum/knapPI_6_100_10000_2_-10726.opb\")" + "SolveKnapInstance(\"data/subset_sum/knapPI_6_50_1000_1_-994.opb\")" ] }, {