CPLEX i Docplex
Introducció
En aquest exemple, explorarem com enviar a Multivac un programa usant CPLEX i el mòdul docplex per a calcular una funció objectiu.
Warning
Si et surt un error indicant que el nombre de variables està limitat, és que no has creat el venv usant l’script especial per a crear el venv de Multivac, que és mvac_crear_venv.
Aquest script el que fa és parsejar el binari de CPLEX amb la llicència educativa per a Python 3.10 amb el de Python 3.11 que és el que hi ha al clúster.
Codi d’exemple
Suposem que volem minimitzar la següent funció objectiu:
Crearem un arxiu per exemple anomenat test_docplex.py per a calcular el valor de la funció objectiu per a un valor específic de x:
#!/usr/bin/python3
from docplex.mp.model import Model
if __name__ == '__main__':
# Creem un model
model = Model(name='Minimització_Funcio_Objectiu')
# Definim la variable de decisió
x = model.continuous_var(name='x')
# Afegim la restricció: x ha de ser igual a 5
model.add_constraint(x == 5, ctname='restriccio_x')
# Definim la funció objectiu a minimitzar
f_objectiu = x**2 + 3*x + 2
model.minimize(f_objectiu)
# Resolem el model
solucio = model.solve()
# Mostrem els resultats
print("Valor òptim de x:", solucio[x])
print("Valor òptim de la funció objectiu:", solucio.get_objective_value())
Aquest codi defineix la funció objectiu, assigna un valor específic a x (en aquest cas, 5), i calcula el resultat de la funció objectiu per a aquest valor de x.
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.
$ mvac_crear_venv
Crearem un document amb els parametres de configuració, per exemple: test_docplex.slurm` que conté la configuració d’execució per a aquest script de docplex.
VERSION=1.3
JOB_NAME=test_docplex
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=~/
COMMANDS=(
"hostname" #Per a saber a quina màquina s'ha executat
"source $ROUTE/venv/bin/activate"
"python3 $ROUTE/test_docplex.py"
"deactivate"
)
Aquest script el llançarem des de iocex usant la següent comanda:
multivac test_docplex.slurm
El resultat del nostre programa un cop finalitzada l’execució serà visible al mateix directori a on hem fet l’execució.