Gurobi

Introducció

En aquest exemple, explorarem com enviar a Multivac un programa usant Gurobi per a calcular una funció objectiu usant Python.

Crearem un arxiu per exemple anomenat test_gurobi.py per a calcular el resultat

Codi d’exemple

from gurobipy import Model, GRB

# Crear un model nou
model = Model("Exemple")

# Afegir variables de decisió
x = model.addVar(name="x")
y = model.addVar(name="y")

# Definir la funció objectiu
model.setObjective(3 * x + 4 * y, GRB.MAXIMIZE)

# Afegir restriccions
model.addConstr(2 * x + y <= 20, "Restricció 1")
model.addConstr(4 * x + 3 * y <= 45, "Restricció 2")
model.addConstr(x >= 0, "Restricció 3")
model.addConstr(y >= 0, "Restricció 4")

# Optimitzar el model
model.optimize()

# Mostrar els resultats
if model.status == GRB.OPTIMAL:
   print(f"Solució òptima trobada: x = {x.X}, y = {y.X}")
   print(f"Valor de la funció objectiu: {model.ObjVal}")
else:
   print("No s'ha trobat una solució òptima.")

Execució

Crearem un virtual environment de python anomenat venv. Aquest pas només és necessari fer la primera vegada que es vol crear el venv, les altres vegades es pot reusar el mateix. Es requereix instal·lar el paquet gurobipy: pip install gurobipy

$ python3 -m venv venv
$ source venv/bin/activate
$ pip install gurobipy
$ deactivate

Crearem un document amb els parametres de configuració, per exemple: test_gurobi.slurm` que conté la configuració d’execució per a aquest script de gurobi. Escull entre una de les dues alternatives que s’ofereixen

VERSION=1.3
JOB_NAME=test_gurobi
NAME_OUTPUT=out
PARTITION=all
N_TASKS=1
CPUS_PER_TASK=1
MAIL_TYPE=END,FAIL
MAIL_USER=nom.usuari@upc.edu
MEMORY=1G
BEGIN=now
TIME_LIMIT=00:05:00
LOG_OUTPUT=log
FORCED_NODES=
EXCLUDED_NODES=
ROUTE=~/
# ALTERNATIVA 1
COMMANDS=(
   "hostname" #Per a saber a quina màquina s'ha executat
   "source $ROUTE/venv/bin/activate"
   "python3 $ROUTE/test_gurobi.py"
   "deactivate"

)
#ALTERNATIVA 2
COMMANDS=(
   "/opt/gurobi/gurobi1102/linux64/bin/gurobi.sh \"$ROUTE/test_gurobi.py\""
)

Aquest script el llançarem des de iocex usant la següent comanda:

multivac test_gurobi.slurm

El resultat del nostre programa un cop finalitzada l’execució serà visible al mateix directori a on hem fet l’execució.