¿Cuál es el mejor lenguaje para formular un problema de optimización con CPLEX: OPL o Python?
Programming code abstract technology background of software developer and Computer script

¿Cuál es el mejor lenguaje para formular un problema de optimización con CPLEX: OPL o Python?

Si eres un profesional del Investigación de Operaciones o tienes una ligera noción sobre optimización, es posible que hayas escuchado hablar sobre motores de optimización. Para este artículo nos centraremos en CPLEX, un motor de optimización actualmente desarrollado por IBM, y sus diferentes opciones de formulación de problemas.  

Para los que conocen CPLEX saben que existen varias formar de formular un problema y llamar el motor para que haga su trabajo, hoy evaluaremos dos opciones.  

  1. Formulación de un problema por medio del lenguaje OPL (Optimization Programming Languaje), utilizando el entorno de desarrollo IBM ILOG CPLEX Optimization Studio.  

  1. Formulación en el lenguaje de programación Python con ayuda de la librería DOcplex.  

Ahora bien, ¿cuál de estas dos opciones es la mejor? 

Para responder esa pregunta No es necesario que seas un experto en OPL o Python, aquí te daré los pasos básicos para que utilices cualquiera de los dos métodos.  

Vamos a ver la formulación de un problema sencillo de optimización con cada una de estas opciones. Al final, tendrás las herramientas para decidir cuál es la opción que mejor se adapta a tu situación. 

El Problema 

Vamos a evaluar un sencillo problema de Planeación de Producción en una planta. La empresa XYZ produce cuatros referencias de artículos: A, B, C y D. Para tomar sus decisiones de producción debe tener en cuenta que tiene una capacidad medida en tiempo que no puede ser sobrepasada y no puede producir más artículos de los demandados.  

¿Cuántos artículos de cada referencia debe producir la empresa XYZ para maximizar sus ganancias?  

Para formular el problema tenemos los siguientes datos: 

Referencia (products)  Demanda (demand)  Ganancia (profit)  Tiempo producción (prod_time) 
50  40  15 
70  20  15 
100  10 
20  70  25 

Antes de pasar a usar cualquier lenguaje de programación, es mejor tener la formulación matemática clara, como en que cualquier curso que hayas tomado en optimización. Si todos tomamos un curso parecido, concordaríamos que esto se debe ver más o menos así: 

Ya que todos estamos de acuerdo con la formulación del problema, pasemos a usar los dos lenguajes de programación y evaluemos qué necesitamos en cada uno de ellos para realizar el mismo procedimiento.  

  1. Inicialización del problema 

  1. Definición de parámetros  

  1. Variables de decisión 

  1. Función Objetiva,  

  1. Restricciones 

  1. Ejecución del modelo   

  1. Visualización de resultados.
  1. Inicialización de un problema 

Cada una de nuestras opciones requiere un procedimiento previo a la formulación. Para el caso de OPL, es necesario disponer de IBM ILOG CPLEX Optimization Studio y crear un nuevo proyecto OPL con un archivo tipo modelo (.mod).  

Por su lado, Python requiere un editor de texto de preferencia del usuario (para el caso de este ejemplo, utilizaremos Jupyter Notebook) e importar la librería docplex con el módulo necesario para resolver el problema. En este caso utilizaremos el módulo de Mathematical programmingmp. Adicionalmente, debemos definir una instancia Model donde almacenaremos los elementos que necesitamos para definir el modelo. 

2. Definición de parámetros 

Teniendo nuestras instancias preparadas, para cualquiera de los dos casos, la primera parte de nuestra formulación debe ser la definición de conjuntos y parámetros. En nuestro ejemplo de producción de la empresa XYZ tenemos un conjunto de referencias de productos, tres parámetros asociados a los productos (demanda, ganancia, tiempo de producción), y la capacidad total disponible. 

Existen diferentes formas para definir parámetros o datos de entrada: definición dentro del código o lectura de una fuente externa. Para este ejemplo vamos a definirlos dentro del código. 

A la izquierda tenemos un ejemplo de definición de conjuntos y parámetros en OPL, a la derecha un ejemplo de definición de parámetros en Python. 

3. Definición de variables 

En OPL hay tres posibles tipos de variables: int, float, boolean, la indexación de las variables se hace por medio de corchetes [ ]. En Python, existen los mismos tipos de variables, pero además existen tipo de estructuras: variable única (model.integer_var()), diccionario de variables (model.integer_var_dict()), lista de variables (model.integer_var_list()) y matriz de variables (model.integer_var_matrix()). Dependiendo de la indexación, debe elegirse tanto el tipo como la estructura en la que se almacenan las variables de decisión.  

Para nuestro ejemplo la variable producción está indexada en el conjunto de productos. Para OPL, sólo debemos agregar [products] para definir el índice de las variables. En Python, debemos elegir una estructura tipo diccionario para almacenar más de una variable, el primer parámetro dentro del paréntesis debe ser los índices para los que indexará la variable. 

Adicionalmente, la restricción de naturaleza de las variables (las variables de decisión deben ser mayor o igual a 0) puede definirse desde la creación de las variables. En OPL es necesario definirlo como int+  y en Python debe incluirse un parámetro lb(lower bound) con el mínimo valor que debe tomar la variable, en este caso es 0. 

4. Definición de la Función Objetiva 

En OPL es necesario definir un elemento como una expresión por medio de dexpr, mientras que en Python no es necesario asignarle una definición de elemento.  

La definición de expresiones no sería indispensable para este caso ya que la función objetiva es muy sencilla. Esta práctica puede ser mejor utilizada cuando trabajamos con funciones objetivas con muchos componentes y definiciones largas para tener orden en el código. 

5. Definición de Restricciones 

En OPL, todo aquello que esté dentro de la sentencia subject to {  } ,o en Python, todo aquello que sea agregado como .add_constraint(), será considerado una restricción, pero su estructura es muy similar.  

6.Ejecutar del Modelo 

Este paso si es muy diferente para las dos opciones. Para el caso de OPL, se debe crear una instancia de configuración de ejecución donde debe agregarse el modelo que se quiere ejecutar, desde allí se debe ejecutar el archivo .mod. Para el caso de Python, debe darse una instrucción de solución en el código de tal forma que se llame al motor de optimización cuando se ejecute el script.  

7. Visualización de Resultados 

IBM ILOG CPLEX Optimization Studio tiene la ventaja de tener una visualización de datos y resultados del modelo integrada (estos están en el recuadro de la esquina inferior izquierda para quien sea nuevo con CPLEX Studio). Desde allí se pueden consultar los valores de entrada, los valores de las expresiones lineales y las variables de decisión, incluso cuando el número de variables es grande.  

En el caso de Python todos los resultados se almacenan en el elemento model y deben ser consultados por medio de métodos propios de la librería docplex. La forma más rápida de ver los resultados es imprimiéndolos con el comando model.print_solution(), este ofrece un resumen de la función objetiva y los valores de las variables.

Cuando manejes un gran número de variables, ejecutar model.print_solution() no es la mejor opción ya que tendrás una lista enorme de valores, haciendo difícil la lectura e interpretación. En ese caso, tendrás que hacer un post procesamiento de datos para almacenar la solución de una forma fácil de consultar y analizar. Por ejemplo, pandas es una excelente librería para manipulación y análisis de datos. En cuanto a la visualización de los datos, matplotlib y plotly son librerías perfectas para graficar tanto los datos de entrada como los resultados. 

Entonces, ¿cuál es la mejor opción? 

Hay varios factores a considerar cuando eliges una de estas dos opciones, y muchas veces depende de la confianza que tienes con cada uno de los lenguajes de programación. Para aquellos de ustedes que se sienten cómodos con Java y Java Script, OPL puede ser una opción ideal ya que su lenguaje es muy similar, o igual en los casos que se quiera hacer un pre o post procesamiento de datos. Para el otro grupo, aquellos que tiene preferencia hacia Python y es un lenguaje con el que se sienten más cómodos, complementar docplex integrando otras libreras para profundizar el análisis de datos de entrada o salida es su mejor opción.  

Finalmente, es posible que tengamos un último grupo, el que no ha utilizado ninguno de los dos lenguajes previamente. Para ustedes, no hay elección incorrecta, comiencen a explorar y descubrirán cuál será su lenguaje de preferencia con el transcurso de la práctica. 

Con todo, yo considero que aprender a formular problemas de optimización y resolverlos por medio del motor CPLEX es mucho más fácil de entender e implementar con OPLIBM ILOG CPLEX Optimization Studio, el entorno de desarrollo integrado, ofrece una amplia variedad de visualizaciones que te guían a entender qué está haciendo el modelo, manejar relajaciones y rastrear infactibilidades del modelo, determinando así si existen errores en tu formulación o en los datos de entrada. Una vez entiendes la formulación, puedes pasar a formular en Python con mayor confianza y además podrás tener librerías que faciliten el procesamiento y visualización de los datos. 

¿Y cómo sé lo que tengo que elegir?  

La elección no debe basarse en la formulación ni los elementos del problema, sino en el tratamiento de datos que debas realizar. Desde mi experiencia desarrollando diferentes modelos de optimización en SmartBP, elijo OPL cuando tengo una entrada de datos completa y limpia, donde no es necesario hacer un preprocesamiento de datos o la intervención es muy pequeña. Elijo Python y docplex cuando debo hacer un análisis y limpieza de los datos de entrada para asegurarme que todos los datos que ingresen al modelo de optimización cumplan con los requisitos. Adicionalmente, Python permite graficar todos los datos que sean requeridos haciendo la toma de decisiones más ágil. 

¡Ahora, es tu turno!  

¿Con cuál opción formularás tu próximo problema de optimización? 

 

Deja una respuesta

Cerrar menú