如何创建爬山算法

时间:2017-12-21 16:17:54

标签: python string algorithm random hill-climbing

我一直在读一本学习python的书,这本书有以下挑战之一:

  

自我检查

     

这是一个真正涵盖到目前为止所有内容的自我检查。你可能有   听说无限猴子定理?该定理陈述了一只猴子   在打字机键盘上随机敲击键无限量   时间几乎肯定会键入给定的文本,例如完整的   威廉莎士比亚的作品。好吧,假设我们用一个替换猴子   Python函数。你认为Python需要多长时间?   只生成莎士比亚的一句话的功能?这句话   我们要拍的是:“它就像狡猾的人一样”

     

你不想在浏览器中运行这个,所以启动   你最喜欢的Python IDE。我们模拟这个的方式是写一个   生成长度为28个字符的字符串的函数   从字母表中的26个字母中选择随机字母加上   空间。我们将编写另一个函数,对每个生成的函数进行评分   通过将随机生成的字符串与目标进行比较来实现字符串。

     

第三个功能会反复调用generate和score,然后100%   这些字母是正确的我们已经完成了。如果字母不正确   然后我们将生成一个全新的字符串。让它更容易遵循   你的程序进展第三个功能应该打印出最好的   到目前为止生成的字符串及其每1000次尝试的分数。

我能够使用以下代码实现挑战的这一部分: (我是python的新手)

import random
target = 'methinks it is like a weasel'
target_len = 28

def string_generate(strlen):
 alphabet = 'abcdefghijklmnopqrstuvwxyz ' #26 letters of the alphabet + space
 res = ''
 for i in range(strlen):
  res += alphabet[random.randrange(27)]

 return res

def score_check(target,strlen):
 score = 0
 res = string_generate(strlen)
 for i in range(strlen):
  if res[i] == target[i]:
   score += 1
 return score, res

def progress_check():
 counter = 0
 score = 0
 res = ''
 while score != 28:
  score_temp, res_temp = score_check(target, target_len)
  counter += 1
  if score_temp > score:
   score, res = score_temp, res_temp
   print(res, score)
  else:
   score, res = score, res

 return res, score

progress_check()

然后有以下额外的挑战:

自我检查挑战

  

看看你是否可以通过保持自我检查来改进程序   字母是正确的,只修改最好的一个字符   到目前为止。这是'hill类中的一种算法   攀登'算法,即我们只保留结果,如果它更好   比前一个。

但是,我无法弄清楚这个爬山算法是什么,以及如何将其实现到我现有的代码中。

请解释如何实施这种爬山算法,非常感谢你们!

0 个答案:

没有答案