gpt4 book ai didi

Haskell:抽象遗传算法

转载 作者:行者123 更新时间:2023-12-03 13:36:04 25 4
gpt4 key购买 nike

我是 Haskell 编程世界的新手,我正在尝试一种简单的遗传算法,以找到解决旅行推销员问题的好方法。我将解决方案表示为整数的排列,所以我有这种类型的同义词

type Genome = [Int]

算法本身是一组对解进行操作的函数:
mutation :: Genome -> Genome
selectParents :: [Genome] -> [Genome] -> [Genome]
crossover :: Genome -> Genome -> (Genome, Genome)
selectSurvivors :: [Genome] -> [Genome] -> [Genome]

我不确定我的代码有多少与我的问题相关,所以请询问是否需要更多详细信息。值得一提的是,上面的类型签名实际上是简化的,我实际上是在使用 State monad 来携带 StdGen所以所有这些函数实际上都返回有状态的计算。

有几件事我想用这个做,但不能完全理解。我想让为解决方案选择不同的表示形式成为可能,在我看来这将是使用类型类的自然场所,因此 Genome将是类型类和 [Int] Genome 的具体实例.

现在,我希望能够对实现进行试验,并且希望能够在其他项目中使用该代码。使用这样的类型类需要我创建的每个新算法都需要我创建 Genome 的另一个实例,这是创建图书馆的好方法吗?

一个额外的问题,只是一直困扰我的一件事,有没有办法为函数创建类似类型同义词的东西,这样如果我正在编写一个以函数作为参数的函数,我可以编写同义词而不是整个类型函数的签名,即这样的东西可以工作。
type someFunc = [Int] -> [Int] -> Int
someOtherFunc :: someFunc -> [Int] -> Int

是的,希望这是对问题的足够清晰的解释,感觉就像我错过了真正明显的答案,但它并没有跳出来。干杯

最佳答案

不幸的是,理想的解决方案通常取决于您的问题域。 This blog post谈论类型类方法和按位方法。如果您想要灵 active ,我个人认为混合方法是最好的。如果有一个好的按位映射,你可以定义它,并从中派生出实现,否则你可以手动实现交叉和变异。

ja的方法实际上是行不通的。你的一些基因组功能需要随机输入,你可以通过在状态单子(monad)中运行随机数生成器like this thread来获得。

class Genome a where
fitness :: a -> Int
breed :: (RandomGen g, MonadState g m) => a -> a -> m a
mutate :: (RandomGen g, MonadState g m) => a -> m a

然后,无论实现如何,您都有在基因组上运行的通用功能。
selectParents :: (Genome a, RandomGen g, MonadState g m) => [a] -> m [a]
selectSurvivors :: (Genome a, RandomGen g, MonadState g m) => [a] -> m [a]

如果你确实有一个好的位映射,你可以在 BitArrays 上定义固定函数(注意每个都必须将适应度函数作为参数)
breed :: (RandomGen g, MonadState g m) => BitArray -> BitArray -> m BitArray
mutate :: (RandomGen g, MonadState g m) => BitArray -> m BitArray
selectParents :: (RandomGen g, MonadState g m) => (BitArray -> Int) -> [BitArray] -> m [BitArray]
selectSurvivors :: (RandomGen g, MonadState g m) => (BitArray -> Int) -> [BitArray] -> m [BitArray]

关于Haskell:抽象遗传算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5010267/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com