Discusión sobre el artículo "Algoritmos Genéticos: ¡Es fácil!" - página 8
Está perdiendo oportunidades comerciales:
- Aplicaciones de trading gratuitas
- 8 000+ señales para copiar
- Noticias económicas para analizar los mercados financieros
Registro
Entrada
Usted acepta la política del sitio web y las condiciones de uso
Si no tiene cuenta de usuario, regístrese
1) ¿Cuentacuentos? Hmm, desafortunadamente no entendí el humor. La comprobación de la base de datos ocurre en la función CheckHistoryChromosomes(chromos,historyHromosomes ) que se llama desde GetFitness(historyHromosomes). Por eso he dicho correctamente: no hay ejecuciones repetidas de FF.
2) La reconciliación con la base de datos se produce con la comprobación por genes. Y cada gen es normalizado por SelectInDiscreteSpace(temp,RangeMinimum,RangeMaximum,Precision,3) cuando aparece un nuevo cromosoma. Así que aquí tampoco hay "cuentos de hadas".
3) Véase 2)
1,2,3) Entendido. Casi. La normalización es realmente allí. Pero todavía no es una razón para comparar números reales "sin brecha" para la igualdad. :)
SelectInDiscreteSpace() se ha modificado ligeramente. No me gustó el hecho de que corrige Step internamente. No es un asunto real corregir a un usuario. Al menos no esta vez.
El usuario puede tener consideraciones razonables para hacer Step "irracional" con respecto al rango de cambios de genes.
Funcionó así:
SelectInDiscreteSpace() se ha modificado ligeramente. No me gusta que corrijas a Step inside. No es asunto del rey corregir a un usuario. Al menos no en esta ocasión.
El usuario puede tener consideraciones razonables para que Step sea "irracional" con respecto al rango de cambios del gen.
Entienda esto:
El punto es que el paso puede ser tal que dividirá el espacio en un número no entero de secciones, y esto no es bueno, porque inmediatamente surge la pregunta, de qué lado del número de entrada para "agarrar" el valor en la línea numérica (no se sabe lo que es "derecho", derecha o izquierda) - mi algoritmo da una respuesta adecuada, pero el suyo por desgracia. Por eso hay que hacerlo así:
step = (InMax - InMin) / MathCeil ( (InMax - InMin) / step );He aquí algunos ejemplos comparativos de los resultados de tu código y el mío:
El significado de dicha normalización es diferente al de NormalizeDouble (), pero es decisión del propietario, a quien no le guste, puede utilizar la normalización al signo requerido, no con un paso especificado como en SelectInDiscreteSpace().
Está todo claro, igual que en el post anterior.
Andrei, todas las variantes listadas tienen derecho a existir aquí. La tuya también, por supuesto. La discreción flotante y cambiante durante la optimización merece mucha atención.
--
Sobre todo en general :
Deberías añadir ajustes, una librería de operadores genéticos, etc. Y deberías pensar en extensiones y usos convenientes por adelantado.
Estoy pensando en reescribir todo en objetos, haciendo una interfaz más potente tanto para el programa como para el usuario (gráfica, con muchos ajustes en pestañas). Algunas cosas para añadir, otras para cooptimizar.
Más concretamente, aún estoy pensando si hacerlo basado en tu código (usar fragmentos) o reescribirlo todo de nuevo.
Si quieres participar, escríbeme por privado.
No es seguro que lo publique. Ya veremos. Por ahora quiero hacerlo para mí.
Sobre todo en general :
1) En el buen sentido - es necesario añadir personalizaciones, una biblioteca de operadores genéticos, etc Y pensar en la extensión conveniente y el uso de antemano.
2) Más concretamente, aún estoy pensando si hacerlo basado en tu código (usar fragmentos) o reescribirlo todo de nuevo.
3) Si quieres participar, escribe por privado.
1) Al contrario, estoy intentando reducir el número de parámetros UGA sin reducir la flexibilidad del control.
2) Conozco a varias personas que usan el código del artículo en sus proyectos tal cual, y a los que han reescrito el código desde 0.
3) Te escribí en un mensaje privado.
Todo esto es comprensible, al igual que el post anterior.
Andrei, todas las opciones enumeradas aquí tienen derecho a existir. Las tuyas también, por supuesto. La discreción flotante, que cambia durante el proceso de optimización, merece mucha atención.
--
Sobre todo en general :
Debería añadir ajustes, una biblioteca de operadores genéticos, etc. Y debería pensar en extensiones y usos convenientes por adelantado.
Estoy pensando en reescribir todo en objetos, haciendo una interfaz más potente tanto para el programa como para el usuario (gráfica, con muchos ajustes en pestañas). Algunas cosas para añadir, otras para cooptimizar.
Más precisamente, todavía estoy pensando si hacerlo basado en tu código (usar fragmentos) o reescribirlo todo de nuevo.
...Vladimir, ¿quieres montar o conducir?
¿Quieres un código bonito o quieres construir un GA más chulo que el de tester?
Personalmente creo que el de prueba es bastante guay, pero hay pocos parámetros.
.
Vladimir, ¿quieres montar o conducir?
¿quieres un código hermoso o para construir un GA más fresco que el probador?
Personalmente creo que el tester uno es bastante fresco, sólo un matiz no es suficiente parámetros.
.
Quiero un código cómodo. Fácil de usar, extender, modificar e incrustar.
Quiero un código cómodo. Fácil de usar, extender, modificar e incrustar.
Sustituida la línea 175 por.
Sin esto, el informe de trabajo falla con un error.
Sustituida la línea 175 por.
Sin esto, el informe de operación fallará con un error.
Sí, se producirá un error de división por 0 si no se ha producido ninguna mejora durante un número determinado de épocas desde la primera ejecución del bucle del operador gen.
Es más sencillo, y lógicamente más correcto, asignar 1 a la variable resetCounterFF inmediatamente en la inicialización: