En esta página, se enumeran los cambios realizados en las herramientas OR, lo que incluye funciones nuevas, correcciones de errores y mejoras en el código y los procedimientos de instalación.
Si tienes problemas para instalar las herramientas OR, consulta la sección Solución de problemas de las instrucciones de instalación de las herramientas OR. Si tu problema no aparece allí, verifica los problemas en GitHub o no dudes en abrir uno nuevo, y con gusto te ayudaremos.
A continuación, se incluyen las notas de la versión de las herramientas del operador OR, que comienzan con la versión más reciente.
Mayo de 2024
Anuncio del lanzamiento de la versión 9.10 de las herramientas OR
Lanzamos OR-Tools v9.10. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Puedes encontrar la nota de la versión en GitHub.
March 2024
Anuncio del lanzamiento de la versión 9.9 de OR-Tools
Lanzamos OR-Tools v9.9. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Puedes encontrar la nota de la versión en GitHub.
Noviembre de 2023
Anuncio del lanzamiento de la versión 9.8 de las herramientas OR
Lanzamos OR-Tools v9.8. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Cambios en la plataforma
- Agrega Python 3.12.
- Cómo agregar compatibilidad con Ubuntu 23.10
Servicio de resolución lineal
- Puerto
ModelBuilder
a .NET. - Se cambió el nombre de
LogCallback
aMbLogCallback
para evitar la colisión con SAT LogCallback. - Extiende la API de ModelBuilder:
- Agrega restricciones de indicadores.
- Agrega compatibilidad con sugerencias.
- Agrega clonación de modelos.
Opción matemática
- Revisión profunda.
Enrutamiento
- Agrega el estado
ROUTING_OPTIMAL
. - Se hizo que
RoutingModel
no se pueda copiar ni mover. - Se corrigieron algunos bucles infinitos en los operadores de búsqueda local.
- Agrega un struct interno
PickupDeliveryPosition
. - Se agregaron los métodos
IsPickup()
yIsDelivery()
.
SÁB
- Reduce el uso de memoria para modelos grandes.
- Se mejoró la programación de la búsqueda.
- agrega packing_precedences_lns.
- optimizar y corregir el salto de viabilidad.
- optimizar el registro de resolución lineal y mejor resolución.
- Se mejoró la resolución para
int_abs
,int_mod
,int_prod
ylin_max
. - Mejora la compatibilidad con Panda
- Pocos correcciones de errores.
Agosto de 2023
Anuncio del lanzamiento de la versión 9.7 de OR-Tools
Lanzamos OR-Tools v9.7. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Cambios en la plataforma
- Descartar Centos-8 (EOL).
- Deja Debian 10.
- Soltar el sombrero
[33, 36]
(EOL) - Baja Ubuntu 18.04 LTS (EOL).
- Descartar Python 3.7 (EOL).
- Inhabilita la compatibilidad de
netcore3.1
en CMake (EOL).
Python del compilador de modelos
- Permite el uso de DataFrames y series de Pandas para crear variables.
- consulta la tarea
- consulta bin_packing
- Completa la información de escritura
PDLP
- varias actualizaciones.
CP-SAT
- Se implementaron mejoras en el rendimiento. (feasibility_jump, lin_max)
- Mejora la administración de cortes
- Se agregó un nuevo trabajador objetivo_s tener_search dedicado a mejorar el límite inferior del objetivo (cuando se lo minimiza).
- Escribir anotaciones para cp_model.py de Python
- Compatibilidad parcial experimental para Pandas en cp_model.py
- consulta la tarea
- consulta bin_packing
- Trabajadores basados en incumplimientos de la búsqueda local experimental:
- habilitada con el parámetro num_violation_ls:xxx
- Optimizado para un modelo lineal (
linear
,bool_or
,bool_and
,at_most_one
,exactly_one
) - funciona correctamente con lin_max, product, division
- admite no_superlap, cumulative, circuito, routes
- inhabilitado con no_overlap_2d
- Cantidad recomendada de trabajadores ls:
num_workers
->num_violation_ls
:(8, 1), (16, 2) (24, 3), (32, 4)
Marzo de 2023
Anuncio del lanzamiento de las herramientas OR v9.6
Lanzamos OR-Tools v9.6. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Cambios en la plataforma
- Se agregó compatibilidad con Fedora 37, 38.
- Drop Python 3.6 (no compatible con
protobuf
). - Descartar Python 3.7 en macOS (no compatible con
scipy
). - Se agregó compatibilidad con
net7.0
en CMake (usa-DUSE_DOTNET_7=ON
). - Suelta
netcore3.1
en paquetes nuget .org
Dependencias
- SCIP
v801
->v803
(nota: ahora SCIP usa una licencia compatible con OSI) - ábseil
20220623.1
->20230105.0
- Protobuf
v21.5
->v21.12
- SWIG
4.1.1
- JNA de Java
5.11.0
->5.12.1
Bazel
- Agrega compatibilidad con pybind11.
- Se agregó compatibilidad con wrapper de Java.
Resolutores
- PDLP: dd python wrapper
- CP-SAT: Mejoras en el rendimiento
- GLOP: Ajusta la resolución.
- ModelBuilder: Python: mejora la compatibilidad con NumPy.
- Enrutamiento: Mejoras en el rendimiento (búsqueda local)
Problemas conocidos:
- CP-SAT: Si se ignora el subencargado de
pseudo_costs
, se muestran parámetros no válidos (consulta #3706).
Noviembre de 2022
Anuncio del lanzamiento de la versión 9.5 de las herramientas OR
Lanzamos OR-Tools v9.5. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Cambios en la plataforma
- Agrega compatibilidad con Debian Sid.
- Agrega compatibilidad con Fedora 35, 36
- Agrega compatibilidad con Ubuntu 22.10.
- Lanzar Python 3.6 en macOS
- Agrega compatibilidad con Python 3.11.
Actualización de dependencias
- Protobuf
v19.4
->v21.5
. - Resolución de SCIP
v800
->v801
.
CP-SAT
- Mejoras para resolver problemas: max(array), restricciones booleanas, restricciones lineales.
- La búsqueda intercalada debe ser determinística en paralelo.
- Cortes lineales: Cortes de cortes int_prod y cuadrado de limpieza; reescritura de la canalización de cortes
- Modelo de entrada de huella digital y solución (visible en el registro).
- Se están programando las mejoras.
- El conjunto habitual de correcciones de errores (fallas durante la resolución de problemas, fallas en los cortes, soluciones inviables, modelos inviables en LNS)
GLOP
- Acelera mediante la reescritura de álgebra lineal y la regla de selección de eje.
Servicio de resolución lineal
- Se agregó
knapsack_interface.cc
, - Traslada la API de model_builder al directorio linear_solver (encabezados y muestras).
- Agrega compatibilidad con Gurobi 10.
Enrutamiento
- Liberar pocos analizadores para varios desafíos de enrutamiento
Agosto de 2022
Anuncio del lanzamiento de la versión 9.4 de las herramientas OR
Lanzamos OR-Tools v9.4. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Plataformas
- Agrega compatibilidad con Debian-10 (consulta #3029).
- Agrega compatibilidad con Ubuntu 22.04 LTS (consulta #3276). Nota: No tendrá compatibilidad con .NET 3.1 (consulta dotnet/core#7038).
- Se quitó la compatibilidad con Ubuntu 21.10.
Varios
- Divide el archivo por idiomas y agrega la configuración de CMake a la de C++ (#3200).
Gráfico
Dividir ortools.graph.pywrapgraph
en:
ortools.graph.python.linear_sum_assignment
.ortools.graph.python.max_flow
.ortools.graph.python.min_cost_flow
.
Esto permite usar NumPy para agilizar la configuración de los problemas.
CP-SAT
Algunas mejoras en lo siguiente:
- programación (propagación, cortes, límites inferiores).
- MaxSAT (presolver, heurística basada en núcleo).
- Rendimiento del MIP (presolver, cortes).
Marzo de 2022
Anuncio del lanzamiento de la versión 9.3 de las herramientas OR
Lanzamos OR-Tools v9.3. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Cambios en la plataforma
- Quita la compatibilidad con Debian-10.
- Deja de ser compatible con Ubuntu-16.04.
- Descartar .NET Framework 4.5.2.
Actualización de dependencias
- Agrega Eigen
3.4.0
. - Agrega Google re2
2021-11-01
. - Protobuf
3.19.1
->3.19.4
. - SCIP
7.0.1
->v800
.
Python
- Agrega pybind11.
Funciones
- Se agregó PDLP como experimental.
- Se agregó MathOpt como experimental.
CP-SAT
- Se cambió el nombre de algunas API para mantener la coherencia, p. ej.,
LinearExpr.ScalProd.
->LinearExpr.WeightedSum.
- Se agregaron los métodos
AddAtLeastOne
/AddAtMostOne
/AddExactlyOne
. - Agrega
AddMultiplicationConstraint(z, x, y)
en todos los idiomas. - Agrega
AddMultipleCircuit()
en todos los idiomas.
C++
- Respuesta explícita
IntVar(BoolVar)
. - Se quitó
LinearExpr::Add*
y se reemplazó por un operador, p.ej.,LinearExpr +=
. - Agrega operadores aritméticos a la expresión lineal.
- Se quitó
LinearExpr::BooleanSum/BooleanScalProd
, usaSum/WeightedSum
. - Agrega
CpModelBuilder::FixVariable()
, que reemplaza el dominio de la variable por un solo valor.
Java
- Vuelve a escribir
LinearExpr
y agrega una clase de compilador incremental:LinearExpr.newBuilder().add(x).addSum(<array of variables>).build()
. - Sigue la API de C++:
Circuit
,MultipleCircuit
,Cumulative
,Reservoir
,AllowedAssignment
yForbiddenAssignment
ahora muestran una clase especializada con una API incremental para agregar variables, términos y demandas nuevos...
C
- Documenta todos los métodos.
- Sigue la API de C++:
Circuit
,MultipleCircuit
,Cumulative
,Reservoir
,AllowedAssignment
yForbiddenAssignment
ahora muestran una clase especializada con una API incremental para agregar variables, términos y demandas nuevos... - Agrega la clase
LinearExprBuilder
para compilar expresiones de forma incremental.
Sistema de compilación
CMake
- Se requiere al menos CMake >= 3.18.
Marca
- Ahora, usa la compilación basada en CMake internamente.
Diciembre de 2021
Anuncio del lanzamiento de la versión 9.2 de las herramientas OR
Lanzamos OR-Tools v9.2. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Cambios en la plataforma
- Agrega compatibilidad con Ubuntu 21:10 (última versión progresiva).
Actualización de dependencias
- Actualización de .NET TFM desde net5.0 a net6.0 (se necesita el SDK de .NET 6.0 LTS y el SDK .NET 3.1 LTS).
- abseil-cpp 20210324.2 -> 20211102.0.
- Protobuf 3.18.0 -> 3.19.1.
- Googletest 1.10.0 a 1.11.0.
- Python: agrega NumPy >= 1.13.3.
- En macOS, compila Coin-OR en
-O1
para evitar fallas en los ejecutores.
Enrutamiento
- Mejoras en los filtros
- Mejorar la heurística de la primera solución
- Mejore las ubicaciones de las pausas temporales.
CP-SAT
Cambios rotundos
- El búfer de protocolo subyacente no es compatible con versiones anteriores. Cualquier búfer de protocolo almacenado deberá volver a generarse con las APIs de compilador actualizadas (en C++, Python, Java y .NET).
- En particular, el protobuf de intervalo estaba limpio, ya que quitamos los campos antiguos (inicio, tamaño y fin) y cambiamos el nombre de los nuevos (con
_view
) para usar el nombre de los campos que se quitaron.
Funciones nuevas
- Las restricciones
all_different
,reservoir
,modulo
,multiplication
ydivision
aceptan expresiones afines (a * var + b
) en todos los lugares en los que requirieran variables de número entero. - El objetivo acepta coeficientes de punto flotante (consulta la clase
DoubleLinearExpr
en C++/Java/.NET. Consulta el ejemplo deknapsack_2d_sat.py
en Python). - La restricción
no_overlap_2d
admite intervalos opcionales. - La API de C++ implementa operadores
+
y*
para compilar expresiones.
Mejoras
- Se mejoró el código de resolución de problemas.
- Un verificador de modelos más estricto.
- Restricción del embalse para rehacer.
- Se agregaron cortes enérgicos a la restricción no_overlap_2d.
- Se mejoró la relajación lineal de las restricciones de codificación (
literal implies var == value
).
Métodos obsoletos y quitados
BooleanSum
yBooleanScalProd
de C++ dejaron de estar disponibles. Solo usaSum
yScalProd
.- Se quitaron
AddLinMinEquality
yAddLinMaxEquality
de C++. Solo usaAddMinEquality
yAddMaxEquality
.
Incompatibilidades futuras
- En algún momento, volveremos a escribir la capa de modelado de Java para que esté más cerca de la capa de C++.
- En la capa de modelado de C++, haremos que el controlador IntVar(BoolVar var) sea explícito.
- Estamos contemplando la posibilidad de que la API de Python cumpla con la PEP 8 (con nombres de snake_case). Si esto sucede, proporcionaremos un archivo sed para portar el código.
Sistema de compilación
Bazel
- Corrige la compilación de Windows.
CMake
- Agrega la opción
FETCH_PYTHON_DEPS
(el valor predeterminado esON
). - Se agregó compatibilidad opcional con el solucionador de GPLK (valor predeterminado:
-DUSE_GLPK=OFF
).
Python
- Admite números enteros
numpy
en la mayor parte de la API de CP-SAT. - Se corrigió
__version__
faltante.
Septiembre de 2021
Anuncio del lanzamiento de la versión 9.1 de las herramientas OR
Lanzamos OR-Tools v9.1. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Cambios en la plataforma
- Python: usa la imagen
manylinux2014
(consulta PEP 599). - Python: Agrega compatibilidad con aarch64 Linux usando la imagen
manylinux2014_aarch64
. - .NET: agrega compatibilidad con .NET 5.0.
Actualización de dependencias
- abseil-cpp 20210324.1 -> 20210324.2.
- Protobuf 3.15.8 -> 3.18.0.
- SCIP 7.0.1 -> principal.
- Googletest 1.8.0 -> 1.10.0
- Python: Uso de
warning
encp_model.py
(consulta #2530). - python: absl-py 0.11 -> 0.13.
CMake
- Modifica la versión mínima requerida de la versión 3.14 a la 3.15 (consulta #2528).
- Python: versión mínima requerida de la actualización de la versión 3.14 a la 3.18 (consulta #2774).
Marca
La compilación basada en Make dejó de estar disponible. Migra a CMake o Bazel para compilar desde la fuente.
Java
- Mejora la solidez del cargador de bibliotecas nativas (consulta #2742).
- Se corrigió la falla del recolector de elementos no utilizados de JVM cuando se eliminaba el modelo de enrutamiento o el solucionador de restricciones (consulta #2091) (consulta #2466).
- Se corrigió la falla de devolución de llamada del registro CP-SAT cuando se usan varios trabajadores (consulta #2775).
CP-SAT
- Mejora la solidez del código LNS (consulta #2525).
- Se mejoró el código de programación: se agregaron nuevos métodos de fábrica para crear intervalos de tamaño fijo, nuevas heurísticas de búsqueda, mejores presolve y nuevos cortes lineales.
- Mejorar el código de enrutamiento: nuevo LNS dedicado
- Mejorar el verificador de modelos Ahora es más pedante, en especial, desbordamientos potenciales de WRT.
- Se mejoró el código MIP: Mejor prioridad de resolución y varias mejoras en la relajación lineal de los modelos MIP y CP.
- Mejorar la diversidad en las búsquedas. Cuando uses más de 12 trabajadores, agrega trabajadores dedicados a mejorar el límite inferior del objetivo.
- Cambia al código de paralelismo: De forma predeterminada, el solucionador ahora usará todos los núcleos disponibles. Usa
num_search_parameters
para especificar el nivel de paralelismo. SearchAllSolutions
ySolveWithSolutionCallback
dejaron de estar disponibles.- API de Python: verificaciones más pedantes cuando se usa
var == ...
ovar != ...
fuera de una llamada amodel.Add()
Abril de 2021
Anuncio del lanzamiento de la versión 9.0 de las herramientas OR
Lanzamos OR-Tools v9.0. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Actualizaciones de dependencias
- Abseil-cpp 20200923.3 se actualizó a 20210324.1 LTS
- Protobuf 3.15.3 se actualizó a 3.15.8.
- Java: jna-platform 5.5.0 actualizado a 5.8.0
Java
- OR-Tools ahora está disponible en Maven Central (consulta com.google.ortools:ortools-java).
Correcciones de errores
- Se mejoró la capacidad de varios subprocesos cuando se usa el solucionador de problemas CP-SAT (consulta #1588).
- Se corrigió la compatibilidad del wrapper de Python de
std::vector<std::string>
(consulta #2453). - Se repitió la compatibilidad con CPLEX (consulta #2470).
Cambio rotundo conocido
- Agrega acceso al registrador en Python, Java y .NET (consulta #2245).
- Reemplaza todos los tipos personalizados de Google por los que se proporcionan en
cstdint
.
CP-SAT
- Los métodos
SearchForAllSolutions()
,SearchAllSolutions()
ySolveWithSolutionCallback()
dejaron de estar disponibles. En su lugar, usaSolve()
. - Mejora la compatibilidad de los operadores estándar de Python. Esto puede romper el código incorrecto existente.
Marzo de 2021
Anuncio del lanzamiento de las herramientas OR v8.2
Lanzamos OR-Tools v8.2. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Actualizaciones de dependencias
- Abseil-cpp 20200923.2 se actualizó a 20200923.3 LTS.
- Protobuf 3.14.0 se actualizó a 3.15.3.
Enrutamiento
- Se agregaron
RoutingModel.RegisterTransitMatrix()
yRoutingModel.RegisterUnaryTransitVector()
. - Cambia el resultado de
RoutingModel.AddVectorDimension()
yRoutingModel.AddMatrixDimension()
astd::pair<int, bool>
cuyoint
es el ID del evaluador de transporte público.
Diciembre de 2020
Anuncio del lanzamiento de las herramientas OR v8.1
Ya lanzamos OR-Tools v8.1. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Actualizaciones de dependencias
- Abseil-cpp 20200923 actualizado a 20200923.2 LTS
- Protobuf 3.13.0 se actualizó a 3.14.
- Cómo agregar compatibilidad con Gurobi 9.1.0
- Eliminar dependencia de GLog (se reemplazó por una implementación personalizada según las marcas abseil-cpp)
- Dejar la dependencia de GFlag (reemplazada por el componente de marcas abseil-cpp)
Correcciones de errores
- Se corrigió el recuento doble de la licencia flotante de Gurobi (consulta #2227).
- Corrige la compilación de Windows (consulta #2200).
Octubre de 2020
Anuncio del lanzamiento de las herramientas OR v8.0
Ya lanzamos OR-Tools v8.0. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Cambios en la plataforma
- Se agregó compatibilidad con Python 3.9 (#2187).
- Se interrumpió la compatibilidad con Python 3.5 (#2186)
<!-- Waiting Microsoft dotnet-sdk support, could be generate after the release is out...
- Se agregó compatibilidad con Ubuntu 20.10 (#2188) -->
- Se interrumpió la compatibilidad con Ubuntu 16.04 LTS (#2188).
- Se interrumpió la compatibilidad con Ubuntu 19.10 (#2188).
Actualizaciones de dependencias
- Abseil-cpp 20200225.2 se actualizó a 20200923 LTS
- Protobuf 3.12.2 se actualizó a 3.13.0.
Cambio rotundo conocido
- Ahora, el enrutamiento y el código fuente CP-SAT usan algunas funciones de
C++17
. Advertencia: Si proporcionas tu propia versión deabseil-cpp
, verifica que también esté compilada enC++17
. - Se cambió la firma
MPSolver::CreateSolver
. Se descartó el argumento de nombre del modelo.
CMake
- Se corrigió la inhabilitación de la compatibilidad con SCIP cuando se usa
-DUSE_SCIP=OFF
(consulta #2129). - Integra muestras y ejemplos al sistema de compilación de CMake. Nota: Se pueden inhabilitar con
-DBUILD_SAMPLES=OFF
y-DBUILD_EXAMPLES=OFF
. Nota: Se puede inhabilitar para un idioma específico mediante-DBUILD_<LANG>_SAMPLES=OFF
o-DBUILD_<LANG>_EXAMPLES=OFF
.- Con
<LANG>
entre: CXX
,PYTHON
,JAVA
yDOTNET
.
- Con
Marca
- Requiere
Make >= 4.3
(uso de la función de evaluación Make). - Requerir
CMake >= 3.14
(uso de la opción --verbose de CMake). - Se agregó la opción para inhabilitar la compatibilidad con SCIP con
-DUSE_SCIP=OFF
(consulta #2134). - Se agregó una opción para inhabilitar la compatibilidad con CLP y CBC mediante
-DUSE_COINOR=OFF
Java
- Las herramientas OR ahora generan paquetes de Maven (consulta #202).
Correcciones de errores
- Se corrigió la compilación de C++ y Python en FreeBSD (consulta #2126).
- Corrige la compilación de la depuración en Windows (consulta #2077).
- Se corrigió la falla permanente en paralelo en CP-SAT en Windows (consulta #2001 y #2019).
Julio de 2020
Anuncio del lanzamiento de OR-Tools v7.8
Lanzamos OR-Tools v7.8. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Actualizaciones de dependencias
- Gurobi 9.0.2 ahora está preintegrado en objetos binarios compilados previamente. Buscará la biblioteca compartida gurobi 90 en la ruta de instalación predeterminada de los instaladores de Gurobi en MAC OS X y Windows, o en el directorio GUROBI_HOME.
- SCIP 7.0.1 ahora está integrado en objetos binarios compilados previamente. Asegúrate de cumplir con la licencia de SCIP antes de usarla.
- Se agregó compatibilidad con la resolución opcional Xpress 8.9.0.
Servicio de resolución lineal
- Se agregó un método
LinearSolver::CreateSolver()
estático para simplificar la verificación de la compatibilidad de los backends de resolución lineal integrados. Funciona en todos los idiomas.
Correcciones de errores
- Se corrigió CMake con la compilación en FreeBSD.
- Se corrigió la ordenación de CP-SAT en la generación de cortes acumulativos.
- Se corrigió la fuga de memoria del solucionador de problemas lineal en el wrapper .NET.
Junio de 2020
Anuncio del lanzamiento de OR-Tools v7.7
Lanzamos OR-Tools v7.7. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Actualizaciones de dependencias
- Se actualizó Abseil-cpp b832dce a c51510d (LTS 20200225.2).
- Protobuf 3.11.4 se actualizó a 3.12.2.
Nuevas funciones y mejoras
- El solucionador de problemas CP-SAT ahora muestra
Optimal
en lugar deFeasible
en un modelo de satisfacción (es decir, sin objetivo). - Se agregó la heurística de la bomba de viabilidad de la comunidad del MIP.
Correcciones de errores
Se corrigió la falla de varios subprocesos de CP-SAT (consulta #2005).
Abril de 2020
Anuncio del lanzamiento de las herramientas OR v7.6
Lanzamos OR-Tools v7.6. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Nuevas funciones del CP-SAT
Agregamos las siguientes funciones nuevas al solucionador de problemas CP-SAT:
- Se mejoró la administración de los aviones de corte para los LP.
- Herramientas de depuración.
Actualizaciones de dependencias
Se actualizó Abseil-cpp 8ba96a8 a b832dce (LTS 20200225).
Correcciones de errores
- Se corrigió el error CP-SAT UNSAT en presolve (consulta #1908).
- Se corrigió la URL de swigwin.exe.
- Se corrigió la administración de mapas de tipos SWIG para Java y .NET.
Enero de 2020
Anuncio del lanzamiento de OR-Tools v7.5
Lanzamos OR-Tools v7.5. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Cambios en la plataforma
- Se agregó compatibilidad con Python 3.8 (#1719).
- Se dio de baja la compilación de compatibilidad de fuentes en Visual Studio 2017 (#1852).
- Se actualizó la compatibilidad de Centos 7 a Centos 8 (#1827).
Actualización de dependencia
Correcciones de errores
Se corrigieron los siguientes problemas en las herramientas OR v7.5 (para obtener una lista completa, consulta Milestone v7.5).
En particular, considera lo siguiente:
- Se corrigió la carga del ensamblaje. Consulta el #1421.
- Se expusieron los métodos
GetStartIndex()
yGetEndIndex()
de RouteIndexManager (#1843). - Se corrigió SWIG para quitar métodos dañados (#1838, #1276).
octubre de 2019
Anuncio del lanzamiento de las herramientas OR v7.4
Lanzamos OR-Tools v7.4. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Nuevas funciones y mejoras
- El solucionador de problemas CP-SAT ahora comprueba si hay restricciones que no admitan literales de aplicación. El verificador de modelos mostrará un error antes de resolverlo si esa restricción tiene un literal de aplicación.
- Búsqueda local mejorada y más rápida para la biblioteca de enrutamiento.
- El solucionador de problemas lineal ahora admite el software de terceros Xpress-MP. Deberás volver a compilar las herramientas del operador OR desde el origen para usarlas.
- La arquitectura del paquete NuGet se reescribió por completo. En particular, ahora es compatible con .NET Framework >= 4.5.2 en plataformas Windows.
Plataforma obsoleta
Como se anunció en las notas de la versión de julio de 2019, OR-Tools ya no es compatible con Python 2.7.
Actualización de dependencia
Se actualizó Protobuf 3.9.0 a 3.10.0.
Agosto de 2019
Anuncio del lanzamiento de las herramientas OR v7.3
Lanzamos OR-Tools v7.3. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Plataforma obsoleta
Python 2.7 dejará de ser compatible con la migración de Google a Python 3. Esta será la última versión de las herramientas del operador OR compatibles con Python 2.7.
Actualización de dependencia
Se actualizó Protobuf 3.8.0 a 3.9.0.
Correcciones de errores
Los siguientes problemas se corrigieron en las herramientas OR v7.3. (para obtener una lista completa, consulta Kanban v7.3).
En particular, considera lo siguiente:
- Se corrigió el error de transmisión init/int64 en Java (#1448).
- Se corrigió la verificación de salida cuando se procesan restricciones acumulativas vacías.
Julio de 2019
Anuncio del lanzamiento de las herramientas OR v7.2
Lanzamos OR-Tools v7.2. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Cambios en la plataforma
- Python 2.7 dejará de ser compatible con la migración de Google a Python 3. Como máximo, habrá una actualización más de las herramientas del operador OR compatibles con Python 2.7.
- Ubuntu 18.10 actualizado a Ubuntu 19.04.
- Se agregó compatibilidad para la compilación de fuentes en Visual Studio 2019.
- Python 3.5 ya no es compatible con Windows. Utiliza Python 3.6 o una versión posterior.
Actualizaciones de dependencias
- Ahora la orientación es CBC 2.10.3.
- Ahora nos orientamos a Protobuf 3.8.0.
CP-SAT
- Realizamos varias mejoras en la búsqueda, el paralelismo y la relajación lineal.
- Se agregaron las APIs de
LinearExpr.Sum()
yLinearExpr.ScalProd()
en Python. - Las APIs de
IntVar[].Sum()
yIntVar[].ScalProd()
dejaron de estar disponibles en C# - C++: Se quitó
SolveWithModel()
porque era un duplicado deSolveCpModel()
. - Se agregaron los métodos
CpModel.addGreaterThan()
yCpModel.addLessThan()
a la API de Java.
Resolución de problemas lineales
- Se agregó
MPSolver.SetHint()
para Python, Java y C# (compatible con SCIP y Gurobi). - Se agregó
MPSolver.SetNumThreads()
para Python, Java y C# (compatible con CBC, Guurobi y SCIP). - Se reescribió la compatibilidad con SCIP 6.0.1.
Documentación de referencia
- Agregamos manuales de referencia basados en doxygen y pdoc3 para todos los lenguajes y todas las herramientas (algoritmos, enrutamiento, grafo, linear_solver y CP-SAT). Consulta Manuales de referencia de las herramientas OR.
- La documentación de referencia está completa para C++ (todos los productos) y CP-SAT (C++, Python y Java).
- Estamos en proceso de exportar toda la documentación de C++ a Python y Java.
- Falta la documentación de .NET y no tenemos una solución en el futuro inmediato para mejorarla. Lo mantuvimos, ya que todavía muestra la API disponible.
Mayo de 2019
Anuncio del lanzamiento de las herramientas OR v7.1
Lanzamos OR-Tools v7.1. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Cambios en las dependencias requeridas
OR-Tools v7.1 tiene las siguientes dependencias nuevas y actualizadas:
- glog v0.3.5 se actualizó a v0.4.0
- protobuf v3.6.1 actualizado a v3.7.1
- Cbc 2.9.9 se actualizó a 2.10.1
- Cgl 0.59.10 actualizado a 0.60.1
- Clp 1.16.11 actualizado a 1.77.1
- Osi 0.107.9 actualizado a 0.108.1
- CoinUtils 2.10.14 se actualizó a 2.11.1
Cambios en la API de CP-SAT
En las siguientes secciones, se describen los cambios realizados en la API de CP-SAT en las herramientas OR 7.1.
- Usar Dominio para crear variables.
- Cómo usar Domain en una expresión lineal.
- Usa asistentes de expresiones lineales.
Usa un dominio para crear variables
En los siguientes ejemplos, se muestra cómo crear una variable de número entero con dominios no contiguos.
Esto reemplaza el método NewEnumeratedIntVar()
que se quitó.
Aquí, la variable x puede ser cualquiera de 1, 3, 4 o 6:
Python
model.NewIntVarFromDomain(cp_model.Domain.FromValues([1, 3, 4, 6]), 'x')
C++
model.NewIntVar(Domain::FromValues({1, 3, 4, 6}));
Java
model.newIntVarFromDomain(Domain.fromValues(new long[] {1, 3, 4, 6}), "x");
C#
model.NewIntVarFromDomain(Domain.FromValues(new long[] {1, 3, 4, 6}), "x");
Las variables también se pueden crear usando una lista de intervalos. Debajo, la variable x está restringida a 1, 2, 4, 5 o 6:
Python
model.NewIntVarFromDomain(cp_model.Domain.FromIntervals([[1, 2], [4, 6]]), 'x')
C++
model.NewIntVar(Domain::FromIntervals({ {1, 2}, {4, 6} }));
Java
model.newIntVarFromDomain(Domain.fromIntervals(new long[][] { {1, 2}, {4, 6} }), "x");
C#
model.NewIntVarFromDomain(Domain.FromIntervals(new long[][] { new long[] {1, 2}, new long[] {4, 6} }), "x");
Cómo usar Domain en una expresión lineal
En los siguientes ejemplos, se muestra cómo limitar una expresión lineal en un dominio no contiguo. Aquí, la expresión lineal linear_expr se define en 5, 6, 8, 9 y 10:
Python
model.AddLinearExpressionInDomain(linear_expr, cp_model.Domain.FromIntervals([(5, 6), (8, 10)]))
C++
model.AddLinearConstraint(linear_expr, Domain::FromIntervals({ {5, 6}, {8, 10} }))
Java
model.addLinearExpressionInDomain(linear_expr, Domain.fromIntervals(new long[][] { {5, 6}, {8, 10} }))
.Net
model.AddLinearExpressionInDomain(linear_expr, Domain.FromIntervals(new long[][] {new long[] {5, 6}, new long[] {8, 10} }));
Cómo usar asistentes de expresiones lineales
En los siguientes ejemplos, se muestra cómo usar métodos auxiliares para crear sumas y productos escalares.
Aquí, se muestra un ejemplo en el que queremos x + y == 20
y 4 * x + 2 * y = 56
:\
Python
model.Add(x + y == 20) model.Add(4 * x + 2 * y == 56)
C++
cp_model.AddEquality(LinearExpr::Sum({x, y}), 20); cp_model.AddEquality(LinearExpr::ScalProd({x, y}, {4, 2}), 56);
Java
model.addEquality(LinearExpr.sum(new IntVar[] {x, y}), 20); model.addEquality(LinearExpr.scalProd(new IntVar[] {x, y}, new long[] {4, 2}), 56);
.Net
model.Add(x + y == 20); model.Add(4 * x + 2 * y == 56);
Marzo de 2019
Anuncio del lanzamiento de las herramientas OR v7.0
Lanzamos OR-Tools v7.0. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Cambios en las plataformas compatibles
OR-Tools v7.0 ya no es compatible con las siguientes plataformas:
- Visual C++ 2015
- Ubuntu 14.04
- Python 3.4 en Linux
Si utilizas una de estas plataformas, aún puedes instalar OR-Tools v6.10.
Cambios en las dependencias requeridas
OR-Tools v7.0 tiene las siguientes dependencias nuevas y actualizadas:
- Nuevo: Abseil-cpp
- gflags 2.2.1 se actualizó a 2.2.2
En las siguientes secciones, se describen las nuevas funciones y mejoras en las herramientas OR 7.0.
- Nuevo administrador de índices para programas de enrutamiento
- Compatibilidad con VRP con retiros y entregas
- Compatibilidad con funciones lambda en Java y C#
Nuevo administrador de índices para programas de enrutamiento
En las herramientas de OR versión 7.0, los programas de planificación de ruta de vehículos deben usar el nuevo RoutingIndexManager
.
Esto garantiza que los índices estándar de las ubicaciones sean coherentes con los índices internos que usa el solucionador y ayuda a evitar errores en tu código.
El nuevo RoutingIndexManager
requiere algunos cambios menores para enrutar los programas, que se describen en las siguientes secciones:
- Incluye o importa
RoutingIndexManager
en C++ y Java. - Declara
RoutingIndexManager
- Agrega el
RoutingIndexManager
a las devoluciones de llamada de dimensiones. - Usa
RoutingIndexManager
para imprimir soluciones.
Incluir/importar RoutingIndexManager
En OR-Tools 7.0, los programas de enrutamiento en C++ y Java deben incluir o importar RoutingIndexManager
como se muestra en los siguientes ejemplos:
C++
#include "ortools/constraint_solver/routing_index_manager.h"
Java
import com.google.ortools.constraintsolver.RoutingIndexManager;
Las importaciones de Python y C# no se modifican.
Declara RoutingIndexManager
En las Herramientas del operador v7.0, los programas de enrutamiento deben declarar el RoutingIndexManager
y crear el modelo de enrutamiento, como se muestra en los siguientes ejemplos:
Python
manager = pywrapcp.RoutingIndexManager(num_locations, num_vehicles, depot) routing = pywrapcp.RoutingModel(manager)
C++
RoutingIndexManager manager(num_locations, num_vehicles, depot); RoutingModel routing(manager);
Java
RoutingIndexManager manager = new RoutingIndexManager(numLocations, numVehicles, depot); RoutingModel routing = new RoutingModel(manager);
.Net
RoutingIndexManager manager = new RoutingIndexManager(numLocations, numVehicles, depot); RoutingModel routing = new RoutingModel(manager);
Los argumentos de RoutingIndexManager
son los siguientes:
- La cantidad de ubicaciones
- La cantidad de vehículos
- El índice del depósito (ubicación de partida y de finalización para todos los vehículos)
Devoluciones de llamada
En la versión 7.0 de las herramientas del OR, debes usar RoutingIndexManager
para crear devoluciones de llamada, como la devolución de llamada de distancia, que luego pasas al solucionador.
En los siguientes ejemplos, se muestra cómo crear una devolución de llamada de distancia.
Python
def distance_callback(from_index, to_index): """Returns the distance between the two nodes.""" # Convert from routing variable Index to distance matrix NodeIndex. from_node = manager.IndexToNode(from_index) to_node = manager.IndexToNode(to_index) return data["distance_matrix"][from_node][to_node] transit_callback_index = routing.RegisterTransitCallback(distance_callback) routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index)
C++
const int transit_callback_index = routing.RegisterTransitCallback( [&data, &manager](const int64_t from_index, const int64_t to_index) -> int64_t { // Convert from routing variable Index to distance matrix NodeIndex. const int from_node = manager.IndexToNode(from_index).value(); const int to_node = manager.IndexToNode(to_index).value(); return data.distance_matrix[from_node][to_node]; }); routing.SetArcCostEvaluatorOfAllVehicles(transit_callback_index);
Java
final int transitCallbackIndex = routing.registerTransitCallback((long fromIndex, long toIndex) -> { // Convert from routing variable Index to user NodeIndex. int fromNode = manager.indexToNode(fromIndex); int toNode = manager.indexToNode(toIndex); return data.distanceMatrix[fromNode][toNode]; }); routing.setArcCostEvaluatorOfAllVehicles(transitCallbackIndex);
.Net
int transitCallbackIndex = routing.RegisterTransitCallback((long fromIndex, long toIndex) => { // Convert from routing variable Index to // distance matrix NodeIndex. var fromNode = manager.IndexToNode(fromIndex); var toNode = manager.IndexToNode(toIndex); return data.DistanceMatrix[fromNode, toNode]; }); routing.SetArcCostEvaluatorOfAllVehicles(transitCallbackIndex);
El método IndexToNode
convierte los índices de ubicación interna que usa el controlador en los índices estándar de la matriz de distancia.
En lugar de pasar la devolución de llamada directamente al solucionador, como en las versiones anteriores, en la versión 7.0, primero debes crear transit callback index
, una referencia a la devolución de llamada, y pasarla al solucionador (en este caso, SetArcCostEvaluatorOfAllVehicles
).
Dimensiones
En los siguientes ejemplos, se muestra cómo crear una dimensión para las demandas y las capacidades, que se usa con el objetivo de resolver el problema relacionado con las rutas habilitadas para los vehículos.
Python
def demand_callback(from_index): """Returns the demand of the node.""" # Convert from routing variable Index to demands NodeIndex. from_node = manager.IndexToNode(from_index) return data["demands"][from_node] demand_callback_index = routing.RegisterUnaryTransitCallback(demand_callback) routing.AddDimensionWithVehicleCapacity( demand_callback_index, 0, # null capacity slack data["vehicle_capacities"], # vehicle maximum capacities True, # start cumul to zero "Capacity", )
C++
const int demand_callback_index = routing.RegisterUnaryTransitCallback( [&data, &manager](const int64_t from_index) -> int64_t { // Convert from routing variable Index to demand NodeIndex. const int from_node = manager.IndexToNode(from_index).value(); return data.demands[from_node]; }); routing.AddDimensionWithVehicleCapacity( demand_callback_index, // transit callback index int64_t{0}, // null capacity slack data.vehicle_capacities, // vehicle maximum capacities true, // start cumul to zero "Capacity");
Java
final int demandCallbackIndex = routing.registerUnaryTransitCallback((long fromIndex) -> { // Convert from routing variable Index to user NodeIndex. int fromNode = manager.indexToNode(fromIndex); return data.demands[fromNode]; }); routing.addDimensionWithVehicleCapacity(demandCallbackIndex, 0, // null capacity slack data.vehicleCapacities, // vehicle maximum capacities true, // start cumul to zero "Capacity");
.Net
int demandCallbackIndex = routing.RegisterUnaryTransitCallback((long fromIndex) => { // Convert from routing variable Index to // demand NodeIndex. var fromNode = manager.IndexToNode(fromIndex); return data.Demands[fromNode]; }); routing.AddDimensionWithVehicleCapacity(demandCallbackIndex, 0, // null capacity slack data.VehicleCapacities, // vehicle maximum capacities true, // start cumul to zero "Capacity");
Soluciones de impresión
En la versión 7.0 de las herramientas del OR, debes usar RoutingIndexManager
para mostrar las rutas de los vehículos en una solución. En los siguientes ejemplos, se muestra cómo imprimir soluciones en todos los lenguajes compatibles.
Python
def print_solution(manager, routing, solution): """Prints solution on console.""" print(f"Objective: {solution.ObjectiveValue()}") index = routing.Start(0) plan_output = "Route for vehicle 0:\n" route_distance = 0 while not routing.IsEnd(index): plan_output += f" {manager.IndexToNode(index)} ->" previous_index = index index = solution.Value(routing.NextVar(index)) route_distance += routing.GetArcCostForVehicle(previous_index, index, 0) plan_output += f" {manager.IndexToNode(index)}\n" plan_output += f"Distance of the route: {route_distance}m\n" print(plan_output)
C++
//! @brief Print the solution //! @param[in] manager Index manager used. //! @param[in] routing Routing solver used. //! @param[in] solution Solution found by the solver. void PrintSolution(const RoutingIndexManager& manager, const RoutingModel& routing, const Assignment& solution) { LOG(INFO) << "Objective: " << solution.ObjectiveValue(); // Inspect solution. int64_t index = routing.Start(0); LOG(INFO) << "Route for Vehicle 0:"; int64_t distance{0}; std::stringstream route; while (!routing.IsEnd(index)) { route << manager.IndexToNode(index).value() << " -> "; const int64_t previous_index = index; index = solution.Value(routing.NextVar(index)); distance += routing.GetArcCostForVehicle(previous_index, index, int64_t{0}); } LOG(INFO) << route.str() << manager.IndexToNode(index).value(); LOG(INFO) << "Distance of the route: " << distance << "m"; LOG(INFO) << ""; LOG(INFO) << "Advanced usage:"; LOG(INFO) << "Problem solved in " << routing.solver()->wall_time() << "ms"; }
Java
/// @brief Print the solution. static void printSolution( DataModel data, RoutingModel routing, RoutingIndexManager manager, Assignment solution) { // Solution cost. logger.info("Objective : " + solution.objectiveValue()); // Inspect solution. logger.info("Route for Vehicle 0:"); long routeDistance = 0; String route = ""; long index = routing.start(0); while (!routing.isEnd(index)) { route += manager.indexToNode(index) + " -> "; long previousIndex = index; index = solution.value(routing.nextVar(index)); routeDistance += routing.getArcCostForVehicle(previousIndex, index, 0); } route += manager.indexToNode(routing.end(0)); logger.info(route); logger.info("Distance of the route: " + routeDistance + "m"); }
.Net
/// <summary> /// Print the solution. /// </summary> static void PrintSolution(in RoutingModel routing, in RoutingIndexManager manager, in Assignment solution) { Console.WriteLine("Objective: {0}", solution.ObjectiveValue()); // Inspect solution. Console.WriteLine("Route for Vehicle 0:"); long routeDistance = 0; var index = routing.Start(0); while (routing.IsEnd(index) == false) { Console.Write("{0} -> ", manager.IndexToNode((int)index)); var previousIndex = index; index = solution.Value(routing.NextVar(index)); routeDistance += routing.GetArcCostForVehicle(previousIndex, index, 0); } Console.WriteLine("{0}", manager.IndexToNode((int)index)); Console.WriteLine("Distance of the route: {0}m", routeDistance); }
Compatibilidad con VRP con retiros y entregas
OR-Tools v7.0 proporciona asistencia para resolver problemas de rutas de vehículos (VRP) con retiros y entregas, en los que el objetivo es encontrar las rutas más cortas para una flota de vehículos que recoge y entrega artículos en varias ubicaciones. Configuraste el problema de manera similar a un VRP estándar, pero, además, especificas un par (i, j)
de ubicaciones para cada elemento, donde i es el punto de partida y j es el lugar de llegada. La herramienta muestra rutas de vehículos de modo que, para cada par (i, j)
, i
y j
están en la misma ruta, y el vehículo visita i
antes de j
.
Para ver un ejemplo que resuelva este tipo de problema, consulta Rutas de vehículos con retiros y entregas.
Compatibilidad con funciones lambda
OR-Tools v7.0 ahora incluye compatibilidad para funciones lambda en C# y Java (además de C++ y Python, que ya eran compatibles). Las funciones lambda proporcionan una manera conveniente de definir devoluciones de llamada en programas de enrutamiento. Sin embargo, puedes definir devoluciones de llamada con funciones estándar si crees que esto hace que el código sea más legible.
En los ejemplos de devolución de llamada de C# y Java anteriores, se muestra cómo definir devoluciones de llamada con funciones lambda.
noviembre de 2018
Anuncio del lanzamiento de la versión v6.10
Hemos lanzado OR-Tools versión 6.10. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
En las siguientes secciones, se describen las nuevas funciones y mejoras de la versión 6.10.
Comandos simplificados para compilar y ejecutar programas
En la versión 6.10, puedes compilar y ejecutar programas ingresando comandos como los siguientes:
make run SOURCE=relative/path/to/program.cc, en el que
<var>relative/path/to</var>
es la ruta de acceso al directorio que contiene el programa.
Para compilar un programa sin ejecutarlo, ingresa lo siguiente:
make build SOURCE=relative/path/to/program.ccConsulta Cómo comenzar a usar las herramientas del operador OR para obtener instrucciones específicas sobre cómo ejecutar programas por lenguaje.
Compatibilidad con SCIP 6.0.0
Las herramientas OR ahora son compatibles con SCIP 6.0.0.
Objetos binarios
Las distribuciones binarias se compilaron con Java JDK 8 (JDK 7 para Ubuntu 14.04).
Resolución de CP-SAT
Actualiza la API
- Se agregó la API de CpModelBuilder CP-SAT de C++.
Ejemplos
Se movieron algunos ejemplos.
- Traslada los ejemplos de la comunidad a
examples/contrib
. - Mueve algunos ejemplos a
ortools/<var>component</var>/samples
(p. ej.,ortools/linear_solver/samples/simple_program.java
).
Septiembre de 2018
Anuncio del lanzamiento de la versión v6.9
Lanzamiento de OR-Tools en la versión 6.9. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
Se actualizaron las dependencias
- Protobuf 3.5.1 -> 3.6.1
- SCIP 4.0 -> 6.0.
Resolución de CP-SAT
- Cambios rotundos en la API: Obtén todos los detalles aquí:
- Cambia el nombre de
SolveWithSolutionObserver
aSolveWithSolutionCallback
en Python. Se cambió el nombre de
NewSolution
aOnSolutionCallback
en la claseCpSolverSolutionCallback
en Python. En el siguiente ejemplo, se muestra la nueva manera de crear una devolución de llamada de solución en Python.class MySolutionCallback(cp_model.CpSolverSolutionCallback): def init(self): cpmodel.CpSolverSolutionCallback.init(self) self._solution_count = 0
def OnSolutionCallback(self): print('Solution {}, time = {}s, objective = {}, makespan = {}'.format( self.solution_count, self.WallTime(), self.ObjectiveValue(), self.Value(makespan))) self.solution_count += 1
Se expuso
StopSearch
en la devolución de llamada de solución en Python, Java y C#. Consulta la documentación aquí.Expón
ModelStats
yCpSolverResponseStats
en Python, Java y C#.Mejora la documentación de docstring de Python. Consulta la documentación aquí.
Se actualizaron la implementación de Java de la interfaz de resolución y la guía de soluciones.
Implementa el módulo.
Cambia la implementación del reservorio: agrega una API con un valor booleano para especificar eventos opcionales de vaciado o relleno.
Servicio de resolución lineal
- Se expuso
InterruptSolve
en Java y C#.
Soluciones de CP
- Expón el director
SolutionCollector
en C#.
Python
- Se agregó compatibilidad con
Python 3.7
. - Si compilas desde la fuente, prioriza
python3
en lugar depython2
cuando detectes Python.
.NET
- Reescritura completa de la capa de .NET.
- Proporcionar un paquete
Google.OrTools
de NetStandard 2.0 Nuget compatible con el IDentificador de entorno de ejecuciónwin-x64
,linux-x64
yosx-x64
. - Proporciona un paquete de Nuget de
Google.OrTools.FSharp
. - Agrega un archivo de proyecto para todos los ejemplos de .NET.
- Actualiza todos los ejemplos de secuencias de comandos de F# (.fsx) a un proyecto de F# normal (.fs).
- Agrega documentación sobre la generación de compilación de paquetes .NET aquí.
Piso de zinc
- Se agregó compatibilidad para conjuntos en Flatzinc (con nosets.mzn).
Contribuciones
- Se agregó compatibilidad con Binder. Gracias a Kevin Mader.
- Haz que
DecisionVisitor
sea un tipo de director en las vinculaciones de Java. Agradecimientos a Jeremy Apthorp.
Julio de 2018
Anuncio del lanzamiento de la versión v6.8
Hemos lanzado OR-Tools en la versión 6.8. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
Anuncio del solucionador de problemas CP-SAT
El solucionador de problemas CP-SAT es un nuevo solucionador para la programación de restricciones. El solucionador de problemas de CP-SAT es más rápido que el de CP original y es la opción recomendada para estos problemas.
Para ver ejemplos que usen el solucionador de problemas CP-SAT, busca archivos que tengan _sat
en el nombre en el directorio examples en GitHub.
El solucionador de problemas de CP original se mantendrá durante un tiempo para admitir el código existente, pero está obsoleto.
Nuevas opciones para el solucionador de problemas CP-SAT
Las siguientes opciones para el solucionador de problemas de CP-SAT son nuevas en esta versión:
- Búsqueda de vecindarios local (LNS): Usa la opción
SatParameters.use_lns
para habilitar LNS. - Búsqueda paralela: Usa la opción
SatParameters.num_search_workers
para habilitar varios subprocesos durante una búsqueda. Cada subproceso puede tener diferentes parámetros y diferentes valores iniciales aleatorios. Esto maximiza la diversidad y la probabilidad de que al menos un subproceso encuentre soluciones.
Mejoras en el rendimiento de las soluciones de problemas
Se realizaron mejoras de rendimiento en las soluciones de CP-SAT y Glop.
Marzo de 2018
Anuncio del lanzamiento de la versión v6.7
Hemos lanzado OR-Tools en la versión 6.7. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas OR.
Actualiza a las dependencias requeridas
- Protobuf 3.5.0 -> 3.5.1.
Varios
- Refactoriza la base para preparar la integración de abseil-cpp.
- Uso de los servicios de integración continua (CI) de Travis CI y Appveyor.
SÁB
- Mejora del rendimiento.
- Mejora la API de Python.
- Agrega la API de C#, también conocida como CpSolver.cs (EXPERIMENTAL).
Glop
- Refactorización del código
- Mejora del rendimiento.
Compatibilidad con CMake (EXPERIMENTAL)
- Se agregó compatibilidad con CMake de C++ OR-Tools.
- Poder compilar las herramientas OR como un proyecto de CMake independiente
- Poder incorporar las herramientas OR en un proyecto de CMake existente
- Agrega la compilación basada en CMake con Python OR-Tools.
- Genera el paquete de Python (wheel) con CMake.
Contribuciones
- Se corrigió la redefinición de winsock2.h en ventanas. Gracias a Florent Tollin de Rivarol.
- Agrega asistencia para F# (EXPERIMENTAL). Gracias a Matthew Moore. Nota: Solo está disponible con el compilador de archivos makefile.
- Agrega la Asistencia estándar de .NET (EXPERIMENTAL). Gracias a Ziad El Malki. Nota: Solo está disponible con el compilador de archivos makefile.
Noviembre de 2017
Anuncio del lanzamiento de la versión v6.6
Hemos lanzado OR-Tools versión 6.6. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
Actualizaciones de las dependencias requeridas
- Protobuf a 3.3.0 -> 3.5.0.
- gflags a 2.2.0 -> 2.2.1.
- CBC 2.9.8 a 2.9.9.
- Agrega el módulo seis de Python (1.10) como dependencia necesaria para Python.
Correcciones de errores
- Refactorización del nombre de la solicitud de extracción #494. Se agregaron comentarios para IntelliSense en algunos editores. Gracias a Matthew Moore.
- Instrucción de solicitud de extracción #516 para el objeto binario independiente de F#. Gracias a Matthew Moore.
- Mejora la precisión en Glop.
Resolutor de SAT
- Mejorar el solucionador de problemas de SAT interno, corregir varios errores
- Se agregó una restricción de VRP al solucionador de SAT, vinculado al solucionador de LP.
- Cambia el observador de la solución en el solucionador de SAT para tomar un
CpSolverResponse
como parámetro. - Se mejoró el uso de Glop en el servicio de resolución de SAT.
- Acelera la conexión SAT-LP.
- Se agregó una restricción de reserva al formato de protobuf de cp_model de SAT.
SAT/Python
- Introducción a la API de SAT en Python.
- Código en
ortools/sat/python/cp_model.py
- Agrega ejemplos en examples/python/:
- assignment_sat.py
- assignment_with_constraints_sat.py
- code_samples_sat.py
- cp_is_fun_sat.py
- gate_scheduling_sat.py
- hidato_sat.py
- jobshop_ft06_sat.py
- nqueens_sat.py
- nurses_sat.py
- rcpsp_sat.py
- steel_mill_slab_sat.py
- worker_schedule_sat.py
- Agrega compatibilidad con el notebook de IPython.
- Los ejemplos de Python se exportan a notebooks y están disponibles en examples/notebook.
Ejemplos
- Vuelve a escribir rcpsp_parser a fin de usar el formato ProtoBuf para almacenar el problema.
- Se mejoró el analizador de RCPSP.
octubre de 2017
Anuncio de la versión v6.5
Hemos lanzado OR-Tools en la versión 6.5. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
Cambio en las plataformas
- El módulo pypi py3-ortools se combinó con el módulo ortools. Ahora solo hay un módulo: "ortools".
- Ahora, el formato principal para estos módulos de Python son los archivos wheel.
Si quieres instalar las herramientas OR para Python desde pypi, solo ejecuta
pip install ortools
. Necesitas tener instalada una versión reciente de pip (>= 9.0.1). Esto debería extraer la versión más reciente (v6.5).
Error corregido
El archivo jar de protobuf ahora se compila correctamente con clases compiladas.
Ejemplos nuevos
- Se agregaron más ejemplos de F# al directorioexamples/fsharp (gracias de nuevo a Matthew Moore).
- También se aportaron ejemplos de MIP de Java (Gracias, Darian).
septiembre de 2017
Anuncio del lanzamiento de la versión v6.4
Hemos lanzado OR-Tools versión 6.4. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
Cambio en las plataformas
- Los módulos Pypi en plataformas Linux ahora se entregan como archivos de rueda con la etiqueta mucholinux1. Gracias a Federico Ficarelli. Con este cambio, retrocedimos el seguimiento de los módulos por Linux que se introdujeron en la versión de julio de 2017.
Funciones nuevas
- Se mejoró el método de escalamiento usado dentro de GLOP.
- Se corrigió la unión de evaluadores en la biblioteca de enrutamiento de C#. Gracias a DevNamedZed.
- Mejora el rendimiento de la resolución Flatzinc para modelos grandes.
- Utiliza el SAT respaldado para el zinc de forma predeterminada.
- Mejora el rendimiento del enfoque basado en Core para el solucionador satisfactorio.
- Se corrigió el error en el algoritmo de asignación lineal que fallaba incorrectamente.
- Se agregaron ejemplos de F# en ortools/examples/fsharp.
- Quita la verificación de penalizaciones positivas en la biblioteca de enrutamiento.
Agosto de 2017
Anuncio del lanzamiento de la versión v6.3
Hemos lanzado OR-Tools versión 6.3. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
Nuevos archivos de descarga
Los archivos de la rueda de Python para Linux ahora están disponibles para descargar en la página de versiones de herramientas OR, junto con las versiones más recientes de todas las descargas.
Resolución de minizinc
Esta versión contiene el código final sat y Flatzinc que se envió para el desafío de Minizinc 2017.
Julio de 2017
Anuncio de la versión v6.2
Hemos lanzado OR-Tools versión 6.2. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
Cambio en las plataformas
- Ahora admitimos varias distribuciones binarias de Linux (Ubuntu 14.04, 16.04, 17.04, CentOS 7 y Debian 9).
- Los módulos Pypi en plataformas Linux ahora incluyen una etiqueta que describe la distribución (ubuntu-14.04, ubuntu-16.04, ubuntu-17.04, centos-7, debian-9).
Funciones nuevas
Se agregó compatibilidad con Docker para compilar artefactos de Linux. Ve a or-tools/tools/docker
y observa el Makefile
para ver los destinos posibles (make archive
, make pypi
y make pypi3
).
Estos comandos crearán un subdirectorio export
y le agregarán artefactos binarios.
Junio de 2017
Anuncio del lanzamiento de la versión v6.1
Hemos lanzado OR-Tools versión 6.1. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
Cambio en las plataformas
- Se admite Visual Studio 2017, pero ya no se admite Visual Studio 2013.
- Se admiten las versiones 10.9 y posteriores de macOS.
Nuevas funciones
Agregamos un nuevo formato protobuf para nuestro solucionador de problemas CP-SAT.
Consulta ortools/sat/cp_model.proto
para definir tu modelo y ortools/sat/cp_model_solver.h
para resolver tu problema.
Correcciones de errores
Problema #420: Se corrigió el atributo __version__
que faltaba en los módulos pypi
de Python en todas las plataformas.
Mayo de 2017
Anuncio de la versión v6.0
Hemos lanzado OR-Tools versión 6.0. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
Nueva estructura de directorios en C++
Cambiamos la estructura de origen/inclusión de las herramientas OR cuando se usa C++. El objetivo es proporcionar una mejor encapsulación de los archivos de inclusión de C++. También tiene el beneficio de alinear las estructuras de directorios de C++ y Python.
- Se cambió el nombre de
src/
aortools/
. - Todos los comandos #include en archivos C++ ahora tienen el prefijo
ortools
agregado.#include "constraint/constraint_solver.h"
ahora es#include "ortools/constraint/constraint_solver.h"
.
Funciones nuevas
- Compatibilidad con Bazel
Ahora puedes compilar herramientas del operador OR con bazel, la herramienta de compilación de Google. Funciona en Linux y Mac OS X. Después de descargar Bazel versión 0.4.5 o
una versión posterior, cambia el directorio a or-tools y compila los ejemplos:
bazel build examples/cpp/...
.
Enrutamiento
Implementamos asistencia para los descansos (p.ej., tiempo de inactividad en los vehículos debido a que los conductores almorzan) en la biblioteca de rutas. Esta función se muestra en el ejemplo de cvrptw_with_breaks.cc
.
Compatibilidad con SCIP
El wrapper del solucionador de problemas lineal ahora admite SCIP 4.0. Primero debes compilar SCIP y, luego, indicarle a las herramientas o herramientas que lo usarás. Las instrucciones están disponibles aquí.
Asistencia de GLPK
También cambiamos el camino para compilar con GLPK. Obtén más información aquí.
Limpieza
- Se quitó todo el uso de hash_map y hash_set de la base de código de C++, ya que dejaron de estar disponibles. Se reemplazaron por unordered_map y unordered_set de la STL.
- Limpieza de los archivos makefile en C#, cortesía de Michael Powell.
Enero de 2017
Anuncio de la versión v5.1
Hemos lanzado OR-Tools en la versión 5.1. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
Nuevas funciones
Instalación
- Se introdujeron procedimientos más sencillos para instalar las herramientas del operador OR, ya sea desde distribuciones binarias o desde código fuente. Consulta Cómo instalar las herramientas del operador OR desde objetos binarios o Cómo instalar las herramientas del operador OR desde la fuente para obtener más información.
Enrutamiento
Se implementó un algoritmo para calcular el límite inferior de Held-Karp para los problemas simétricos de vendedores que viajan. Esto te permite calcular un límite superior para la brecha entre el costo de una solución que posiblemente no sea óptima y el costo de la solución óptima.
- Se agregó un nuevo método a la biblioteca de rutas de vehículos,
RoutingModel::SetBreakIntervalsOfVehicle
, que te permite agregar intervalos de break, es decir, períodos en los que un vehículo no puede realizar ninguna tarea (como viajar o visitar un nodo). Para ver un ejemplo que use esta opción, consulta cvrptw_with_breaks.cc.
Programación
- Se agregó compatibilidad con más formatos de datos en el analizador de la Biblioteca de programación de proyectos.
Resolución de sábados
- La restricción acumulativa del solucionador de SAT ahora acepta intervalos opcionales, creados con el método
NewOptionalInterval
. Para ver un ejemplo, consulta https://github.com/google/or-tools/blob/master/examples/cpp/rcpsp_sat.cc. - Ahora puedes resolver un problema Max-SAT (maximum satisfiability_) especificando el objetivo como una suma ponderada de literales. Ya no es necesario crear una variable de número entero intermedio.
Mejoras en el rendimiento
- Resolución de SAT: Se mejoró el rendimiento del agente de resolución de SAT, en particular para la restricción acumulativa.
- Resolución de problemas de Glop: Se mejoró la solidez numérica del agente de resolución de Glop, que ahora muestra soluciones aún más precisas para problemas numéricos difíciles.
- Resolución de problemas de Flatzinc
- Se mejoró considerablemente el rendimiento del backend Sat para el intérprete de Flatzinc.
- Se simplificó la interfaz plana de C#. Para ver un ejemplo de la interfaz nueva, consulta https://github.com/google/or-tools/blob/master/examples/csharp/csfz.cs.
Correcciones de errores
- El uso de la heurística de
PathCheapestArc
en el enrutamiento de modelos con un solo vehículo y restricciones laterales provocaba que el solucionador se ejecutara durante mucho tiempo. Para solucionarlo, se tomaron en cuenta las restricciones complementarias. - En Java, el solucionador de problemas de enrutamiento a veces fallaba cuando se resolvían los problemas de enrutamiento de vehículos. Este problema se corrigió en la versión más reciente.
Noviembre de 2016
Anuncio de la versión v5.0
Hemos lanzado OR-Tools versión 5.0. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
Ejemplos de ejecución
- Se introdujeron objetivos específicos del lenguaje que facilitan la compilación y ejecución de tus programas, así como los ejemplos que vienen con las herramientas OR.
Sáb
- Se agregó compatibilidad con la programación de restricciones.
- Se implementaron las restricciones diffn, acumulativas , circuitos y subcircuitos.
- Se implementó el verificador de sobrecarga sobre la base del algoritmo de filtro de energía máximo para la restricción acumulativa discreta.
- Se implementó el propagador coherente de todos los límites diferentes, que implementa una mejor propagación para la restricción AllDifferent.
FlatZinc
- Se implementó un resolutor de SAT para problemas de FlatZinc.
Resolución de restricciones
- Se implementaron las siguientes restricciones :
- atMost: Establece un límite superior para el recuento de variables iguales a un valor determinado.
- MakePathPrecedenceConstraint y MakePathTransitPrecedenceConstraint: implementa la restricción de prioridad para un conjunto de pares.
Enrutamiento
- Se implementó AddAtSolutionCallback, que es una devolución de llamada a la que se llama cada vez que se encuentra una solución durante la búsqueda.
- Se quitaron los constructores sin depósito de RoutingModel. Ahora es obligatorio especificar al menos un depósito en el modelo de enrutamiento.
(septiembre de 2016)
Anuncio de la versión v4.4
Hemos lanzado OR-Tools versión 4.4. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
Sáb
- API de programación extendida y ejemplos modificados (Weight_tardiness_sat y jobshop_sat) para usarla.
Gráfico
- Se agregaron características del iterador a las clases de grafos.
Distribución de las herramientas del operador OR
- Se volvió a admitir el paquete Nuget.
agosto de 2016
Anuncio del lanzamiento de la versión v4.3
Hemos lanzado OR-Tools versión 4.3. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
Resolución de restricciones
- Se implementó el método
NotBetween
para restringir una variable a un intervalo determinado.
enrutamiento
- Se agregó un análisis del modelo para verificar las restricciones
NotMember
existentes como se muestra en este ejemplo y usarlas en filtros de búsqueda locales. - Se agregó la generación de perfiles de búsqueda local.
- Solución de traslados locales
Resolución de problemas lineales
- Se corrigieron los informes de estado de SCIP.
Sáb
- Se implementó el método SolveWithPresolve para simplificar el uso del agente de resolución SAT.
- Se reagruparon las utilidades de búsqueda en src/sat/util.h|cc.
- Se implementaron restricciones de programación SMT (generación de cláusulas diferidas): consulta jobshop_sat.cc y weighted_tardiness_sat.cc.
Glop
- Se mejoró el rendimiento mediante el aprovechamiento de la dispersión en más etapas de procesamiento.
Piso de zinc
- Se corrigieron errores detectados por el desafío de minizinc.
Lp_data
- Se simplificó de forma continua las plantillas en los iteradores.
Distribución de las herramientas del operador OR
- Los ensamblados de C# ahora tienen nombres fuertes de forma predeterminada.
- Se actualizó a Protobuf3.0.0.
- Se agregó una secuencia de comandos de Python para verificar las dependencias de archivo de las herramientas del OR.
julio de 2016
Anuncio de la versión v4.2
Hemos lanzado OR-Tools versión 4.2. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
Resolución de restricciones (enrutamiento)
- Una disyunción ahora se puede definir con una cardinalidad, que es la cantidad máxima de nodos que pueden estar activos dentro de esta disyunción. Por ejemplo, si agregas una disyunción con n nodos y una cardinalidad de k, entonces se permite que k nodos entre los n nodos estén activos. Para ello, puedes usar la definición nueva de AddDisjunction.
- Se agregó compatibilidad con varias disyunciones por nodo. Por ejemplo, ahora puedes agregar un nodo, N1, a muchas disyunciones (D1..Dm). Esto aumenta la probabilidad de estar activo dentro de cualquiera de ellos. Se introdujo un algoritmo de búsqueda de enrutamiento más rápido para problemas relacionados con las ventanas de tiempo disyuntivo.
- Se agregaron parámetros del solucionador de problemas de restricciones a los parámetros del modelo de enrutamiento y log_search a los parámetros de búsqueda de enrutamiento.
- El algoritmo de búsqueda local es más rápido a la hora de resolver problemas con períodos inconexos. Consulta el ejemplo cvrp_disjoint_tw.cc para obtener más detalles.
Glop (optimización lineal)
- Se introdujo un algoritmo simplex más rápido.
Distribución de las herramientas del operador OR
- Un archivo por plataforma, en lugar de archivos individuales para cada uno de C++, Java y .NET. Los archivos de Python aún se alojan en pypi.
- En pypi, cambiamos a los módulos wheel (.whl) en Mac OS X y Windows. Se introdujo un esquema de numeración MAJOR.MINOR. Estos números se usan para los nombres de archivo, la versión almacenada en las bibliotecas compartidas de Mac OS X, los módulos de Python y los ensamblados de .NET. La primera versión que lanzaremos es la 4.2, con este esquema.
junio de 2016
Anuncio del lanzamiento de la versión v2016-06
Lanzamos la versión v2016-06 de OR-Tools. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
Resolución de restricciones
- Se quitó la mayoría de las instancias de las devoluciones de llamada (src/base/callback.h) de la biblioteca de CP.
- Se agregó NotMemberCt (la variable no puede pertenecer a un conjunto de intervalos).
Biblioteca de enrutamiento
- CAMBIO INCOMPATIBLE: Para especificar la capacidad de los vehículos en
AddDimensionWithVehicleCapacity
, ahora debes pasar un array (un vector en c++) en lugar de una devolución de llamada.
GLOP
- Cambia la representación interna de una matriz dispersa.
- Se implementaron mejoras en el rendimiento.
Gráfico
- Se reescribieron los algoritmos Dijkstra y Bellman-Ford para reemplazar las devoluciones de llamada por
std::function
(C++). - Se cambió la API de diferentes implementaciones de grafos cuando se itera en arcos y nodos.
Sáb
- Quita el método principal sin usar (nodos de resolución).
- Se agregó un autor dramatizador para verificar pruebas de insatisfacción.
- Agrega el preprocesador.
Bebop
- Agrega barrios nuevos.
Ejemplos
- c++: Cómo deshacerse de filelinereader en ejemplos
- datos: Agrega problemas de programación de una sola máquina.
Documentación
- Consulta la nueva documentación.
Abril de 2016
Anuncio del lanzamiento de la versión v2016-04
Lanzamos la versión v2016-04 de OR-Tools. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
Se actualizaron las dependencias
- Usa protobufs en lugar de marcas en las bibliotecas de enrutamiento y programación de restricciones. Para obtener más información, consulta http://or-tools.blogspot.fr/2016/02/heads-up-upcoming-incompatibility-in.html.
Diciembre de 2015
Anuncio del lanzamiento de la versión v2015-12
Lanzamos la versión v2015-12 de OR-Tools. Para actualizar tu versión, consulta la sección correspondiente en Instalación de herramientas de OR.
Resolución de restricciones
- Se rompió la compatibilidad con Large Neighborhood Search en el solucionador de problemas de PC (consulta
examples/cpp/ls_api.cc
,examples/python/pyls_api.py
,examples/csharp/csls_api.cs
yexamples/com/google/ortools/sample/LsApi.java
para ver la nueva API). - Se limpió el ajuste de Python. Admite la decisión personalizada en la resolución de CP (consulta
examples/test/test_cp_api.py
para ver la API en acción). - Diversas mejoras y correcciones de errores.
Septiembre de 2015
Anuncio de la primera versión en GitHub.
A partir de ahora, los archivos se almacenarán allí.
Piso de zinc
- Se agregaron archivos binarios para el intérprete de Flatzinc (consulta www.minizinc.org).
- Contiene algunas correcciones de la versión utilizada en el desafío.