首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Haskell:提取遗传算法

Haskell:提取遗传算法
EN

Stack Overflow用户
提问于 2011-02-16 06:28:18
回答 1查看 2.7K关注 0票数 18

我是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

是的,希望这是对问题的足够清晰的解释,感觉我错过了非常明显的答案,但它没有突然出现在我面前。干杯

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-19 17:12:13

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

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

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]
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5010267

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档