TP-recherche-operationnelle/notebook-exemple.ipynb

1039 lines
101 KiB
Plaintext
Raw Normal View History

2021-11-26 13:51:01 +00:00
{
"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,
2021-11-26 13:51:01 +00:00
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"\u001b[32m\u001b[1m Updating\u001b[22m\u001b[39m registry at `~/.julia/registries/General`\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
2021-11-26 13:51:01 +00:00
"\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"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
"\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
2021-11-26 13:51:01 +00:00
"\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"
]
}
],
"source": [
"import Pkg; \n",
"Pkg.add(\"GraphRecipes\"); 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,
2021-11-26 13:51:01 +00:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"readKnaptxtInstance (generic function with 1 method)"
]
},
"metadata": {},
"output_type": "display_data"
2021-11-26 13:51:01 +00:00
}
],
"source": [
"function readKnaptxtInstance(filename)\n",
" price=[]\n",
" weight=[]\n",
" KnapCap=[]\n",
" open(filename) do f\n",
" for i in 1:3\n",
" tok = split(readline(f))\n",
" if (tok[1] == \"ListPrices=\")\n",
" for i in 2:(length(tok)-1)\n",
" push!(price,parse(Int64, tok[i]))\n",
" end\n",
" elseif(tok[1] == \"ListWeights=\")\n",
" for i in 2:(length(tok)-1)\n",
" push!(weight,parse(Int64, tok[i]))\n",
" end\n",
" elseif(tok[1] == \"Capacity=\")\n",
" push!(KnapCap, parse(Int64, tok[2]))\n",
" else\n",
" println(\"Unknown read :\", tok)\n",
" end \n",
" end\n",
" end\n",
" capacity=KnapCap[1]\n",
" return price, weight, capacity\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": 3,
2021-11-26 13:51:01 +00:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"TestsSondabilite_relaxlin (generic function with 1 method)"
]
},
"metadata": {},
"output_type": "display_data"
2021-11-26 13:51:01 +00:00
}
],
"source": [
"function TestsSondabilite_relaxlin(model2, x, varsbin, BestProfit, Bestsol)\n",
" TA, TO, TR = false, false, false\n",
" if (termination_status(model2) == MOI.INFEASIBLE)#Test de faisabilite\n",
" TA=true\n",
" println(\"TA\")\n",
" elseif (objective_value(model2) <= BestProfit) #Test d'optimalite\n",
" TO=true\n",
" println(\"TO\")\n",
" elseif ( prod(abs.([round.(v, digits=0) for v in value.(varsbin)]-value.(varsbin)) .<= fill(10^-5, size(varsbin))) \n",
" ) #Test de resolution\n",
" TR=true\n",
" println(\"TR\")\n",
" #if (value(benef) >= BestProfit)\n",
" if (objective_value(model2) >= BestProfit)\n",
" Bestsol = value.(x)\n",
" #BestProfit=value(benef)\n",
" BestProfit=objective_value(model2)\n",
" end\n",
" else\n",
" println(\"non sondable\")\n",
" end\n",
" 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": 4,
2021-11-26 13:51:01 +00:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"ExplorerAutreNoeud_relaxlin (generic function with 1 method)"
]
},
"metadata": {},
"output_type": "display_data"
2021-11-26 13:51:01 +00:00
}
],
"source": [
"\n",
"function SeparerNoeud_relaxlin(varsshouldbebinary, listvars, listvals)\n",
" # le noeud est non-sondable. Appliquer le critère de séparation pour le séparer en sous-noeuds \n",
" # et choisir un noeud-fils le plus à gauche \n",
" \n",
" #find a fractionnal variable\n",
" i, var = 1, 0\n",
" while ((i <= length(varsshouldbebinary)) && (var==0))\n",
" #if (varsshouldbebinary[i] ∉ listvars)\n",
" if (abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) ) >= 10^-5)\n",
" var=varsshouldbebinary[i]\n",
" end\n",
" i+=1\n",
" end\n",
" \n",
" #=\n",
" #find most fractionnal variable ?\n",
" i, var, maxfrac = -1, 0, 0.0\n",
" for i in 1:length(varsshouldbebinary)\n",
" if (abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) ) >= maxfrac) \n",
" #if a variable is more fractinonal\n",
" var=varsshouldbebinary[i]\n",
" maxfrac=abs(round(value(varsshouldbebinary[i]), digits=0) - value(varsshouldbebinary[i]) )\n",
" #println(i, \" \", var, \" \", maxfrac)\n",
" end\n",
" end\n",
" =#\n",
" \n",
"\n",
" set_lower_bound(var,1.0)\n",
" set_upper_bound(var,1.0)\n",
"\n",
" push!(listvars,var) #stocker l'identite de la variable choisie pour la séparation\n",
" push!(listvals,1.0) #stocker la branche choisie, identifiee par la valeur de la variable choisie\n",
" listvars, listvals\n",
"end\n",
"\n",
"\n",
"function ExplorerAutreNoeud_relaxlin(listvars, listvals, listnodes)\n",
" #this node is sondable, go back to parent node then right child if possible\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",
" var=pop!(listvars)\n",
" theval=pop!(listvals)\n",
" tmp=pop!(listnodes)\n",
" set_lower_bound(var,0.0)\n",
" set_upper_bound(var,1.0)\n",
"\n",
" #go to right child if possible, otherwise go back to parent\n",
" while ( (theval==0.0) && (length(listvars)>= 1))\n",
" var=pop!(listvars)\n",
" theval=pop!(listvals)\n",
" tmp=pop!(listnodes)\n",
" set_lower_bound(var,0.0) \n",
" set_upper_bound(var,1.0)\n",
" end\n",
" if theval==1.0\n",
" set_lower_bound(var,0.0)\n",
" set_upper_bound(var,0.0)\n",
" push!(listvars,var)\n",
" push!(listvals,0.0)\n",
" else\n",
" println(\"\\nFINISHED\")\n",
" stop=true\n",
" end\n",
" else\n",
" #the root node was sondable\n",
" println(\"\\nFINISHED\")\n",
" stop=true\n",
" end\n",
" listvars, listvals, listnodes, stop \n",
"end"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Création de la relaxation linéaire (= modèle associé au noeud 0): <span style=\"color:red\"> SECTION A SUPPRIMER !!!! </span>\n",
"\n",
"<span style=\"color:red\"> Cette section est à commenter/supprimer et remplacer par vos propres calculs de bornes supérieures et autres, par exemple basées sur les bornes 1 et 2 vues en cours, ou d'autres calculs de bornes de votre choix/conception validés au préalable par votre encadrant/e de TP </span>"
]
},
{
"cell_type": "code",
"execution_count": 5,
2021-11-26 13:51:01 +00:00
"metadata": {},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"\u001b[32m\u001b[1m Resolving\u001b[22m\u001b[39m package versions...\n"
]
},
{
"name": "stderr",
"output_type": "stream",
"text": [
2021-11-26 13:51:01 +00:00
"\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"
]
}
],
"source": [
"Pkg.add(\"Clp\");\n",
"using JuMP, Clp"
]
},
{
"cell_type": "code",
"execution_count": 6,
2021-11-26 13:51:01 +00:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"CreationModeleLP (generic function with 1 method)"
]
},
"metadata": {},
"output_type": "display_data"
2021-11-26 13:51:01 +00:00
}
],
"source": [
"function CreationModeleLP(price, weight, capacity)\n",
"# ROOT NODE\n",
" \n",
" model2 = Model(Clp.Optimizer) # set optimizer\n",
" set_optimizer_attribute(model2, \"LogLevel\", 0) #don't display anything during solve\n",
" set_optimizer_attribute(model2, \"Algorithm\", 4) #LP solver chosen is simplex\n",
"\n",
" # define x variables as CONTINUOUS (recall that it is not possible to define binary variables in Clp)\n",
" @variable(model2, 0 <= x[i in 1:4] <= 1)\n",
" varsshouldbebinary=[x[1] x[2] x[3] x[4]]\n",
"\n",
" # define objective function\n",
" @objective(model2, Max, sum(price[i]*x[i] for i in 1:4))\n",
"\n",
" # define the capacity constraint \n",
" @constraint(model2, sum(weight[i]*x[i] for i in 1:4) <= capacity)\n",
"\n",
" println(model2)\n",
"\n",
" return model2, x, varsshouldbebinary\n",
"end\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Boucle principale : résoudre la relaxation linéaire, appliquer les tests de sondabilité, identifier le prochain noeud, répéter."
]
},
{
"cell_type": "code",
"execution_count": 7,
2021-11-26 13:51:01 +00:00
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"SolveKnapInstance (generic function with 1 method)"
]
},
"metadata": {},
"output_type": "display_data"
2021-11-26 13:51:01 +00:00
}
],
"source": [
"\n",
"function SolveKnapInstance(filename)\n",
"\n",
" if (split(filename,\"/\")[end] != \"test.opb\")\n",
" println(\"This version of the code works only for the test instance !!!!\")\n",
" else\n",
" price, weight, capacity = readKnaptxtInstance(filename)\n",
" model2, x, varsshouldbebinary = CreationModeleLP(price, weight, capacity)\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",
" listvars=[]\n",
" listvals=[]\n",
" listnodes=[]\n",
"\n",
" BestProfit=-1\n",
" Bestsol=[]\n",
"\n",
" current_node_number=0\n",
" stop = false\n",
"\n",
" while (!stop)\n",
"\n",
" println(\"\\nNode number \", current_node_number, \": \\n-----\\n\", model2)\n",
"\n",
" #Update the search tree\n",
" push!(trNamenodes,current_node_number+1) \n",
" if (length(trNamenodes)>=2)\n",
" push!(trParentnodes,listnodes[end]+1) # +1 because the 1st node is \"node 0\"\n",
" push!(trChildnodes, current_node_number+1) # +1 because the 1st node is \"node 0\"\n",
" end\n",
" push!(listnodes, current_node_number)\n",
"\n",
"\n",
" print(\"Solve model2 to compute the bounds of the current node: start ... \")\n",
" status = optimize!(model2)\n",
" println(\"... end\")\n",
"\n",
" print(\"\\nSolution relax lin\"); \n",
" if (termination_status(model2) == MOI.INFEASIBLE)#(has_values(model2))\n",
" print(\" : NOT AVAILABLE (probably infeasible or ressources limit reached)\")\n",
" else\n",
" [print(\"\\t\", name(v),\"=\",value(v)) for v in all_variables(model2)] \n",
" end\n",
" println(\" \"); println(\"\\nPrevious Solution memorized \", Bestsol, \" with bestprofit \", BestProfit, \"\\n\")\n",
"\n",
" TA, TO, TR, Bestsol, BestProfit = TestsSondabilite_relaxlin(model2, x, varsshouldbebinary, BestProfit, Bestsol)\n",
"\n",
" is_node_sondable = TA || TO || TR\n",
"\n",
" if (!is_node_sondable)\n",
" listvars, listvals = SeparerNoeud_relaxlin(varsshouldbebinary, listvars, listvals)\n",
" else\n",
" listvars, listvals, listnodes, stop = ExplorerAutreNoeud_relaxlin(listvars, listvals, listnodes)\n",
" end\n",
"\n",
" current_node_number = current_node_number + 1\n",
" end\n",
"\n",
" println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n",
"\n",
" return BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes\n",
" end\n",
"\n",
"end\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Affichage du résultat final"
]
},
{
"cell_type": "code",
"execution_count": 8,
2021-11-26 13:51:01 +00:00
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"\n",
2021-11-26 13:51:01 +00:00
"Subject to\n",
" "
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n",
2021-11-26 13:51:01 +00:00
" x[1] ≥ 0.0\n",
" x[2] ≥ 0.0\n",
" x[3] ≥ 0.0\n",
" x[4] ≥ 0.0\n",
" x[1] ≤ 1.0\n",
" x[2] ≤ 1.0\n",
" x[3] ≤ 1.0\n",
" x[4] ≤ 1.0\n",
"\n",
"\n",
"Node number 0: \n",
"-----\n",
"Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n",
"Subject to\n",
" 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n",
" x[1] ≥ 0.0\n",
" x[2] ≥ 0.0\n",
" x[3] ≥ 0.0\n",
" x[4] ≥ 0.0\n",
" x[1] ≤ 1.0\n",
" x[2] ≤ 1.0\n",
" x[3] ≤ 1.0\n",
" x[4] ≤ 1.0\n",
"\n",
"Solve model2 to compute the bounds of the current node: start ... "
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"... end\n",
2021-11-26 13:51:01 +00:00
"\n",
"Solution relax lin\t"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"x[1]=0.857142857142857\tx[2]=1.0\tx[3]=0.0\tx[4]=0.0 \n",
2021-11-26 13:51:01 +00:00
"\n",
"Previous Solution memorized "
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"Any[] with bestprofit -1\n",
"\n",
"non sondable"
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
2021-11-26 13:51:01 +00:00
"\n",
"\n",
"Node number "
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"1: \n",
2021-11-26 13:51:01 +00:00
"-----\n",
"Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n",
"Subject to\n",
" 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n",
" x[1] ≥ 1.0\n",
" x[2] ≥ 0.0\n",
" x[3] ≥ 0.0\n",
" x[4] ≥ 0.0\n",
" x[1] ≤ 1.0\n",
" x[2] ≤ 1.0\n",
" x[3] ≤ 1.0\n",
" x[4] ≤ 1.0\n",
"\n",
"Solve model2 to compute the bounds of the current node: start ... ... end\n",
"\n",
"Solution relax lin\tx[1]=1.0\tx[2]=0.7500000000000001\tx[3]=0.0\tx[4]=0.0 \n",
"\n",
"Previous Solution memorized Any[] with bestprofit -1\n",
"\n",
"non sondable\n",
"\n",
"Node number 2: \n",
"-----\n",
"Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n",
"Subject to\n",
" 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n",
" x[1] ≥ 1.0\n",
" x[2] ≥ 1.0\n",
" x[3] ≥ 0.0\n",
" x[4] ≥ 0.0\n",
" x[1] ≤ 1.0\n",
" x[2] ≤ 1.0\n",
" x[3] ≤ 1.0\n",
" x[4] ≤ 1.0\n",
"\n",
"Solve model2 to compute the bounds of the current node: start ... ... end\n",
"\n",
"Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n",
"\n",
"Previous Solution memorized Any[] with bestprofit -1\n",
"\n",
"TA\n",
"\n",
"Node number 3: \n",
"-----\n",
"Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n",
"Subject to\n",
" 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n",
" x[1] ≥ 1.0\n",
" x[2] ≥ 0.0\n",
" x[3] ≥ 0.0\n",
" x[4] ≥ 0.0\n",
" x[1] ≤ 1.0\n",
" x[2] ≤ 0.0\n",
" x[3] ≤ 1.0\n",
" x[4] ≤ 1.0\n",
"\n",
"Solve model2 to compute the bounds of the current node: start ... ... end\n",
"\n",
"Solution relax lin\tx[1]=1.0\tx[2]=0.0\tx[3]=0.0\tx[4]=0.6 \n",
"\n",
"Previous Solution memorized Any[] with bestprofit -1\n",
"\n",
"non sondable\n",
"\n",
"Node number 4: \n",
"-----\n",
"Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n",
"Subject to\n",
" 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n",
" x[1] ≥ 1.0\n",
" x[2] ≥ 0.0\n",
" x[3] ≥ 0.0\n",
" x[4] ≥ 1.0\n",
" x[1] ≤ 1.0\n",
" x[2] ≤ 0.0\n",
" x[3] ≤ 1.0\n",
" x[4] ≤ 1.0\n",
"\n",
"Solve model2 to compute the bounds of the current node: start ... ... end\n",
"\n",
"Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n",
"\n",
"Previous Solution memorized Any[] with bestprofit -1\n",
"\n",
"TA\n",
"\n",
"Node number 5: \n",
"-----\n",
"Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n",
"Subject to\n",
" 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n",
" x[1] ≥ 1.0\n",
" x[2] ≥ 0.0\n",
" x[3] ≥ 0.0\n",
" x[4] ≥ 0.0\n",
" x[1] ≤ 1.0\n",
" x[2] ≤ 0.0\n",
" x[3] ≤ 1.0\n",
" x[4] ≤ 0.0\n",
"\n",
"Solve model2 to compute the bounds of the current node: start ... ... end\n",
"\n",
"Solution relax lin\tx[1]=1.0\tx[2]=0.0\tx[3]=1.0\tx[4]=0.0 \n",
"\n",
"Previous Solution memorized Any[] with bestprofit -1\n",
"\n",
"TR\n",
"\n",
"Node number 6: \n",
"-----\n",
"Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n",
"Subject to\n",
" 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n",
" x[1] ≥ 0.0\n",
" x[2] ≥ 0.0\n",
" x[3] ≥ 0.0\n",
" x[4] ≥ 0.0\n",
" x[1] ≤ 0.0\n",
" x[2] ≤ 1.0\n",
" x[3] ≤ 1.0\n",
" x[4] ≤ 1.0\n",
"\n",
"Solve model2 to compute the bounds of the current node: start ... ... end\n",
"\n",
"Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=0.3333333333333332\tx[4]=1.0 \n",
"\n",
"Previous Solution memorized "
]
},
{
"name": "stdout",
"output_type": "stream",
"text": [
"[1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n",
2021-11-26 13:51:01 +00:00
"\n",
"non sondable\n",
"\n",
"Node number 7: \n",
"-----\n",
"Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n",
"Subject to\n",
" 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n",
" x[1] ≥ 0.0\n",
" x[2] ≥ 0.0\n",
" x[3] ≥ 1.0\n",
" x[4] ≥ 0.0\n",
" x[1] ≤ 0.0\n",
" x[2] ≤ 1.0\n",
" x[3] ≤ 1.0\n",
" x[4] ≤ 1.0\n",
"\n",
"Solve model2 to compute the bounds of the current node: start ... ... end\n",
"\n",
"Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=1.0\tx[4]=0.6000000000000001 \n",
"\n",
"Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n",
"\n",
"non sondable\n",
"\n",
"Node number 8: \n",
"-----\n",
"Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n",
"Subject to\n",
" 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n",
" x[1] ≥ 0.0\n",
" x[2] ≥ 0.0\n",
" x[3] ≥ 1.0\n",
" x[4] ≥ 1.0\n",
" x[1] ≤ 0.0\n",
" x[2] ≤ 1.0\n",
" x[3] ≤ 1.0\n",
" x[4] ≤ 1.0\n",
"\n",
"Solve model2 to compute the bounds of the current node: start ... ... end\n",
"\n",
"Solution relax lin\tx[1]=0.0\tx[2]=0.5\tx[3]=1.0\tx[4]=1.0 \n",
"\n",
"Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n",
"\n",
"non sondable\n",
"\n",
"Node number 9: \n",
"-----\n",
"Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n",
"Subject to\n",
" 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n",
" x[1] ≥ 0.0\n",
" x[2] ≥ 1.0\n",
" x[3] ≥ 1.0\n",
" x[4] ≥ 1.0\n",
" x[1] ≤ 0.0\n",
" x[2] ≤ 1.0\n",
" x[3] ≤ 1.0\n",
" x[4] ≤ 1.0\n",
"\n",
"Solve model2 to compute the bounds of the current node: start ... ... end\n",
"\n",
"Solution relax lin : NOT AVAILABLE (probably infeasible or ressources limit reached) \n",
"\n",
"Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n",
"\n",
"TA\n",
"\n",
"Node number 10: \n",
"-----\n",
"Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n",
"Subject to\n",
" 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n",
" x[1] ≥ 0.0\n",
" x[2] ≥ 0.0\n",
" x[3] ≥ 1.0\n",
" x[4] ≥ 1.0\n",
" x[1] ≤ 0.0\n",
" x[2] ≤ 0.0\n",
" x[3] ≤ 1.0\n",
" x[4] ≤ 1.0\n",
"\n",
"Solve model2 to compute the bounds of the current node: start ... ... end\n",
"\n",
"Solution relax lin\tx[1]=0.0\tx[2]=0.0\tx[3]=1.0\tx[4]=1.0 \n",
"\n",
"Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n",
"\n",
"TO\n",
"\n",
"Node number 11: \n",
"-----\n",
"Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n",
"Subject to\n",
" 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n",
" x[1] ≥ 0.0\n",
" x[2] ≥ 0.0\n",
" x[3] ≥ 1.0\n",
" x[4] ≥ 0.0\n",
" x[1] ≤ 0.0\n",
" x[2] ≤ 1.0\n",
" x[3] ≤ 1.0\n",
" x[4] ≤ 0.0\n",
"\n",
"Solve model2 to compute the bounds of the current node: start ... ... end\n",
"\n",
"Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=1.0\tx[4]=0.0 \n",
"\n",
"Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n",
"\n",
"TO\n",
"\n",
"Node number 12: \n",
"-----\n",
"Max 42 x[1] + 40 x[2] + 12 x[3] + 25 x[4]\n",
"Subject to\n",
" 7 x[1] + 4 x[2] + 3 x[3] + 5 x[4] ≤ 10.0\n",
" x[1] ≥ 0.0\n",
" x[2] ≥ 0.0\n",
" x[3] ≥ 0.0\n",
" x[4] ≥ 0.0\n",
" x[1] ≤ 0.0\n",
" x[2] ≤ 1.0\n",
" x[3] ≤ 0.0\n",
" x[4] ≤ 1.0\n",
"\n",
"Solve model2 to compute the bounds of the current node: start ... ... end\n",
"\n",
"Solution relax lin\tx[1]=0.0\tx[2]=1.0\tx[3]=0.0\tx[4]=1.0 \n",
"\n",
"Previous Solution memorized [1.0, 0.0, 1.0, 0.0] with bestprofit 54.0\n",
"\n",
"TR\n",
"\n",
"FINISHED\n",
"\n",
"******\n",
"\n",
"Optimal value = 65.0\n",
"\n",
"Optimal x=[0.0, 1.0, 0.0, 1.0]\n",
"\n",
"******\n",
"\n",
"Optimal value = 65.0\n",
"\n",
"Optimal x=[0.0, 1.0, 0.0, 1.0]\n"
]
},
{
"data": {
"image/png": "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
"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=\"clip420\">\n <rect x=\"0\" y=\"0\" width=\"2400\" height=\"1600\"/>\n </clipPath>\n</defs>\n<path clip-path=\"url(#clip420)\" d=\"\nM0 1600 L2400 1600 L2400 0 L0 0 Z\n \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n<defs>\n <clipPath id=\"clip421\">\n <rect x=\"480\" y=\"0\" width=\"1681\" height=\"1600\"/>\n </clipPath>\n</defs>\n<path clip-path=\"url(#clip420)\" 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=\"clip422\">\n <rect x=\"447\" y=\"47\" width=\"1507\" height=\"1507\"/>\n </clipPath>\n</defs>\n<polyline clip-path=\"url(#clip422)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 1130.1,262.317 1129.39,271.864 1127.32,281.114 1123.99,290.088 1119.5,298.808 1113.96,307.297 1107.47,315.577 1100.12,323.669 1092.01,331.595 1083.25,339.379 \n 1073.94,347.041 1064.18,354.604 1054.06,362.09 1043.7,369.52 1033.18,376.918 1022.61,384.305 1012.09,391.702 1001.72,399.133 991.606,406.619 981.842,414.182 \n 972.53,421.844 963.772,429.627 955.667,437.554 948.317,445.646 941.821,453.925 936.281,462.414 931.797,471.135 928.47,480.109 926.4,489.358 925.687,498.905 \n \n \"/>\n<polyline clip-path=\"url(#clip422)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 925.687,498.905 925.154,509.266 923.603,519.601 921.11,529.914 917.751,540.206 913.601,550.479 908.735,560.734 903.228,570.974 897.157,581.2 890.595,591.414 \n 883.62,601.618 876.305,611.814 868.726,622.003 860.959,632.188 853.08,642.37 845.162,652.552 837.282,662.734 829.515,672.919 821.937,683.108 814.622,693.304 \n 807.647,703.508 801.085,713.722 795.014,723.948 789.507,734.188 784.641,744.443 780.491,754.716 777.132,765.008 774.639,775.321 773.088,785.656 772.555,796.017 \n \n \"/>\n<polyline clip-path=\"url(#clip422)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 925.687,498.905 925.382,507.725 924.494,516.64 923.066,525.643 921.143,534.727 918.766,543.885 915.98,553.109 912.827,562.394 909.35,571.731 905.593,581.114 \n 901.599,590.536 897.41,599.99 893.071,609.468 888.623,618.964 884.111,628.47 879.577,637.98 875.065,647.486 870.618,656.982 866.278,666.46 862.09,675.914 \n 858.095,685.336 854.338,694.719 850.862,704.056 847.708,713.341 844.922,722.565 842.546,731.723 840.622,740.807 839.195,749.81 838.307,758.725 838.001,767.545 \n \n \"/>\n<polyline clip-path=\"url(#clip422)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 838.001,767.545 837.389,777.48 835.61,787.283 832.75,796.964 828.896,806.533 824.135,816 818.552,825.373 812.235,834.664 805.269,843.881 797.741,853.035 \n 789.738,862.135 781.346,871.191 772.652,880.213 763.741,889.211 754.701,898.194 745.617,907.172 736.577,916.155 727.667,925.153 718.972,934.175 710.58,943.231 \n 702.577,952.332 695.049,961.485 688.084,970.703 681.766,979.993 676.184,989.367 671.422,998.833 667.568,1008.4 664.709,1018.08 662.93,1027.89 662.317,1037.82 \n \n \"/>\n<polyline clip-path=\"url(#clip422)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n 838.001,767.545 838.019,776.726 838.072,786.101 838.158,795.656 838.272,805.376 838.414,815.247 838.581,825.255 838.769,835.385 838.976,845.622 839.201,855.953 \n 839.439,866.363 839.689,876.837 839.948,887.362 840.214,897.923 840.483,908.506 840.754,919.095 841.023,929.678 841.289,940.239 841.548,950.763 841.798,961.238 \n 842.036,971.648 842.261,981.979 842.468,992.216 842.657,1002.35 842.8
"text/html": [
"<?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=\"clip450\">\n",
" <rect x=\"0\" y=\"0\" width=\"2400\" height=\"1600\"/>\n",
" </clipPath>\n",
"</defs>\n",
"<path clip-path=\"url(#clip450)\" d=\"\n",
"M0 1600 L2400 1600 L2400 0 L0 0 Z\n",
" \" fill=\"#ffffff\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
"<defs>\n",
" <clipPath id=\"clip451\">\n",
" <rect x=\"480\" y=\"0\" width=\"1681\" height=\"1600\"/>\n",
" </clipPath>\n",
"</defs>\n",
"<path clip-path=\"url(#clip450)\" d=\"\n",
"M447.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=\"clip452\">\n",
" <rect x=\"447\" y=\"47\" width=\"1507\" height=\"1507\"/>\n",
" </clipPath>\n",
"</defs>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 1130.1,262.317 1129.39,271.864 1127.32,281.114 1123.99,290.088 1119.5,298.808 1113.96,307.297 1107.47,315.577 1100.12,323.669 1092.01,331.595 1083.25,339.379 \n",
" 1073.94,347.041 1064.18,354.604 1054.06,362.09 1043.7,369.52 1033.18,376.918 1022.61,384.305 1012.09,391.702 1001.72,399.133 991.606,406.619 981.842,414.182 \n",
" 972.53,421.844 963.772,429.627 955.667,437.554 948.317,445.646 941.821,453.925 936.281,462.414 931.797,471.135 928.47,480.109 926.4,489.358 925.687,498.905 \n",
" \n",
" \"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 925.687,498.905 925.154,509.266 923.603,519.601 921.11,529.914 917.751,540.206 913.601,550.479 908.735,560.734 903.228,570.974 897.157,581.2 890.595,591.414 \n",
" 883.62,601.618 876.305,611.814 868.726,622.003 860.959,632.188 853.08,642.37 845.162,652.552 837.282,662.734 829.515,672.919 821.937,683.108 814.622,693.304 \n",
" 807.647,703.508 801.085,713.722 795.014,723.948 789.507,734.188 784.641,744.443 780.491,754.716 777.132,765.008 774.639,775.321 773.088,785.656 772.555,796.017 \n",
" \n",
" \"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 925.687,498.905 925.382,507.725 924.494,516.64 923.066,525.643 921.143,534.727 918.766,543.885 915.98,553.109 912.827,562.394 909.35,571.731 905.593,581.114 \n",
" 901.599,590.536 897.41,599.99 893.071,609.468 888.623,618.964 884.111,628.47 879.577,637.98 875.065,647.486 870.618,656.982 866.278,666.46 862.09,675.914 \n",
" 858.095,685.336 854.338,694.719 850.862,704.056 847.708,713.341 844.922,722.565 842.546,731.723 840.622,740.807 839.195,749.81 838.307,758.725 838.001,767.545 \n",
" \n",
" \"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 838.001,767.545 837.389,777.48 835.61,787.283 832.75,796.964 828.896,806.533 824.135,816 818.552,825.373 812.235,834.664 805.269,843.881 797.741,853.035 \n",
" 789.738,862.135 781.346,871.191 772.652,880.213 763.741,889.211 754.701,898.194 745.617,907.172 736.577,916.155 727.667,925.153 718.972,934.175 710.58,943.231 \n",
" 702.577,952.332 695.049,961.485 688.084,970.703 681.766,979.993 676.184,989.367 671.422,998.833 667.568,1008.4 664.709,1018.08 662.93,1027.89 662.317,1037.82 \n",
" \n",
" \"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 838.001,767.545 838.019,776.726 838.072,786.101 838.158,795.656 838.272,805.376 838.414,815.247 838.581,825.255 838.769,835.385 838.976,845.622 839.201,855.953 \n",
" 839.439,866.363 839.689,876.837 839.948,887.362 840.214,897.923 840.483,908.506 840.754,919.095 841.023,929.678 841.289,940.239 841.548,950.763 841.798,961.238 \n",
" 842.036,971.648 842.261,981.979 842.468,992.216 842.657,1002.35 842.823,1012.35 842.965,1022.22 843.08,1031.94 843.165,1041.5 843.218,1050.87 843.236,1060.06 \n",
" \n",
" \"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 1130.1,262.317 1130.75,273.787 1132.64,285.169 1135.68,296.469 1139.78,307.694 1144.84,318.849 1150.77,329.943 1157.49,340.98 1164.9,351.969 1172.9,362.915 \n",
" 1181.41,373.825 1190.33,384.705 1199.57,395.563 1209.05,406.404 1218.66,417.235 1228.31,428.063 1237.92,438.894 1247.4,449.736 1256.64,460.593 1265.56,471.473 \n",
" 1274.07,482.383 1282.07,493.329 1289.48,504.318 1296.19,515.356 1302.13,526.449 1307.19,537.605 1311.29,548.829 1314.33,560.129 1316.22,571.511 1316.87,582.981 \n",
" \n",
" \"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 1316.87,582.981 1317.5,589.074 1319.35,594.761 1322.31,600.074 1326.29,605.042 1331.22,609.695 1337,614.064 1343.54,618.177 1350.75,622.065 1358.54,625.759 \n",
" 1366.82,629.287 1375.51,632.681 1384.51,635.97 1393.73,639.183 1403.08,642.352 1412.49,645.506 1421.84,648.675 1431.06,651.888 1440.06,655.177 1448.75,658.571 \n",
" 1457.03,662.099 1464.82,665.793 1472.03,669.681 1478.57,673.794 1484.35,678.163 1489.27,682.816 1493.26,687.784 1496.22,693.097 1498.06,698.784 1498.7,704.877 \n",
" \n",
" \"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 1498.7,704.877 1499.15,715.492 1500.46,726.165 1502.57,736.891 1505.4,747.665 1508.91,758.484 1513.02,769.343 1517.68,780.239 1522.81,791.165 1528.35,802.12 \n",
" 1534.25,813.098 1540.43,824.095 1546.83,835.106 1553.4,846.128 1560.05,857.157 1566.75,868.188 1573.4,879.216 1579.97,890.239 1586.37,901.25 1592.55,912.247 \n",
" 1598.45,923.225 1603.99,934.179 1609.12,945.106 1613.78,956.001 1617.89,966.86 1621.39,977.679 1624.23,988.454 1626.34,999.179 1627.65,1009.85 1628.1,1020.47 \n",
" \n",
" \"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 1628.1,1020.47 1627.95,1029.64 1627.51,1038.98 1626.8,1048.48 1625.84,1058.13 1624.66,1067.91 1623.28,1077.81 1621.71,1087.82 1619.98,1097.93 1618.12,1108.12 \n",
" 1616.13,1118.38 1614.05,1128.7 1611.89,1139.07 1609.68,1149.46 1607.44,1159.88 1605.19,1170.3 1602.94,1180.72 1600.73,1191.11 1598.58,1201.48 1596.5,1211.79 \n",
" 1594.51,1222.06 1592.64,1232.25 1590.92,1242.36 1589.35,1252.37 1587.96,1262.27 1586.78,1272.05 1585.83,1281.7 1585.12,1291.2 1584.68,1300.54 1584.52,1309.71 \n",
" \n",
" \"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 1628.1,1020.47 1628.48,1030.94 1629.59,1041.51 1631.38,1052.17 1633.78,1062.92 1636.75,1073.74 1640.23,1084.64 1644.17,1095.6 1648.52,1106.62 1653.21,1117.68 \n",
" 1658.2,1128.79 1663.44,1139.93 1668.86,1151.09 1674.42,1162.28 1680.06,1173.48 1685.72,1184.68 1691.36,1195.87 1696.92,1207.06 1702.34,1218.22 1707.58,1229.36 \n",
" 1712.57,1240.47 1717.27,1251.53 1721.61,1262.55 1725.55,1273.51 1729.03,1284.41 1732,1295.23 1734.41,1305.98 1736.19,1316.65 1737.3,1327.21 1737.68,1337.68 \n",
" \n",
" \"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 1498.7,704.877 1498.44,716.43 1497.71,728.179 1496.52,740.111 1494.92,752.21 1492.95,764.463 1490.63,776.854 1488.01,789.369 1485.12,801.993 1482,814.712 \n",
" 1478.68,827.511 1475.2,840.376 1471.6,853.292 1467.9,866.244 1464.15,879.218 1460.38,892.199 1456.64,905.173 1452.94,918.126 1449.33,931.041 1445.85,943.906 \n",
" 1442.53,956.705 1439.41,969.424 1436.52,982.048 1433.9,994.563 1431.59,1006.95 1429.61,1019.21 1428.02,1031.31 1426.83,1043.24 1426.09,1054.99 1425.84,1066.54 \n",
" \n",
" \"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 1316.87,582.981 1316.54,587.834 1315.58,592.582 1314.04,597.233 1311.95,601.795 1309.38,606.275 1306.37,610.681 1302.96,615.021 1299.2,619.303 1295.13,623.534 \n",
" 1290.81,627.722 1286.28,631.875 1281.58,636.002 1276.77,640.108 1271.89,644.203 1266.98,648.295 1262.1,652.39 1257.29,656.497 1252.59,660.623 1248.06,664.776 \n",
" 1243.74,668.965 1239.68,673.196 1235.91,677.477 1232.5,681.817 1229.49,686.223 1226.92,690.703 1224.84,695.265 1223.29,699.916 1222.33,704.664 1222,709.517 \n",
" \n",
" \"/>\n",
"<path clip-path=\"url(#clip452)\" d=\"\n",
"M1146.08 262.317 L1138.09 248.477 L1122.11 248.477 L1114.12 262.317 L1122.11 276.158 L1138.09 276.158 L1146.08 262.317 L1146.08 262.317 Z\n",
" \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 1146.08,262.317 1138.09,248.477 1122.11,248.477 1114.12,262.317 1122.11,276.158 1138.09,276.158 1146.08,262.317 \n",
" \"/>\n",
"<path clip-path=\"url(#clip452)\" d=\"\n",
"M941.669 498.905 L933.678 485.065 L917.696 485.065 L909.706 498.905 L917.696 512.746 L933.678 512.746 L941.669 498.905 L941.669 498.905 Z\n",
" \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 941.669,498.905 933.678,485.065 917.696,485.065 909.706,498.905 917.696,512.746 933.678,512.746 941.669,498.905 \n",
" \"/>\n",
"<path clip-path=\"url(#clip452)\" d=\"\n",
"M788.536 796.017 L780.545 782.176 L764.564 782.176 L756.573 796.017 L764.564 809.857 L780.545 809.857 L788.536 796.017 L788.536 796.017 Z\n",
" \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 788.536,796.017 780.545,782.176 764.564,782.176 756.573,796.017 764.564,809.857 780.545,809.857 788.536,796.017 \n",
" \"/>\n",
"<path clip-path=\"url(#clip452)\" d=\"\n",
"M853.983 767.545 L845.992 753.704 L830.01 753.704 L822.02 767.545 L830.01 781.385 L845.992 781.385 L853.983 767.545 L853.983 767.545 Z\n",
" \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 853.983,767.545 845.992,753.704 830.01,753.704 822.02,767.545 830.01,781.385 845.992,781.385 853.983,767.545 \n",
" \"/>\n",
"<path clip-path=\"url(#clip452)\" d=\"\n",
"M678.299 1037.82 L670.308 1023.98 L654.326 1023.98 L646.336 1037.82 L654.326 1051.66 L670.308 1051.66 L678.299 1037.82 L678.299 1037.82 Z\n",
" \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 678.299,1037.82 670.308,1023.98 654.326,1023.98 646.336,1037.82 654.326,1051.66 670.308,1051.66 678.299,1037.82 \n",
" \"/>\n",
"<path clip-path=\"url(#clip452)\" d=\"\n",
"M859.218 1060.06 L851.227 1046.22 L835.245 1046.22 L827.255 1060.06 L835.245 1073.9 L851.227 1073.9 L859.218 1060.06 L859.218 1060.06 Z\n",
" \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 859.218,1060.06 851.227,1046.22 835.245,1046.22 827.255,1060.06 835.245,1073.9 851.227,1073.9 859.218,1060.06 \n",
" \"/>\n",
"<path clip-path=\"url(#clip452)\" d=\"\n",
"M1332.85 582.981 L1324.86 569.141 L1308.88 569.141 L1300.89 582.981 L1308.88 596.822 L1324.86 596.822 L1332.85 582.981 L1332.85 582.981 Z\n",
" \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 1332.85,582.981 1324.86,569.141 1308.88,569.141 1300.89,582.981 1308.88,596.822 1324.86,596.822 1332.85,582.981 \n",
" \"/>\n",
"<path clip-path=\"url(#clip452)\" d=\"\n",
"M1514.68 704.877 L1506.69 691.036 L1490.71 691.036 L1482.72 704.877 L1490.71 718.717 L1506.69 718.717 L1514.68 704.877 L1514.68 704.877 Z\n",
" \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 1514.68,704.877 1506.69,691.036 1490.71,691.036 1482.72,704.877 1490.71,718.717 1506.69,718.717 1514.68,704.877 \n",
" \"/>\n",
"<path clip-path=\"url(#clip452)\" d=\"\n",
"M1644.08 1020.47 L1636.09 1006.63 L1620.11 1006.63 L1612.12 1020.47 L1620.11 1034.31 L1636.09 1034.31 L1644.08 1020.47 L1644.08 1020.47 Z\n",
" \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 1644.08,1020.47 1636.09,1006.63 1620.11,1006.63 1612.12,1020.47 1620.11,1034.31 1636.09,1034.31 1644.08,1020.47 \n",
" \"/>\n",
"<path clip-path=\"url(#clip452)\" d=\"\n",
"M1612.35 1309.71 L1598.44 1285.61 L1570.61 1285.61 L1556.7 1309.71 L1570.61 1333.81 L1598.44 1333.81 L1612.35 1309.71 L1612.35 1309.71 Z\n",
" \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 1612.35,1309.71 1598.44,1285.61 1570.61,1285.61 1556.7,1309.71 1570.61,1333.81 1598.44,1333.81 1612.35,1309.71 \n",
" \"/>\n",
"<path clip-path=\"url(#clip452)\" d=\"\n",
"M1765.51 1337.68 L1751.6 1313.59 L1723.77 1313.59 L1709.86 1337.68 L1723.77 1361.78 L1751.6 1361.78 L1765.51 1337.68 L1765.51 1337.68 Z\n",
" \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 1765.51,1337.68 1751.6,1313.59 1723.77,1313.59 1709.86,1337.68 1723.77,1361.78 1751.6,1361.78 1765.51,1337.68 \n",
" \"/>\n",
"<path clip-path=\"url(#clip452)\" d=\"\n",
"M1453.66 1066.54 L1439.75 1042.44 L1411.93 1042.44 L1398.01 1066.54 L1411.93 1090.64 L1439.75 1090.64 L1453.66 1066.54 L1453.66 1066.54 Z\n",
" \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 1453.66,1066.54 1439.75,1042.44 1411.93,1042.44 1398.01,1066.54 1411.93,1090.64 1439.75,1090.64 1453.66,1066.54 \n",
" \"/>\n",
"<path clip-path=\"url(#clip452)\" d=\"\n",
"M1249.83 709.517 L1235.91 685.419 L1208.09 685.419 L1194.17 709.517 L1208.09 733.615 L1235.91 733.615 L1249.83 709.517 L1249.83 709.517 Z\n",
" \" fill=\"#009af9\" fill-rule=\"evenodd\" fill-opacity=\"1\"/>\n",
"<polyline clip-path=\"url(#clip452)\" style=\"stroke:#000000; stroke-linecap:butt; stroke-linejoin:round; stroke-width:4; stroke-opacity:1; fill:none\" points=\"\n",
" 1249.83,709.517 1235.91,685.419 1208.09,685.419 1194.17,709.517 1208.09,733.615 1235.91,733.615 1249.83,709.517 \n",
" \"/>\n",
"<circle clip-path=\"url(#clip452)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1130.1\" cy=\"262.317\" r=\"2\"/>\n",
"<circle clip-path=\"url(#clip452)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"925.687\" cy=\"498.905\" r=\"2\"/>\n",
"<circle clip-path=\"url(#clip452)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"772.555\" cy=\"796.017\" r=\"2\"/>\n",
"<circle clip-path=\"url(#clip452)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"838.001\" cy=\"767.545\" r=\"2\"/>\n",
"<circle clip-path=\"url(#clip452)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"662.317\" cy=\"1037.82\" r=\"2\"/>\n",
"<circle clip-path=\"url(#clip452)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"843.236\" cy=\"1060.06\" r=\"2\"/>\n",
"<circle clip-path=\"url(#clip452)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1316.87\" cy=\"582.981\" r=\"2\"/>\n",
"<circle clip-path=\"url(#clip452)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1498.7\" cy=\"704.877\" r=\"2\"/>\n",
"<circle clip-path=\"url(#clip452)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1628.1\" cy=\"1020.47\" r=\"2\"/>\n",
"<circle clip-path=\"url(#clip452)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1584.52\" cy=\"1309.71\" r=\"2\"/>\n",
"<circle clip-path=\"url(#clip452)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1737.68\" cy=\"1337.68\" r=\"2\"/>\n",
"<circle clip-path=\"url(#clip452)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1425.84\" cy=\"1066.54\" r=\"2\"/>\n",
"<circle clip-path=\"url(#clip452)\" style=\"fill:#009af9; stroke:none; fill-opacity:1\" cx=\"1222\" cy=\"709.517\" r=\"2\"/>\n",
"<path clip-path=\"url(#clip450)\" d=\"M1121.68 273.994 L1128.37 273.994 L1128.37 250.924 L1121.09 252.382 L1121.09 248.656 L1128.33 247.197 L1132.42 247.197 L1132.42 273.994 L1139.1 273.994 L1139.1 277.437 L1121.68 277.437 L1121.68 273.994 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip450)\" d=\"M921.008 510.582 L935.288 510.582 L935.288 514.025 L916.087 514.025 L916.087 510.582 Q918.416 508.172 922.426 504.121 Q926.457 500.05 927.49 498.875 Q929.455 496.667 930.224 495.148 Q931.014 493.609 931.014 492.13 Q931.014 489.72 929.313 488.201 Q927.632 486.682 924.918 486.682 Q922.993 486.682 920.846 487.35 Q918.72 488.018 916.289 489.376 L916.289 485.244 Q918.76 484.251 920.907 483.745 Q923.054 483.238 924.837 483.238 Q929.536 483.238 932.331 485.588 Q935.126 487.937 935.126 491.867 Q935.126 493.73 934.417 495.411 Q933.728 497.072 931.885 499.341 Q931.379 499.928 928.665 502.743 Q925.951 505.539 921.008 510.582 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip450)\" d=\"M776.271 794.832 Q779.208 795.46 780.849 797.445 Q782.51 799.43 782.51 802.346 Q782.51 806.823 779.431 809.273 Q776.352 811.724 770.681 811.724 Q768.777 811.724 766.752 811.339 Q764.746 810.975 762.599 810.225 L762.599 806.276 Q764.301 807.268 766.326 807.775 Q768.352 808.281 770.559 808.281 Q774.408 808.281 776.413 806.762 Q778.438 805.243 778.438 802.346 Q778.438 799.673 776.555 798.174 Q774.691 796.655 771.349 796.655 L767.825 796.655 L767.825 793.293 L771.511 793.293 Q774.529 793.293 776.129 792.098 Q777.73 790.882 777.73 788.614 Q777.73 786.284 776.069 785.049 Q774.428 783.793 771.349 783.793 Q769.668 783.793 767.744 784.158 Q765.82 784.522 763.511 785.292 L763.511 781.646 Q765.84 780.998 767.866 780.674 Q769.911 780.35 771.714 780.35 Q776.373 780.35 779.087 782.477 Q781.801 784.583 781.801 788.188 Q781.801 790.7 780.363 792.442 Q778.925 794.163 776.271 794.832 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip450)\" d=\"M840.634 755.99 L830.304 772.133 L840.634 772.133 L840.634 755.99 M839.561 752.425 L844.705 752.425 L844.705 772.133 L849.02 772.133 L849.02 775.535 L844.705 775.535 L844.705 782.665 L840.634 782.665 L840.634 775.535 L826.983 775.535 L826.983 771.586 L839.561 752.425 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip450)\" d=\"M653.81 1022.7 L669.872 1022.7 L669.872 1026.14 L657.557 1026.14 L657.557 1033.56 Q658.449 1033.25 659.34 1033.11 Q660.231 1032.95 661.122 1032.95 Q666.186 1032.95 669.143 1035.73 Q672.1 1038.5 672.1 1043.24 Q672.1 1048.12 669.062 1050.84 Q666.024 1053.53 660.494 1053.53 Q658.59 1053.53 656.605 1053.2 Q654.641 1052.88 652.534 1052.23 L652.534 1048.12 Q654.357 1049.11 656.302 1049.6 Q658.246 1050.09 660.413 1050.09 Q663.917 1050.09 665.963 1048.24 Q668.009 1046.4 668.009 1043.24 Q668.009 1040.08 665.963 1038.24 Q663.917 1036.39 660.413 1036.39 Q658.773 1036.39 657.132 1036.76 Q655.512 1037.12 653.81 1037.89 L653.81 1022.7 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip450)\" d=\"M843.591 1058.43 Q840.836 1058.43 839.216 1060.31 Q837.615 1062.19 837.615 1065.47 Q837.615 1068.74 839.216 1070.64 Q840.836 1072.52 843.591 1072.52 Q846.345 1072.52 847.945 1070.64 Q849.566 1068.74 849.566 1065.47 Q849.566 1062.19 847.945 1060.31 Q846.345 1058.43 843.591 1058.43 M851.713 1045.6 L851.713 1049.33 Q850.173 1048.6 848.593 1048.22 Q847.034 1047.83 845.494 1047.83 Q841.444 1047.83 839.297 1050.57 Q837.17 1053.3 836.866 1058.83 Q838.061 1057.07 839.864 1056.14 Q841.666 1055.18 843.834 1055.18 Q848.391 1055.18 851.024 1057.96 Q853.677 1060.71 853.677 1065.47 Q853.677 1070.13 850.923 1072.95 Q848.168 1075.76 843.591 1075.76 Q838.345 1075.76 835.57 1071.75 Q832.795 1067.72 832.795 1060.09 Q832.795 1052.92 836.198 1048.66 Q839.6 1044.39 845.332 1044.39 Q846.872 1044.39 848.431 1044.69 Q850.011 1045 851.713 1045.6 Z\" fill=\"#000000\" fill-rule=\"evenodd\" fill-opacity=\"1\" /><path clip-path=\"url(#clip450)\" d=\"M1307
]
2021-11-26 13:51:01 +00:00
},
"metadata": {},
"output_type": "display_data"
2021-11-26 13:51:01 +00:00
}
],
"source": [
"BestProfit, Bestsol, trParentnodes, trChildnodes, trNamenodes = SolveKnapInstance(\"data/test.opb\")\n",
"println(\"\\n******\\n\\nOptimal value = \", BestProfit, \"\\n\\nOptimal x=\", Bestsol)\n",
"graphplot(trParentnodes, trChildnodes, names=trNamenodes, method=:tree)"
]
}
],
"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
}