Python 寻找一种更好的遗传算法评价方法

Python 寻找一种更好的遗传算法评价方法,python,algorithm,genetic-algorithm,Python,Algorithm,Genetic Algorithm,我目前正试图用一种不常用的方法,一种遗传算法来解决reddit上的问题 简言之,在将字符串拆分为辅音和元音并删除空格后,我需要将其组合在一起,而不知道哪个字符先出现 hello world被分为hllwrld和eoo,需要重新组合。例如,一个解决方案是hlelworlod,但这没有多大意义。采用所有可能的解决方案的穷举方法是可行的,但对于较长的问题集是不可行的 我已经拥有的 英语词频数据库 一种使用齐夫定律构造相对成本数据库的算法,可以一致地将单词从没有空格的句子中分离出来(借用自 一种方法,

我目前正试图用一种不常用的方法,一种遗传算法来解决reddit上的问题

简言之,在将字符串拆分为
辅音
元音
并删除
空格
后,我需要将其组合在一起,而不知道哪个字符先出现

hello world
被分为
hllwrld
eoo
,需要重新组合。例如,一个解决方案是
hlelworlod
,但这没有多大意义。采用所有可能的解决方案的穷举方法是可行的,但对于较长的问题集是不可行的

我已经拥有的
  • 英语词频数据库
  • 一种使用齐夫定律构造相对
    成本
    数据库的算法,可以一致地将单词从没有空格的句子中分离出来(借用自
  • 一种方法,将辅音和元音放在一个堆栈中,从其中任意一个字符中随机抽取一个字符,并将其编码为一个由
    1
    2
    组成的字符串,有效地将结构编码为
    gene
    。例如,正确的
    gene
    1211212111
  • 一种对这样的字符串进行变异,随机交换字符的方法
我试过的 使用
推断空间()生成500个随机序列
方法和用所有单词的成本评估适合度,从中选择最好的25%并变异4个新单词,适用于小字符串,但经常陷入局部极小值,特别是对于较长的序列。Hello World已经出现在第一代中,
这不是很好
(正确分离,成本为
41.223
)聚合到第二代的iss n ti wo或king v rye good(270成本)

我需要什么
显然,使用计算成本作为评估方法只适用于语法正确的句子分离,而不适用于这种遗传算法。你有更好的想法我可以尝试吗?或者是解决方案的另一部分,例如基因的表示,问题?

假设你有几个一代一代,你为每一代的<强>最佳<强>样本绘制代价(我们考虑长句)。这个图是在2-3个世代之后下降或收敛到一个特定的值(让算法运行10代)吗?你可以用不同的初始条件(随机序列)运行你的算法数次吗?看看你有时会不会得到好的结果

根据结果,您可以尝试以下方法(此图是提高性能的非常好的工具):

1) 如果你有一张图表,它总是上下波动太大——你有太多的突变(例如,每个基因的平均交换数),试着减少它

2) 如果你坚持一个局部最小值(一段时间后,最佳样本的成本不会有太大变化),试着增加变异或在算法开始时运行几个孤立的种群(3-4个),比如说100个物种。然后选择最好的种群(接近全局最小值),并尝试通过变异来尽可能地改善它


PS:顺便说一句,有趣的问题是,我试图找出如何使用交叉来改进算法,但还没有找到答案,我将把问题简化为两部分

  • 查找要将字符串拆分为的候选词(因此hllwrld=>hllwrld)
  • 然后如何通过添加元音来扩展这些单词 我将首先使用你的词频词典,并对其进行处理,以创建第二个没有元音的单词列表,以及每个折叠单词的可能元音列表(以及相关频率)。从技术上讲,您不需要GA来解决这个问题(我认为没有GA会更容易解决),但正如您所问,我将提供两个答案:

    不使用GA:您应该能够使用深度优先搜索解决第一个问题,根据该词典匹配单词的子字符串,并使用剩余的单词部分进行匹配,只接受将单词划分为单词(不含元音),其中所有单词都在第二个词典中。然后你必须替换元音。考虑到第二个字典和您已有的分区,这应该很容易。您还可以使用元音列表来进一步约束分区,因为分区中的有效单词只能使用输入到算法中的元音列表中的元音来使其完整。从字符串的左侧开始,以深度优先的方式迭代所有有效分区,应该可以相对快速地解决这个问题

    使用GA:为了用GA解决这个问题,我将创建一个没有元音的单词词典。然后使用GA,创建与辅音输入字符串长度相同的二进制字符串(作为染色体),其中1=在该位置拆分一个单词,0=保持不变。这些字符串的长度都相同。然后创建一个适应度函数,根据该词典,该函数返回使用染色体进行拆分后获得的没有元音的有效单词的比例。创建第二个适应度函数,该函数接受有效的无元音单词,并计算所有这些有效的无元音单词中缺失的元音与原始元音列表之间的重叠比例。通过将第一个函数的值乘以10(假设第二个函数返回的值介于0和1之间),将两个适应度函数合并为一个。这将迫使算法首先关注切分问题,其次关注元音插入问题,同时也将有利于质量相同的切分,但更喜欢具有CLO的切分