Biblioteca de algoritmos genéticos paralelos para C/C++

Estoy buscando una biblioteca de algoritmos genéticos en C ++ que pueda ejecutarse en paralelo, idealmente escalando a unos cientos de núcleos. Según tengo entendido, los GA son casi vergonzosamente paralelos, por lo que estoy un poco sorprendido de tener problemas para encontrar una biblioteca paralela ampliamente utilizada.

El estándar para GA en C++ parece ser galib . Es bastante bueno, pero se hizo hace unos 20 años y recomienda paralelizar usando PVM , que no es una opción en mis clústeres.

Hasta ahora he encontrado GAlib-mpi , que parece haber sido creado por un estudiante graduado que agregó un código MPI a galib. Estoy probando eso ahora.

Me pregunto:

  1. ¿Hay alguna otra biblioteca estándar que me esté perdiendo?
  2. Si no es así, ¿alguien ha tenido una buena experiencia con GAlib-mpi?

EDITAR:

Terminé haciendo que GAlib-mpi funcionara, pero para futuros buscadores mencionaré otra opción que encontré pero que no probé, pgapack .

Nota para las personas que estén considerando Open Beagle : la documentación está bastante incompleta (alrededor de la mitad de las páginas solo tienen 'TODO' y no pude encontrar un ejemplo real usando el módulo HPC), pero hay una buena cantidad de información disponible a través de el Grupo Google y el Grupo Yahoo .

¿C++ para el motor GA o la interfaz de la biblioteca?
Principalmente la interfaz, ya que estaré programando en C++.
El marco EC más documentado que conozco es ECJ pero es Java (¿tal vez la interfaz C ++ existe en alguna parte?).
¿Fuente abierta? ¿Libre? ¿Qué presupuesto?
Idealmente libre/de código abierto para mis propósitos.

Respuestas (4)

Puede usar Open BEAGLE , es uno de los marcos de computación evolutiva (EC) más utilizados y proporciona un modelo maestro-esclavo para la evaluación paralela de la aptitud.

Gagne, Christian y Marc Parizeau. " Open BEAGLE: un nuevo marco versátil de C++ para la computación evolutiva. " Documentos de última hora de GECCO. 2002.

Genericidad : Con Open BEAGLE, el usuario puede ejecutar cualquier tipo de EC, siempre que cumpla unos requisitos mínimos. La condición necesaria es tener una población de individuos a los que se les aplica iterativamente una secuencia de operaciones evolutivas. Hasta ahora, se implementaron dos marcos especializados utilizando Open BEAGLE: Algoritmos genéticos (GA) y Programación genética (GP). También se planea un marco de estrategias evolutivas (ES) para una versión futura. El usuario puede tomar cualquiera de estos marcos especializados y modificarlos aún más para crear su propio sabor especializado de algoritmos evolutivos.

Facilidad de uso : Open BEAGLE proporciona varios mecanismos que ofrecen una interfaz de programación fácil de usar. Por ejemplo, la gestión de la memoria de los objetos asignados dinámicamente se simplifica en gran medida mediante el uso del recuento de referencias y la recolección automática de elementos no utilizados.

Portabilidad : el código Open BEAGLE cumple con el estándar C++ ANSI/ISO 3. Requiere la Biblioteca de plantillas estándar (STL) (Musser y Saini, 1996). No se realizan llamadas específicas al sistema operativo ni al hardware.

Eficiencia : para asegurar una ejecución eficiente, se prestó especial atención a la optimización de las secciones críticas del código. Se realizaron perfiles detallados de ejecución de estos tramos. Además, el hecho de que Open BEAGLE esté escrito en C++ contribuye a su buen rendimiento general.

Robustez : muchas declaraciones de validación están integradas en el código para garantizar el funcionamiento correcto e informar al usuario cuando hay un problema. También se han implementado mecanismos robustos para guardar periódicamente el estado de evolución actual con el fin de permitir el reinicio automático de evoluciones interrumpidas.

Elegancia : La interfaz de Open BEAGLE fue desarrollada con cuidado. Se invirtieron grandes esfuerzos en el diseño de un paquete de software coherente que sigue buenos principios de programación OO y genéricos. Además, se aplicaron estrictas reglas de programación para que el código C++ fuera fácil de leer, comprender y modificar.

Fuente libre El código fuente de Open BEAGLE es gratuito y está disponible bajo la Licencia pública general reducida de GNU (LGPL) (Free Software Foundation Inc., 2000). Por lo tanto, puede distribuirse y modificarse sin cargo alguno. Open BEAGLE está disponible en la Web en http://www.gel.ulaval.ca/~beagle .

diagrama de arquitectura de software

Cuando estaba trabajando en mi tesis de maestría en Francia, usé Sferes2 , que también se basa en MPI para la paralelización de la evaluación de la aptitud. Tiene menos características y menos maduro/documentado que Open BEAGLE, pero el código es mucho más corto ( SLOC: 5K vs 40K para Open BEAGLE (1) ) y está muy bien organizado.

(1) Mouret, JB. y Stéphane Doncieux. " Sferes v2: Evolvin'in the multi-core world. " Computación evolutiva (CEC), Congreso IEEE de 2010 sobre. IEEE, 2010:

Esta línea de pensamiento nos lleva a los siguientes objetivos principales para Sferesv2:

  • Sea multinúcleo desde cero: incluya optimizaciones multinúcleo desde el inicio del proceso de diseño
  • Ser actualizado y multiobjetivo: proporcionar algunas implementaciones bien seleccionadas de EA "modernos", y especialmente EA multiobjetivo (MOEA)
  • Estar basado en técnicas modernas de C++ para ser tanto abstracto como eficiente.

Además, establecemos los siguientes objetivos, que se pueden resumir en "el marco debe ser una buena y simple pieza de software":

  • Ser extensible: agregar nuevos algoritmos debería ser sencillo.
  • Sea simple: los experimentos simples (por ejemplo, la optimización de parámetros reales) deben ser fáciles de configurar y requieren la cantidad mínima de código.
  • Ponga el énfasis en implementaciones eficientes en lugar de cubrir la mayor cantidad de algoritmos.
  • Sea pequeño: el código fuente debe ser lo más corto posible para permitir que los nuevos usuarios dominen rápidamente la biblioteca y para facilitar el mantenimiento.
  • Ser probado: cada característica importante debe ir acompañada de una prueba unitaria.
  • Ser portátil a todas las versiones actuales de Unix (especialmente GNU/Linux y MacOSX);
  • Ser de código abierto (compatible con GPL).
  • Ser fácil de interactuar con el código existente actual (especialmente para las funciones de fitness).

Diagrama de clases UML de las principales clases de Sferesv:

Diagrama de clases UML de las principales clases de Sferesv

A pesar de lo tarde, me pareció importante mencionar openGA.

OpenGA es una biblioteca de algoritmos genéticos de C++. Esta biblioteca es rápida y depende del std::threadparalelismo. Esta biblioteca tiene subprocesos múltiples habilitados de forma predeterminada. Esta biblioteca es multiplataforma y puede ser compilada por compiladores modernos que admitan C++ 11.

OpenGA admite modos de problema de un solo objetivo, multiobjetivo NSGA-III e interactivo.

El enfoque principal de esta biblioteca es la comodidad del usuario. No requiere que use punteros, tiene una gran cantidad de plantillas y le permite definir su propio tipo de datos genéticos en lugar de imponer un vector. También puede resolver problemas de programación genética. Además, tiene una función de asistencia de GA que crea una plantilla de código automática básica basada en su información inicial para iniciar el código.

He hecho algunas partes con algoritmos genéticos (tanto de un solo objetivo como de múltiples objetivos) en mi sitio web, para aplicaciones que incluyen optimización de enrutamiento, optimización de funciones, clasificación de redes, etc.

Todas estas aplicaciones se escribieron en C++, ya sea como aplicaciones de consola sencillas o como aplicaciones de diálogo/ventana única. No es un marco, pero las implementaciones comienzan a adquirir una similitud después de un tiempo, por ejemplo, clases/métodos para cruce, mutación, selección, evaluaciones de aptitud, manejo de restricciones, mantenimiento de poblaciones, etc.

Podría valer la pena jugar con estos si solo está buscando tener una idea de la computación evolutiva y se pueden codificar varios operadores genéticos. Siéntase libre de descargar estos y ver lo que piensa. ¡Comentarios y comentarios siempre bienvenidos!

http://www.technical-recipes.com/category/genetic-algorithms/