我目前正尝试使用非常规方法(遗传算法)解决reddit上的hard Challenge #151问题。
简而言之,在将字符串分隔为consonants
和vowels
并删除spaces
后,我需要将其放在一起,而不知道首先出现什么字符。
hello world
分为hllwrld
和eoo
,需要再次组合在一起。例如,一个解决方案是hlelworlod
,但这没有多大意义。采用所有可能解决方案的详尽方法可行,但对于较长的问题集是不可行的。
cost
数据库的算法,可以始终从没有空格的句子中分离单词(借用this question/answer 1
和2
组成的字符串的方法,有效地编码gene
中的构造1}}。该示例的正确gene
为1211212111
使用infer_spaces()
方法生成500个随机序列,并使用所有单词的成本评估适应度,取最佳值25%并从中修改4个新值,适用于小字符串,但非常属于局部最小值经常,特别是对于更长的序列。 Hello World 已在第一代中找到,thisisnotworkingverygood
(已正确分隔且费用为41.223
)已收敛到th iss n ti wo or king v rye good
(270费用)在第二代。
显然,使用计算出的成本作为评估方法仅适用于语法正确的句子分离,而不适用于此遗传算法。你有更好的想法吗?或者是解决方案的另一部分,例如gene
的表示,问题?
答案 0 :(得分:5)
我会将问题简化为两部分,
我首先会使用您的词频词典,并处理它以创建没有元音的第二个词列表,以及每个折叠词(以及相关频率)的可能元音列表列表。从技术上讲,你不需要一个GA来解决这个问题(而且我认为没有GA就更容易解决),但正如你所问,我将提供2个答案:
没有GA:你应该能够使用深度优先搜索解决第一个问题,将单词的子字符串与该字典匹配,并使用剩余的单词部分进行匹配,只接受分区的将单词转换为单词(不含元音),其中所有单词都在第二个字典中。然后你必须用元音代替。鉴于第二个字典和您已经拥有的分区,这应该很容易。您还可以使用元音列表来进一步约束分区,因为分区中的有效单词只能使用输入到算法中的元音列表中的元音来完整。从字符串的左侧开始,以深度优先的方式迭代所有有效分区,应该相对快速地解决这个问题。
使用GA :要使用GA解决此问题,我会创建没有元音的单词词典。然后使用GA,创建与辅音输入字符串长度相同的二进制字符串(作为您的染色体),其中1 =在该位置分割一个单词,0 =保持不变。这些字符串的长度都相同。然后创建一个适应度函数,该函数根据该字典返回使用染色体执行分割后获得的单词的比例,该染色体是没有元音的有效单词。创建第二个适应函数,该函数采用有效的非元音单词,并计算所有这些有效的非元音单词和原始元音列表中缺失的元音之间的重叠比例。通过将第一个值乘以十来将两个适应度函数组合成一个(假设第二个返回0到1之间的值)。这将迫使算法首先关注分割问题并且首先关注元音插入问题,并且还将支持具有相同质量的分段,但是优选具有与原始列表具有更接近的缺失元音集的那些分段。我还将在解决方案中包括交叉。由于你的所有染色体长度相同,这应该是微不足道的。一旦你有一个完美的健身功能得分的解决方案,那么给定没有元音的单词字典重新创建原始句子应该是微不足道的(前提是你维护第二个字典,列出每个非元音单词可能缺少的元音集) - 每个可能有多个,因为一些元音字与删除的元音相同。
答案 1 :(得分:1)
让我们假设您有几代人,并且您在每一代中绘制最佳标本的成本(我们考虑长句)。这个图表是否会在2-3代后降低或收敛到特定值(让算法运行例如10代)?你可以用不同的初始条件(随机序列)多次运行你的算法,看看你有时候是否得到好的结果?
根据结果,您可以尝试以下操作(此图表是提高性能的非常好的工具):
1)如果你的图表总是上下过多 - 你有太多的突变(例如每个基因的平均交换次数),试着减少它。
2)如果你坚持局部最小值(最佳标本的成本在一段时间后没有变化很多)尝试增加突变或运行几个孤立的群体(3-4 )让我们在你的算法开始几代时说100种。然后选择最佳人口(接近全球最低人口)并尝试通过变异尽可能地改善它
PS:顺便说一句有趣的问题,我试图弄清楚如何使用交叉来改进算法,但还没有想出来答案 2 :(得分:1)
适应度函数是GA算法成功的关键(我认为这是合适的。)
我同意@Simon认为元音非元音分离并不重要。只需访问你的文本语料库以删除元音。
健身中最重要的是:
并且不要忘记更新最终结果^^