Sunteți pe pagina 1din 3

Facultad de Ciencias Físicas y Matemáticas Universidad de Chile

MA4702. Programación Lineal Mixta: Teoría y Laboratorio. 2019.


Profesor: Marcos Kiwi.
Auxiliar: Julio Maldonado.
Ayudantes: Javiera Figols, Freddy Flores.

Lab. 3: Branch & Bound.


(Tarea Introductoria)

Preliminares
Este laboratorio consta de 3 etapas. Una tarea introductoria, una etapa presencial y otra no-presencial. La nota
global del laboratorio será 30 % (TI) + 40 % (TP) + 30 % (TNP), donde (TI) es la nota de la tarea introductoria,
(TP) la nota del trabajo presencial y (TNP) la nota del trabajo no presencial.
Entregables: Vía UCursos antes de las 14:15 del Miércoles 08 de Mayo de 2019.1
En esta Tarea Introductoria debe entregar los siguientes dos archivos:
• lab3TI-cdg-apellido.jl (archivo de código)
• lab3TI-sal-apellido.txt (archivo de salida)
donde apellido es su apellido.
Realice esta tarea de manera individual. Bajo ningún motivo comparta o deje a disposición de sus compañeros
parte de su tarea. Se realizará un estudio de similitudes entre los archivos resultantes para detectar posibles plagios.
Sus scripts deben funcionar en Julia ejecutando include("lab3TI-cdg-apellido.jl").

1. Introducción
El objetivo de esta Tarea Introductoria es familiarizarse con un programa en Julia/JuMP/Gurobi para crear y manipular
un árbol Branch & Bound (BnB) obtenido al resolver un programa entero. En la parte presencial del laboratorio se
manipulará y modificará un programa similar para ilustrar y estudiar el efecto de distintas opciones involucradas en el
uso de la técnica de BnB.

2. Trabajo a realizar
En UCursos encontrará un archivo cuyo nombre es lab3TI-cdg-apellido.jl. Cópielo en su directorio de trabajo reem-
plazando apellido por apellido.
También copie a su directorio de trabajo el archivo lab3Structs.jl disponible en UCursos. En este archivo se definen
un par de tipos compuestos (llamados struct’s en Julia). En particular, se definen los siguientes tipos:
BBNode: Describe un nodo de un árbol de BnB.
BBStatus: Describe información relacionada a un árbol de BnB como cota superior, cota inferior, solución incum-
bente, etc.
Por completitud, a continuación se incluye una copia del archivo lab3Structs.jl.
1 Se descontará 1.0 pts por cada 15 minutos o fracción de atraso.

1
Facultad de Ciencias Físicas y Matemáticas Universidad de Chile

using JuMP, Gurobi

# Structure of a node in the tree (always copied).


mutable struct BBNode
# Tree structure.
parent::Union{Nothing, BBNode}
children::Array{BBNode, 1}

# Branching information.
variable::Int # Just an index of the variable for the branching.
# Indexing starts at 1 (0: no branching; only for root node).
variable_value::Int

# Node’s LP information.
lp_value::Float64
lp_feasibility::MOI.TerminationStatusCode # :Optimal or something else.
solution::Array{Float64, 1}
integer_feasible::Bool
end

mutable struct BBStatus


upper_bound::Float64 # Computed from the LPs.
lower_bound::Float64 # Incumbent.
incumbent::Array{Int, 1} # Rounded from floating-point solution.

root::BBNode
# Optimisations: list of nodes to avoid going through all the tree,
# sort nodes so the most interesting ones are picked up first, etc.
end

Analice el programa lab3TI-cdg-apellido.jl. Vea que funciones implementa, estudie la dependencia entre las funciones
(cuáles invocan a cuáles), etc.
En UCursos también encontrará un .zip que contiene varios archivos, cada uno de ellos describiendo una instancia del
problema Knapsack 0-1. La i-ésima línea de cada archivo de instancias contiene un par de números separado por una
coma que representan el peso y el valor del ítem i, respectivamente. En los archivos de instancias, no se indica el peso total
que soporta la mochila dado que siempre se asumirá que el límite es 5 veces el número de ítems de la instancia (número
de líneas del archivo correspondiente).
Ejecute el programa mediante el comando indicado a continuación (que debe ser ingresado en un terminal estando en
su directorio de trabajo). Analice la salida generada por el programa. Contraste la salida con el código del programa
identificando qué partes del código son responsables de generar cada parte de la salida.
julia lab3TI-cdg-apellido.jl

Modifique el programa lab3TI-cdg-apellido.jl agregándole las siguientes 4 funciones:


function profundidad(node::BBNode): Dado un nodo node tipo BBNode retorna la profundidad del sub-
árbol del árbol de BnB enraizado en node.
function vertices(node::BBNode): Dado un nodo tipo BBNode retorna la cantidad de vértices del sub-árbol
del árbol de BnB enraizado en node.

2
Facultad de Ciencias Físicas y Matemáticas Universidad de Chile

function hojas(node::BBNode): Dado un nodo node tipo BBNode retorna la cantidad de hojas del sub-árbol
del árbol de BnB enraizado en node.
function histograma(node::BBNode, level::Int, hist): Dado un nodo node tipo BBNode raíz de un
sub-árbol de un árbol BnB de profundidad level y un arreglo hist de largo level+1 (cuyos elementos están
inicializados en 0), la función modifica dicho arreglo de forma de que hist[d] sea el número de nodos del
árbol enraizado en node a profundidad d-1 (por convención, la raíz del árbol, esta a profundidad 0, por lo que
hist[1] necesariamente será igual a 0).
Finalmente, descomente las 8 líneas de código que se encuentran hacia el final del programa (las líneas que es-
tán entre #BEGIN_Descomentar y #END_Descomentar), ejecute el programa y guarde la salida en el archivo
lab3TI-sal-apellido.txt. Por ejemplo, para el árbol de más abajo, las 4 funciones indicadas retornaría 3, 7,
4, y [1, 2, 2, 2], respectivamente.

S-ar putea să vă placă și