这可能是一个愚蠢的问题,但是我已经在这个问题上停留了几个小时。.我已经制定了遗传算法,但认为我可以尝试对其进行一些改进。我想做一个适应度函数,比较两个数字列表并返回一个值。如果两个列表包含的数字相同且在同一“位置”,则函数应返回+2。如果列表包含的数字相同但在错误的位置,则应返回+ 1。
我已经完成了两个不同的功能,都可以完成其中一项任务,但是我无法将它们合并为一个功能。功能如下:
samePlace _ [] = 0
samePlace [] _ = 0
samePlace (x:xs) (y:ys)
| x == y = (sP xs ys) + 2
| otherwise = sP xs (ys)
此函数在相同的位置和正确的位置返回的每个数字都返回+2。
notSamePlace [] _ = 0
notSamePlace _ [] = 0
notSamePlace (x:xs) (ys)
| elem x (ys) = (notSamePlace xs ys) + 1
| otherwise = (notSamePlace xs ys)
此函数返回+ 1是第二个列表中第一个列表中存在的数字。
我遇到的问题是,同位功能需要将两个列表分开,并一次通过一个数字来比较它们,而异位功能则需要保持第二个列表完整而不拆分头和尾巴向上。如果有人能指出正确的方向如何解决这个问题,我将非常感激。
而且,我认为该功能可以缩短在遗传算法中找到解的时间。如果我的解决方案是找到字符串“ hello world”,则我认为具有基因“ leolh owdrl”的人应该比看起来像“ hFz%l r0M / z”的基因具有更大的适应性。到目前为止,在我的程序中,第一个基因的适应度值为1(因为“空格”是与目标字符在同一位置的唯一字符),但是第二个基因的正确性是“ h”和“空格”它的适应性值为2。这是一个好主意吗?
谢谢!
下面的函数用于zip
索引每个字符,从而允许将第二个完整列表传递给递归调用。
places :: String -> String -> Int
places _ [] = 0
places [] _ = 0
places xs ys = zippedPlaces (zip xs [1..length xs]) (zip ys [1..length ys])
zippedPlaces :: [(Char, Int)] -> [(Char, Int)] -> Int
zippedPlaces [] _ = 0
zippedPlaces (x:xs) ys =
let match = filter (\(num, i) -> fst x == num) ys
in case match of
[] -> zippedPlaces xs ys
(a:_) -> (if snd a == snd x then 2 else 1) + zippedPlaces xs ys
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句