获取具有最高属性的列表中的n个元素

罗宾

我是Haskell的新手,正在尝试实现一些遗传算法。目前,我未能选择一个个体列表中的n个最佳元素(每个个体都是其自身的列表。一个个体的创建过程如下:

ind1 :: [Int]
ind1 = [1, 1, 1, 1, 1, 1, 1]
ind2 :: [Int]
ind2 = [0, 0, 0, 0, 0, 0, 0]

适当的人口包括以下个人的列表:

pop :: [[Int]]
pop = [ind1, ind2]

我想要实现的是获得人口中最好的n个人,其中“最佳”由其元素的总和决定,例如,

> sum ind1
7
> sum ind2
0

我开始创建一个函数来创建具有个性及其质量的元组:

f x = [(ind, sum ind) | ind <- x]

所以至少我得到了这样的东西:

[([1, 1, 1, 1, 1, 1, 1], 7), ([0, 0, 0, 0, 0, 0, 0], 0)]

我如何从这里得到预期的结果?我什至没有得到“ snd == max”的元组的“ fst”。我从在不同主题中看到的递归方法开始,但是不幸的是没有合理的结果。有什么建议,可能还在哪里阅读?谢谢!

比克利尔

这里最好的选择是使用sortBy来自Data.List

sortBy :: (a -> a -> Ordering) -> [a] -> [a]

sortBy函数是高阶的,因此它将一个函数作为其参数之一。它所需要的功能是一个带有两个元素,并返回一个Ordering值(LTEQGT)。您可以编写自己的自定义比较函数,但是Data.Ord模块具有comparing,该模块可以帮助编写以下比较函数:

comparing :: Ord b => (a -> b) -> (a -> a -> Ordering)

希望您能看到comparing与的配对方式sortBy,并向其传递一个将您的类型转换为已知的可比较类型的函数,然后又有一个正确类型的函数传递给sortBy所以在实践中你可以做

import Data.List (sortBy)
import Data.Ord (comparing)

-- Some types to make things more readable
type Individual = [Int]
type Fitness = Int

-- Here's our fitness function (change as needed)
fitness :: Individual -> Fitness
fitness = sum

-- Redefining so it can be used with `map`
f :: Individual -> (Individual, Fitness)
f ind = (ind, fitness ind)

-- If you do want to see the fitness of the top n individuals
solution1 :: Int -> [Individual] -> [(Individual, Fitness)]
solution1 n inds = take n $ sortBy (flip $ comparing snd) $ map f inds

-- If you just want the top n individuals
solution2 :: Int -> [Individual] -> [Individual]
solution2 n inds = take n $ sortBy (flip $ comparing fitness) inds

flip参数中insortBy强制排序为降序而不是默认的升序,因此n从返回的第一个sortBy将是n适应性最高值(降序排列)。如果您想尝试不同的健身功能,则可以执行以下操作

fittestBy :: (Individual -> Fitness) -> Int -> [Individual] -> [Individual]
fittestBy fit n = take n . sortBy (flip $ comparing fit)

那你有

solution2 = fittestBy sum

但是你也可以

solution3 = fittestBy product

如果您想将健身功能更改为乘积而不是总和。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从Java列表中获取具有满足流条件的第n个元素的子列表

来自分类Dev

获取ArrayList中具有最高值的特定元素

来自分类Dev

在python中获取具有最高值的元素

来自分类Dev

从字典列表中,获得N个具有最高值的字典

来自分类Dev

使用C#中的Selenium获取具有特定类的所有元素的属性值的列表

来自分类Dev

如何从具有2个列表的列表中获取相同的索引元素

来自分类Dev

获取具有slot属性vue的元素的列表

来自分类Dev

从列表中获取前n个元素

来自分类Dev

Scala:获取具有两个限制的列表元素

来自分类Dev

获取对象列表中的最高日期,并获取其类的另一个属性

来自分类Dev

Linq-获取具有列表属性的对象,该属性在另一个列表中不包含值

来自分类Dev

获取所有/某些元素的列表的前 n 个元素

来自分类Dev

从Java列表中仅选择具有特定属性的元素

来自分类Dev

在XmlDocument中获取具有特定属性值的xml元素

来自分类Dev

从多维数组中获取具有最高日期时间值的数组元素

来自分类Dev

如何使用LINQ从具有重复项的列表中获得第N个最大元素?

来自分类Dev

如何使用LINQ从具有重复项的列表中获得第N个最大元素?

来自分类Dev

如何从MongoDB集合中获取具有匹配键的最后N个元素

来自分类Dev

LINQ:获取列表中具有最大属性值的记录

来自分类Dev

Python获取具有匹配属性的列表中的对象

来自分类Dev

从可排序列表中获取所有元素属性

来自分类Dev

获取具有最高数值的输入元素的输入id

来自分类Dev

获取具有最高前缀值的数组元素

来自分类Dev

在Haskell中具有2个元素的模式匹配列表

来自分类Dev

获取Javascript中具有最高值的前十个var

来自分类Dev

获取列表中具有另一个列表中的一个属性的所有项目的计数

来自分类Dev

从多个具有相同名称的元素中获取属性值,并且在xml中获得另一个元素的属性值

来自分类Dev

java:如何从具有独特的第一个字符的数组列表中获取元素

来自分类Dev

从列表中获取k个元素的所有可能组合

Related 相关文章

  1. 1

    从Java列表中获取具有满足流条件的第n个元素的子列表

  2. 2

    获取ArrayList中具有最高值的特定元素

  3. 3

    在python中获取具有最高值的元素

  4. 4

    从字典列表中,获得N个具有最高值的字典

  5. 5

    使用C#中的Selenium获取具有特定类的所有元素的属性值的列表

  6. 6

    如何从具有2个列表的列表中获取相同的索引元素

  7. 7

    获取具有slot属性vue的元素的列表

  8. 8

    从列表中获取前n个元素

  9. 9

    Scala:获取具有两个限制的列表元素

  10. 10

    获取对象列表中的最高日期,并获取其类的另一个属性

  11. 11

    Linq-获取具有列表属性的对象,该属性在另一个列表中不包含值

  12. 12

    获取所有/某些元素的列表的前 n 个元素

  13. 13

    从Java列表中仅选择具有特定属性的元素

  14. 14

    在XmlDocument中获取具有特定属性值的xml元素

  15. 15

    从多维数组中获取具有最高日期时间值的数组元素

  16. 16

    如何使用LINQ从具有重复项的列表中获得第N个最大元素?

  17. 17

    如何使用LINQ从具有重复项的列表中获得第N个最大元素?

  18. 18

    如何从MongoDB集合中获取具有匹配键的最后N个元素

  19. 19

    LINQ:获取列表中具有最大属性值的记录

  20. 20

    Python获取具有匹配属性的列表中的对象

  21. 21

    从可排序列表中获取所有元素属性

  22. 22

    获取具有最高数值的输入元素的输入id

  23. 23

    获取具有最高前缀值的数组元素

  24. 24

    在Haskell中具有2个元素的模式匹配列表

  25. 25

    获取Javascript中具有最高值的前十个var

  26. 26

    获取列表中具有另一个列表中的一个属性的所有项目的计数

  27. 27

    从多个具有相同名称的元素中获取属性值,并且在xml中获得另一个元素的属性值

  28. 28

    java:如何从具有独特的第一个字符的数组列表中获取元素

  29. 29

    从列表中获取k个元素的所有可能组合

热门标签

归档