feat: conversion de tous les .opb en .lp pour glpk

This commit is contained in:
Laureηt 2021-12-09 15:43:05 +01:00
parent a5fdac8a7a
commit 0c68cbcfaa
3 changed files with 42 additions and 5 deletions

3
.gitignore vendored Normal file
View file

@ -0,0 +1,3 @@
*.lp
*.stdout
*.sol

View file

@ -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" """)

View file

@ -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",
"<br>\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",