OptimJ es una extensión para Java con soporte de lenguaje para escribir modelos de optimización y abstracciones para el procesamiento de grandes volúmenes de datos. Las extensiones y el producto propietario que las implementa fueron desarrollados por Ateji, empresa que cesó sus operaciones en septiembre de 2011. [ 1 ] OptimJ tiene como objetivo proporcionar una notación algebraica clara y concisa para el modelado de optimización, eliminando las barreras de compatibilidad entre el modelado de optimización y las herramientas de programación de aplicaciones, y acercando técnicas de ingeniería de software como la orientación a objetos y el soporte de IDE modernos a los expertos en optimización.
Los modelos OptimJ son directamente compatibles con el código fuente Java y las bibliotecas Java existentes, como el acceso a bases de datos, la conexión con Excel o las interfaces gráficas. OptimJ es compatible con herramientas de desarrollo como Eclipse, CVS, JUnit o JavaDoc. OptimJ está disponible de forma gratuita con los siguientes solucionadores: formatos de archivo lp_solve, glpk, LP o MPS, y también es compatible con los siguientes solucionadores comerciales: MOSEK e IBM ILOG CPLEX Optimization Studio.
conceptos del lenguaje
OptimJ combina conceptos de lenguajes imperativos orientados a objetos con conceptos de lenguajes de modelado algebraico para problemas de optimización. Aquí revisaremos los conceptos de optimización incorporados a Java, comenzando con un ejemplo concreto.
El ejemplo de colorear un mapa
El objetivo de un problema de coloración de mapas es colorear un mapa de manera que las regiones que comparten una frontera común tengan colores diferentes. En OptimJ, se puede expresar de la siguiente manera:
ejemplos de paquetes ;// un modelo simple para el problema de coloración de mapas public model SimpleColoring solver lpsolve { // número máximo de colores int nbColors = 4 ;// Las variables de decisión almacenan el color de cada país var int belgium in 1 .. nbColors ; var int denmark in 1 .. nbColors ; var int germany in 1 .. nbColors ;// Los países vecinos deben tener restricciones de color diferentes { Bélgica != Alemania ; Alemania != Dinamarca ; }// un punto de entrada principal para probar nuestro modelo public static void main ( String [] args ) { // instanciar el modelo SimpleColoring m = new SimpleColoring ();// Resuélvelo m.extraer ( ); m.resolver ( ) ;// Imprimir soluciones System.out.println ( " Bélgica : " + m.value ( m.belgium ) ) ; System.out.println ( " Dinamarca : " + m.value ( m.denmark ) ) ; System.out.println ( " Alemania : " + m.value ( m.germany ) ) ; } }Los lectores familiarizados con Java notarán una gran similitud con este lenguaje. De hecho, OptimJ es una extensión conservadora de Java: todo programa Java válido es también un programa OptimJ válido y se comporta de la misma manera.
Este ejemplo de coloración de mapas también muestra características específicas de optimización que no tienen un equivalente directo en Java, introducidas por las palabras clave model, var, constraints.
conceptos específicos del quirófano
Modelos
Un modelo es una extensión de una clase Java que puede contener no solo campos y métodos, sino también restricciones y una función objetivo. Se introduce mediante la modelpalabra clave `<model>` y sigue las mismas reglas que las declaraciones de clase. Un modelo no abstracto debe vincularse a un solucionador, introducido mediante la palabra clave `<model>` solver. Las capacidades del solucionador determinarán qué tipo de restricciones se pueden expresar en el modelo; por ejemplo, un solucionador lineal como `lp solve` solo permitirá restricciones lineales.
Modelo público SimpleColoring solucionador lpsolveVariables de decisión
Los lenguajes imperativos como Java proporcionan el concepto de variables imperativas , que básicamente representan ubicaciones de memoria en las que se puede escribir y desde las que se puede leer.
OptimJ también introduce el concepto de variable de decisión, que básicamente representa una cantidad desconocida cuyo valor se busca. La solución a un problema de optimización es un conjunto de valores para todas sus variables de decisión que respeta las restricciones del problema; sin variables de decisión, no sería posible plantear problemas de optimización. El término "variable de decisión" proviene de la comunidad de optimización, pero en OptimJ las variables de decisión son el mismo concepto que las variables lógicas en lenguajes lógicos como Prolog.
Las variables de decisión tienen tipos especiales introducidos por la palabra clave var. Hay un vartipo para cada tipo posible de Java.
// un tipo de variable para un tipo primitivo de Java var int x ;// un tipo de variable para una clase definida por el usuario var MyClass y ;En el ejemplo de coloración del mapa, se introdujeron variables de decisión junto con el rango de valores que pueden tomar.
var int germany en 1 .. nbColors ;Esto es simplemente una forma abreviada de establecer una restricción en la variable.
Restricciones
Las restricciones expresan condiciones que deben cumplirse en cualquier solución del problema. Una restricción puede ser cualquier expresión booleana de Java que involucre variables de decisión.
En el ejemplo de coloración de mapas, este conjunto de restricciones establece que, en cualquier solución al problema de coloración de mapas, el color de Bélgica debe ser diferente del color de Alemania, y el color de Alemania debe ser diferente del color de Dinamarca.
restricciones { Bélgica != Alemania ; Alemania != Dinamarca ; }El operador !=es el operador estándar de desigualdad de Java.
Las restricciones suelen venir en lotes y se pueden cuantificar con el foralloperador. Por ejemplo, en lugar de enumerar explícitamente todos los países y sus vecinos en el código fuente, se puede tener una matriz de países, una matriz de variables de decisión que representen el color de cada país y una matriz boolean[][] neighboringo un predicado (una función booleana) boolean isNeighbor().
restricciones { para todos ( País c1 : países , País c2 : países , : esVecino ( c1 , c2 )) { color [ c1 ] != color [ c2 ] ; } }Country c1 : countrieses un generador: itera c1sobre todos los valores de la colección countries.
:isNeighbor(c1,c2)es un filtro: conserva solo los valores generados para los que el predicado es verdadero (el símbolo :puede leerse como "si").
Suponiendo que el array countriescontiene belgium, germanyy denmark, y que el predicado isNeighbordevuelve truepara las parejas ( Belgium , Germany) y ( Germany, Denmark), entonces este código es equivalente al bloque de restricciones del ejemplo original de coloración de mapas.
Objetivos
Opcionalmente, cuando un modelo describe un problema de optimización, se puede indicar en el modelo una función objetivo que se deba minimizar o maximizar.
Conceptos generalistas
Los conceptos generalistas son conceptos de programación que no son específicos de los problemas de investigación operativa y que resultan útiles para cualquier tipo de desarrollo de aplicaciones. Los conceptos generalistas incorporados a Java por OptimJ facilitan y simplifican la expresión de modelos de investigación operativa. Suelen estar presentes en lenguajes de modelado más antiguos, lo que proporciona a los expertos en investigación operativa una forma familiar de expresar sus modelos.
Matrices asociativas
Mientras que los arrays de Java solo se pueden indexar con enteros basados en cero, los arrays de OptimJ se pueden indexar con valores de cualquier tipo. Estos arrays se denominan normalmente arrays asociativos o mapas. En este ejemplo, el array agecontiene la edad de las personas, identificadas por su nombre:
int [ Cadena ] edad ;El tipo int[String]que denota una matriz intindexada por String. Acceso a matrices OptimJ utilizando la sintaxis estándar de Java:
edad [ "Stephan" ] = 37 ; x = edad [ "Lynda" ] ;Tradicionalmente, los arreglos asociativos se utilizan ampliamente en la expresión de problemas de optimización. Los arreglos asociativos de OptimJ son muy útiles cuando se asocian a su sintaxis de inicialización específica. Los valores iniciales se pueden proporcionar en la definición intensional , como en:
int [ String ] edad = { "Stephan" -> 37 , "Lynda" -> 29 };o puede darse en definición extensional , como en:
int [ String ] length [ String nombre : nombres ] = nombre.length ( ) ;Aquí cada una de las entradas length[i]se inicializa con names[i].length().
Inicialización extendida
Tuplas
Las tuplas son omnipresentes en la informática, pero están ausentes en la mayoría de los lenguajes de programación más comunes, incluido Java. OptimJ proporciona una noción de tupla a nivel de lenguaje que puede ser muy útil como índices en combinación con arreglos asociativos.
(: int , String :) myTuple = new (: 3 , "Three" :); String s = myTuple # 1 ;Los tipos de tupla y los valores de tupla se escriben entre (:y :).
Rangos
Comprensión
Las comprensiones , también llamadas operaciones de agregación o reducciones, son expresiones de OptimJ que extienden una operación binaria dada sobre una colección de valores. Un ejemplo común es la suma:
// la suma de todos los enteros del 1 al 10 int k = sum { i | int i in 1 .. 10 };Esta construcción es muy similar a la notación de sumatoria de sigma grande utilizada en matemáticas, con una sintaxis compatible con el lenguaje Java.
Las comprensiones también se pueden utilizar para construir colecciones, como listas, conjuntos, multiconjuntos o mapas:
// el conjunto de todos los enteros del 1 al 10 HashSet < Integer > s = ` hashSet (){ i | int i in 1 .. 10 };Las expresiones de comprensión pueden tener como destino una expresión arbitraria, como en:
// la suma de todos los cuadrados de los enteros del 1 al 10 int k = suma { i * i | int i en 1 .. 10 };También pueden tener un número arbitrario de generadores y filtros:
// la suma de todas las f(i,j), para 0<=i<10, 1<=j<=10 e i!=j int k = sum { f ( i , j ) | int i : 10 , int j : 1 .. 10 , : i != j }La comprensión no tiene por qué aplicarse solo a valores numéricos. Las comprensiones de conjuntos o multiconjuntos, especialmente en combinación con tuplas de cadenas, permiten expresar consultas muy similares a las consultas de bases de datos SQL:
// seleccionar nombre de personas donde edad > 18 ` multiSet (){ p . nombre | Persona p : personas , : p . edad > 18 }En el contexto de los modelos de optimización, las expresiones de comprensión proporcionan una forma concisa y expresiva de preprocesar y limpiar los datos de entrada, y de formatear los datos de salida.
Entorno de desarrollo
OptimJ está disponible como complemento para Eclipse. El compilador implementa una traducción de código fuente a código fuente de OptimJ a Java estándar, lo que proporciona compatibilidad inmediata con la mayoría de las herramientas de desarrollo del ecosistema Java.
Interfaz gráfica de usuario OptimJ y creación rápida de prototipos
Dado que el compilador OptimJ conoce la estructura de todos los datos utilizados en los modelos, puede generar una representación gráfica estructurada de estos datos en tiempo de compilación. Esto es especialmente relevante en el caso de matrices asociativas, donde el compilador conoce las colecciones utilizadas para indexar las distintas dimensiones.
La vista gráfica básica generada por el compilador recuerda a un cubo OLAP . Posteriormente, se puede personalizar de muchas maneras diferentes, desde simples cambios de color hasta la incorporación de nuevos widgets para mostrar elementos de datos.
La interfaz gráfica de usuario (GUI) de OptimJ, generada por el compilador, evita que el experto en investigación operativa tenga que escribir todo el código de conexión necesario para mapear las bibliotecas gráficas a los datos. Permite la creación rápida de prototipos, al proporcionar información visual inmediata sobre la estructura de los datos.
Otra sección de la interfaz gráfica de OptimJ muestra estadísticas de rendimiento del solucionador en tiempo real. Esta información puede utilizarse para comprender los problemas de rendimiento y mejorar el tiempo de resolución. Por el momento, solo está disponible para lp_solve.
Solucionadores compatibles
OptimJ está disponible de forma gratuita con los siguientes solucionadores en formatos de archivo lp_solve, glpk, LP o MPS, y también es compatible con los siguientes solucionadores comerciales: Mosek, IBM ILOG CPLEX Optimization Studio.
Enlaces externos
- Modelado orientado a objetos con OptimJ
- El manual del lenguaje OptimJ
- Interfaz gráfica de usuario de OptimJ
Referencias
- ↑ "Ateji está cerrado" . Consultado el 11 de enero de 2012 .
- Desarrollo rápido de aplicaciones con OPTIMJ: informe de experiencia práctica. David Gravot, Patrick Viry. EURO 2010 (Lisboa).
- OptimJ se utiliza en un modelo de optimización para líneas de montaje de modelos mixtos, Universidad de Münster. Archivado el 20 de julio de 2011 en Wayback Machine.
- OptimJ se utiliza en una técnica aproximada de cálculo de equilibrio perfecto en subjuegos para juegos repetidos, Universidad Laval.
- Lenguajes de programación orientados a objetos
- Software de optimización matemática
- Modelado matemático
- Lenguajes de programación descontinuados
- Lenguajes de programación creados en 2006