Soy nuevo en el mundo de la programación de Haskell y estoy aprendiendo un algoritmo genético simple para encontrar buenas soluciones al problema del Viajero Vendedor. Estoy representando a las soluciones como permutaciones de números enteros y por lo que tengo este tipo de sinónimosHaskell: Resumiendo un algoritmo genético
type Genome = [Int]
El propio algoritmo es un conjunto de funciones que operan sobre las soluciones:
mutation :: Genome -> Genome
selectParents :: [Genome] -> [Genome] -> [Genome]
crossover :: Genome -> Genome -> (Genome, Genome)
selectSurvivors :: [Genome] -> [Genome] -> [Genome]
No estoy seguro de cómo gran parte de mi código es relevante para mi pregunta, así que pregunte si se necesitan más detalles. Una cosa que vale la pena mencionar es que las firmas de tipo anteriores están realmente simplificadas, de hecho estoy usando la mónada de estado para llevar a cabo un StdGen
, por lo que todas estas funciones realmente devuelven cálculos con estado.
Hay varias cosas que me gustaría hacer con esto pero no puedo entender bien. Quiero hacer posible elegir diferentes representaciones para las soluciones, me parece que este sería un lugar natural para usar una clase de tipo, de modo que Genome
sería la clase de tipo y [Int]
una instancia específica de este Genome
.
Ahora, quiero experimentar con las implementaciones, y quiero poder usar el código en otros proyectos. Usar una clase de tipo como esta requeriría que cada nuevo algoritmo que crease me requiriera crear otra instancia de Genome
, ¿es esta una buena manera de crear una biblioteca?
Una pregunta extra, solo una cosa que me ha estado molestando, ¿hay alguna manera de crear algo así como un sinónimo para una función? Así que si estoy escribiendo una función que toma funciones como argumentos, puedo escribir el sinónimo que la firma de tipo entero de la función, es decir, para que funcione algo como lo siguiente.
type someFunc = [Int] -> [Int] -> Int
someOtherFunc :: someFunc -> [Int] -> Int
derecho, es de esperar que es una explicación lo suficientemente lúcida del problema, se siente como que he perdido la respuesta muy obvio pero no ha saltado a mí. Cheers
qué funciones serían las instancias de Genome necesidad de definir? 'mutation',' selectParents', etc.? ¿O hay un conjunto de funciones más pequeñas (y más simples) en las que puede definir esas funciones en términos de? – rampion
Podría estar equivocado, pero creo que esas funciones son tan simples como pueden ser. Tal vez solo estoy tratando de hacerlo más general de lo que es posible. –
Suena como esto provocaría una buena discusión en una lista de correo. Ver [listas de distribución de Haskell] (http://haskell.org/haskellwiki/Mailing_lists) –