From 329cd2a67b379a4f57d56ae256916078dcdc0cb4 Mon Sep 17 00:00:00 2001 From: Laurent Fainsin Date: Thu, 9 Dec 2021 11:56:07 +0100 Subject: [PATCH] spam incomming, sry la dsi Co-authored-by: gdamms --- distrib.py | 17 +++ machines.txt | 252 +++++++++++++++++++++++++++++++++++++++++++++ prog.jl => test.jl | 138 +++++++------------------ 3 files changed, 304 insertions(+), 103 deletions(-) create mode 100644 distrib.py create mode 100644 machines.txt rename prog.jl => test.jl (58%) diff --git a/distrib.py b/distrib.py new file mode 100644 index 0000000..c6ec638 --- /dev/null +++ b/distrib.py @@ -0,0 +1,17 @@ +PATH = "data" + +import os +result = [os.path.join(dp, f) for dp, dn, filenames in os.walk(PATH) for f in filenames if os.path.splitext(f)[1] == '.opb'] + +with open("machines.txt") as file: + machines = file.readlines() + machines = [machine.rstrip() for machine in machines] + +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" "cd 2A/RO/tp2/ && tmux new-session -d 'julia test.jl {knap}.opb > {knap}.stdout'" """ + print(cmd) + os.system(cmd) diff --git a/machines.txt b/machines.txt new file mode 100644 index 0000000..4d9414e --- /dev/null +++ b/machines.txt @@ -0,0 +1,252 @@ +ablette.enseeiht.fr +acdc.enseeiht.fr +ackbar.enseeiht.fr +actinium.enseeiht.fr +ader.enseeiht.fr +aerosmith.enseeiht.fr +alose.enseeiht.fr +anguille.enseeiht.fr +antimoine.enseeiht.fr +apollinaire.enseeiht.fr +aragorn.enseeiht.fr +archimede.enseeiht.fr +arryn.enseeiht.fr +arwen.enseeiht.fr +aspicot.enseeiht.fr +aston.enseeiht.fr +atanasoff.enseeiht.fr +atkinson.enseeiht.fr +azote.enseeiht.fr +babagge.enseeiht.fr +backus.enseeiht.fr +banshee.enseeiht.fr +baratheon.enseeiht.fr +basilic.enseeiht.fr +bastie.enseeiht.fr +baudelaire.enseeiht.fr +behemot.enseeiht.fr +bilbo.enseeiht.fr +bishop.enseeiht.fr +bleriot.enseeiht.fr +bobafett.enseeiht.fr +boeing.enseeiht.fr +bonite.enseeiht.fr +boole.enseeiht.fr +boromir.enseeiht.fr +bouba.enseeiht.fr +boucher.enseeiht.fr +brassens.enseeiht.fr +bravoos.enseeiht.fr +brochet.enseeiht.fr +bulbizarre.enseeiht.fr +cable.enseeiht.fr +calimero.enseeiht.fr +candy.enseeiht.fr +carapuce.enseeiht.fr +carbone.enseeiht.fr +carmack.enseeiht.fr +carpe.enseeiht.fr +casimir.enseeiht.fr +chenipan.enseeiht.fr +chevesne.enseeiht.fr +chewie.enseeiht.fr +clapton.enseeiht.fr +clash.enseeiht.fr +clementine.enseeiht.fr +cobalt.enseeiht.fr +colossus.enseeiht.fr +cooper.enseeiht.fr +copernic.enseeiht.fr +corb.enseeiht.fr +cyclope.enseeiht.fr +dagobah.enseeiht.fr +darwin.enseeiht.fr +daurade.enseeiht.fr +dazzler.enseeiht.fr +deeppurple.enseeiht.fr +demusset.enseeiht.fr +descartes.enseeiht.fr +diabolo.enseeiht.fr +dijkstra.enseeiht.fr +doors.enseeiht.fr +dorne.enseeiht.fr +dragon.enseeiht.fr +dylan.enseeiht.fr +eagles.enseeiht.fr +edison.enseeiht.fr +einsten.enseeiht.fr +elrond.enseeiht.fr +eomer.enseeiht.fr +eowyn.enseeiht.fr +eperlan.enseeiht.fr +epica.enseeiht.fr +esteban.enseeiht.fr +ewok.enseeiht.fr +farman.enseeiht.fr +fermat.enseeiht.fr +ferre.enseeiht.fr +fletan.enseeiht.fr +fluor.enseeiht.fr +forge.enseeiht.fr +frodon.enseeiht.fr +galilee.enseeiht.fr +galium.enseeiht.fr +gambit.enseeiht.fr +gandalf.enseeiht.fr +gardon.enseeiht.fr +garros.enseeiht.fr +gautier.enseeiht.fr +gimli.enseeiht.fr +gobelin.enseeiht.fr +gobie.enseeiht.fr +goldorak.enseeiht.fr +gorgone.enseeiht.fr +gosling.enseeiht.fr +goujon.enseeiht.fr +greyjoy.enseeiht.fr +griffon.enseeiht.fr +grove.enseeiht.fr +guynemer.enseeiht.fr +havok.enseeiht.fr +hawking.enseeiht.fr +heidi.enseeiht.fr +hendrix.enseeiht.fr +hippogriffe.enseeiht.fr +hopper.enseeiht.fr +hugo.enseeiht.fr +hydre.enseeiht.fr +hypotrempe.enseeiht.fr +iceberg.enseeiht.fr +iode.enseeiht.fr +jabba.enseeiht.fr +jeangrey.enseeiht.fr +jobs.enseeiht.fr +jubele.enseeiht.fr +kenobi.enseeiht.fr +kepler.enseeiht.fr +kernighan.enseeiht.fr +kiss.enseeiht.fr +knuth.enseeiht.fr +ladyoscar.enseeiht.fr +lafontaine.enseeiht.fr +lamartine.enseeiht.fr +lando.enseeiht.fr +lannister.enseeiht.fr +latecoere.enseeiht.fr +legolas.enseeiht.fr +leia.enseeiht.fr +lindbergh.enseeiht.fr +liskov.enseeiht.fr +loureed.enseeiht.fr +lovelace.enseeiht.fr +luke.enseeiht.fr +magicarpe.enseeiht.fr +magma.enseeiht.fr +magneto.enseeiht.fr +malicia.enseeiht.fr +mallarme.enseeiht.fr +manticore.enseeiht.fr +marcheursblancs.enseeiht.fr +martell.enseeiht.fr +maupassant.enseeiht.fr +maya.enseeiht.fr +meeren.enseeiht.fr +melofee.enseeiht.fr +mermoz.enseeiht.fr +merry.enseeiht.fr +messerschmitt.enseeiht.fr +metallica.enseeiht.fr +minotaure.enseeiht.fr +mordocet.enseeiht.fr +motorhead.enseeiht.fr +murdock.enseeiht.fr +muse.enseeiht.fr +mystique.enseeiht.fr +neon.enseeiht.fr +nerophis.enseeiht.fr +neumann.enseeiht.fr +newton.enseeiht.fr +nickel.enseeiht.fr +nymphe.enseeiht.fr +ohm.enseeiht.fr +omble.enseeiht.fr +orphie.enseeiht.fr +oxygene.enseeiht.fr +palomete.enseeiht.fr +palpatine.enseeiht.fr +pascal.enseeiht.fr +pegase.enseeiht.fr +phenix.enseeiht.fr +phosphore.enseeiht.fr +piafabec.enseeiht.fr +pikachu.enseeiht.fr +pinkfloyd.enseeiht.fr +pippin.enseeiht.fr +poe.enseeiht.fr +polaris.enseeiht.fr +polonium.enseeiht.fr +portreal.enseeiht.fr +prevert.enseeiht.fr +psykokwak.enseeiht.fr +psylocke.enseeiht.fr +queen.enseeiht.fr +r2d2.enseeiht.fr +rattata.enseeiht.fr +rimbaud.enseeiht.fr +rocket.enseeiht.fr +rondoudou.enseeiht.fr +roucool.enseeiht.fr +rouget.enseeiht.fr +saintexupery.enseeiht.fr +salameche.enseeiht.fr +sam.enseeiht.fr +sand.enseeiht.fr +sandre.enseeiht.fr +sar.enseeiht.fr +sauvageons.enseeiht.fr +scorpion.enseeiht.fr +scoubidou.enseeiht.fr +shadowcat.enseeiht.fr +shannon.enseeiht.fr +silure.enseeiht.fr +snorki.enseeiht.fr +snow.enseeiht.fr +socrate.enseeiht.fr +sodium.enseeiht.fr +solo.enseeiht.fr +stallman.enseeiht.fr +stark.enseeiht.fr +stones.enseeiht.fr +succube.enseeiht.fr +sunfire.enseeiht.fr +superbus.enseeiht.fr +swartz.enseeiht.fr +tacaud.enseeiht.fr +tanche.enseeiht.fr +tao.enseeiht.fr +targaryen.enseeiht.fr +taupiqueur.enseeiht.fr +tesla.enseeiht.fr +titane.enseeiht.fr +tornade.enseeiht.fr +torvalds.enseeiht.fr +truite.enseeiht.fr +turing.enseeiht.fr +tyrell.enseeiht.fr +uranium.enseeiht.fr +vador.enseeiht.fr +vairon.enseeiht.fr +verlaine.enseeiht.fr +voisin.enseeiht.fr +volantis.enseeiht.fr +volta.enseeiht.fr +winterfell.enseeiht.fr +wright.enseeiht.fr +wyvern.enseeiht.fr +xorn.enseeiht.fr +yoda.enseeiht.fr +z6po.enseeiht.fr +zemanek.enseeiht.fr +zia.enseeiht.fr +zirconium.enseeiht.fr +zztop.enseeiht.fr diff --git a/prog.jl b/test.jl similarity index 58% rename from prog.jl rename to test.jl index 4b4995e..73803fe 100644 --- a/prog.jl +++ b/test.jl @@ -1,18 +1,3 @@ -import Pkg; -Pkg.add("GraphRecipes"); -Pkg.add("Plots"); -using GraphRecipes, Plots #only used to visualize the search tree at the end of the branch-and-bound - -"""Open and read a KnapFile. - -Args: \\ - - filename (String): the name of the file to read. - -Returns: \\ - - price (Vector{Integer}): prices of items to put in the KnapSack. \\ - - weight (Vector{Integer}): weights of items to put in the KnapSack. \\ - - capacity (Integer): the maximum capacity of the KnapSack. -""" function readKnapInstance(filename) price = [] weight = [] @@ -38,24 +23,6 @@ function readKnapInstance(filename) return price, weight, capacity end -"""Test if a node should be pruned. - -Args: \\ - - x (Vector{Integer}): the node to be tested. \\ - - price (Vector{Integer}): prices of items to put in the KnapSack. \\ - - weight (Vector{Integer}): weights of items to put in the KnapSack. \\ - - capacity (Integer): the maximum capacity of the KnapSack. \\ - - BestProfit (Integer): the current BestProfit value. \\ - - Bestsol (Integer): the current BestSol values. \\ - - affich (Bool): determine if the function should print to stdout. - -Returns: \\ - - TA (Bool): true if the node is feasible. \\ - - TO (Bool): true if the node is optimal. \\ - - TR (Bool): true if the node is resolvable. \\ - - BestProfit (Integer): the updated value of BestProfit. \\ - - Bestsol (Vector{Integer}): the updated values of BestSol. -""" function TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, affich) TA, TO, TR = false, false, false @@ -96,22 +63,9 @@ function TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bests return TA, TO, TR, Bestsol, BestProfit end -"""Split a node in two. - -Args: \\ - - price (Vector{Integer}): prices of items to put in the KnapSack. \\ - - listvars (Vector{Vector{Integer}}): the current values of listvars. \\ - - listvals (Vector{Integer}): the current values of listvals. - -Returns: \\ - - listvars (Vector{Vector{Integer}}): the updated values of listvars. \\ - - listvals (Vector{Integer}): the updated values of listvals. -""" function SeparerNoeud_relaxlin(price, listvars, listvals) # Le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds - # Cas du noeud le plus à gauche - # On sépare le noeud actuel en 2 sous-noeuds predX = pop!(listvars) nextX0 = copy(predX) @@ -148,18 +102,6 @@ function SeparerNoeud_relaxlin(price, listvars, listvals) return listvars, listvals end -"""Pop node fom the list to explore another node. - -Args: \\ - - price (Vector{Integer}): prices of items to put in the KnapSack. \\ - - listvars (Vector{Vector{Integer}}): the current values of listvars. \\ - - listvals (Vector{Integer}): the current values of listvals. - -Returns: \\ - - listvars (Vector{Vector{Integer}}): the updated values of listvars. \\ - - listvals (Vector{Integer}): the updated values of listvals. \\ - - stop (Bool): true if the tree search is finished. -""" function ExplorerAutreNoeud_relaxlin(listvars, listvals) # Le noeud est sondable, on l'enlève de la pile des noeuds à sonder @@ -208,32 +150,34 @@ function AllDef(x) return true end -"""Solve the KnapSack problem for the data contained in `filename`. - -Args: \\ - - filename (String): the name of the file to read. - -Returns: \\ - - trParentnodes (Vector{Integer}): the parents nodes, to plot the tree. - - trChildnodes (Vector{Integer}): the child nodes, to plot the tree. - - trNamenodes (Vector{Integer}): the name of the nodes, to plot the tree. -""" function SolveKnapInstance(filename) stop = false - affich = false + affich = true # Extraction des données price, weight, capacity = readKnapInstance(filename) - if affich - println("Capacity : ", capacity, " | Number of objects : ", length(price), "\n") + tri = true + if tri + couples = zip(price, weight) + couples = sort(collect(couples), by = x -> x[1] / x[2]) + unzip(a) = map(x->getfield.(a, x), fieldnames(eltype(a))) + price, weight = unzip(couples) end - # Pour dessiner le graph - trParentnodes = Int64[] - trChildnodes = Int64[] - trNamenodes = [] + expected = split(split(filename, "-")[2], ".")[1] + nodes_nb = length(price) + nodes_max = 2^nodes_nb + + if affich + println("---", filename, "---") + println("Capacity = ", capacity) + println("Number of objects = ", nodes_nb) + println("Expected optimal value = ", expected) + println("Maximum number of nodes = ", nodes_max) + println() + end # Liste des variable pour naviguer de noeuds en noeuds listvars = [] @@ -242,6 +186,7 @@ function SolveKnapInstance(filename) # La meilleur solution et sa valeur BestProfit = -1 + LastBestProfit = -1 Bestsol = [] # Compter le nombre de noeud explorés @@ -251,7 +196,6 @@ function SolveKnapInstance(filename) push!(listvars, [-1 for p in price]) push!(listvals, Objective(last(listvars), price)) push!(listnodes, 1) - push!(trNamenodes, 0) newnodeid = 2 while (!stop) @@ -259,52 +203,40 @@ function SolveKnapInstance(filename) # Le noeud actuel x = last(listvars) - if affich && current_node_number % 10000 == 0 - println("----------\nNode n°", current_node_number, " :\n") - println("Previous Solution memorized ", " with bestprofit ", BestProfit, "\n") + if affich && LastBestProfit != BestProfit + println("Node n°", current_node_number, ": \tBestProfit = ", BestProfit) + LastBestProfit = BestProfit end # Test de sondabilité du noeud actuel # -> On mets a jour la solution et sa valeur si besoin - TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, affich) + TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(x, price, weight, capacity, BestProfit, Bestsol, false) is_node_sondable = TA || TO || TR if (!is_node_sondable) # Le noeud n'est pas sondable, on le sépare en 2 sous-noeuds listvars, listvals = SeparerNoeud_relaxlin(price, listvars, listvals) - - curnode = pop!(listnodes) - - push!(trParentnodes, curnode) - push!(trParentnodes, curnode) - - push!(listnodes, newnodeid + 1) - push!(listnodes, newnodeid) - - push!(trChildnodes, newnodeid) - push!(trChildnodes, newnodeid + 1) - - push!(trNamenodes, newnodeid - 1) - push!(trNamenodes, newnodeid) - newnodeid += 2 - else # Le noeud est sondable, on passe au noeud suivant listvars, listvals, stop = ExplorerAutreNoeud_relaxlin(listvars, listvals) - - pop!(listnodes) end current_node_number += 1 end - if affich - println("\n******\n\nOptimal value = ", BestProfit, "\n\nOptimal x = ", Bestsol) + println("\n--------------------------------------------------") + println("Expected optimal value = ", expected) + println("Optimal value = ", BestProfit) + println("Optimal x = ", Bestsol) + println("Maximum number of nodes = ", nodes_max) + println("Nodes explored = ", current_node_number) + if parse(Int64, expected) == BestProfit + return 0 + else + return 1 end - return trParentnodes, trChildnodes, trNamenodes end -trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance("data/circle/knapPI_16_10000_1000_5_-912198.opb") -# graphplot(trParentnodes, trChildnodes, names = trNamenodes, method = :tree) \ No newline at end of file +SolveKnapInstance(ARGS[1])