diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cd0d6d7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +*.lp +*.stdout +*.sol diff --git a/distrib.py b/distrib.py index 4bba1f0..3545ad0 100644 --- a/distrib.py +++ b/distrib.py @@ -15,3 +15,15 @@ while len(result) > 0: cmd = f"""ssh lfainsin@{victime} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" -o "UserKnownHostsFile /dev/null" "cd 2A/RO/tp2/ && tmux new-session -d 'julia test.jl {knap}.opb > {knap}.stdout'" """ print(cmd) os.system(cmd) + +i = 0 +while len(result) > 0: + knap = result.pop()[:-4] + victime = machines[i % len(machines)] + i+=1 + cmd = f"""ssh lfainsin@{victime} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" -o "UserKnownHostsFile /dev/null" "cd 2A/RO/tp2/ && tmux new-session -d 'glpsol --lp {knap}.lp -o {knap}.sol'" """ + print(cmd) + os.system(cmd) + +# for machine in machines: +# os.system(f"""ssh lfainsin@{machine} -o "ConnectTimeout 3" -o "StrictHostKeyChecking no" -o "UserKnownHostsFile /dev/null" "tmux kill-server" """) diff --git a/notebook.ipynb b/notebook.ipynb index 171bdbc..17a5646 100644 --- a/notebook.ipynb +++ b/notebook.ipynb @@ -54,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 1, "metadata": {}, "outputs": [ { @@ -106,15 +106,38 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ - "# on teste de lire tous les fichiers .opb\n", + "# on convert tous les .opb en .lp pour les utiliser dans glpk\n", "for (root, dirs, files) in walkdir(\"data\")\n", " for file in files\n", " if endswith(file, \".opb\")\n", - " readKnapInstance(root * \"/\" * file)\n", + " price, weight, capacity = readKnapInstance(root * \"/\" * file)\n", + " filename = splitext(file)[1]\n", + " f = open(root * \"/\" * filename * \".lp\", \"w\");\n", + " write(f, \"Maximize\\n\")\n", + " write(f, \" Knap: \")\n", + " for (i, p) in enumerate(price)\n", + " write(f, \"+ \" * string(p) * \" obj\" * string(i) * \" \")\n", + " end\n", + " write(f, \"\\n\")\n", + "\n", + " write(f, \"\\nSubject To\\n\")\n", + " write(f, \" MaxKnap: \")\n", + " for (i, w) in enumerate(weight)\n", + " write(f, \"+ \" * string(w) * \" obj\" * string(i) * \" \")\n", + " end\n", + " write(f, \"\\n\")\n", + "\n", + " write(f, \"\\nBinary\\n\")\n", + " for (i, p) in enumerate(price)\n", + " write(f, \" obj\" * string(i) * \"\\n\")\n", + " end\n", + "\n", + " write(f, \"\\nEnd\\n\")\n", + " close(f)\n", " end\n", " end\n", "end" @@ -2047,7 +2070,6 @@ "Notre vecteur de décision $x$ est tel que $x\\in\\{-1,0,1\\}^n$ avec $n$ le nombre d'objets disponibles. $1$ et $0$ représente, respectivement, un objet non-pris ou non-pris. La valeur $-1$ représente un objet ou la décision n'a pas encore été faite.\n", "Dans la fonction `Objetive`, si la valeur est a $-1$, on fait comme-ci elle était à $1$ pourcalculer une borne supérieur. Dans la fonction `Constraints` les $-1$ sont concidéré comme des $0$ pour avoir une borne inférieur de notre problème.\n", "\n", - "
\n", "Pour l'exploration et la création de noeud, nous faisons une exploration des noeuds avec le plus de $1$ en premier.\n", "\n", "Lorsque nous arrivons sur un noeud, nous l'enlevons de la pile des noeuds. Nous calculons ensuite si il est \"trivial\" ou si il dépasse déjà l'une des bornes ou si il est divisible. Dans le cas ou il est \"trivial\", nous calculons sa valeur et remplaçons la meilleure valeur si nécessaire. Dans le cas ou il dépasse une borne, nous l'abandonnons. Et enfin, si il est séparable, nous le séparons en deux en ajoutant la pile des noeuds les deux sous noeuds.\n",