Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何创建爬山算法_Python_String_Algorithm_Random_Hill Climbing - Fatal编程技术网

Python 如何创建爬山算法

Python 如何创建爬山算法,python,string,algorithm,random,hill-climbing,Python,String,Algorithm,Random,Hill Climbing,我一直在关注一本学习python的书,这本书有以下挑战之一: 自我检查 这是一个自我检查,涵盖了目前为止的所有内容。你可能有 听说过无限猴子定理吗?这个定理说明猴子 在打字机键盘上随意敲击键盘,可获得无限量 当然,时间几乎肯定会键入给定的文本,例如完整的 威廉·莎士比亚的作品。好吧,假设我们用一只猴子代替一只猴子 Python函数。你认为一条Python需要多长时间 函数只生成莎士比亚的一句话?判决 我们要拍的是:“我觉得它像只黄鼠狼” 你不会想在浏览器中运行这个,所以启动它 您最喜欢的Pyth

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

自我检查

这是一个自我检查,涵盖了目前为止的所有内容。你可能有 听说过无限猴子定理吗?这个定理说明猴子 在打字机键盘上随意敲击键盘,可获得无限量 当然,时间几乎肯定会键入给定的文本,例如完整的 威廉·莎士比亚的作品。好吧,假设我们用一只猴子代替一只猴子 Python函数。你认为一条Python需要多长时间 函数只生成莎士比亚的一句话?判决 我们要拍的是:“我觉得它像只黄鼠狼”

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

第三个函数将重复调用generate和score,如果100% 这些字母中有一个是正确的,我们完成了。如果字母不正确 然后,我们将生成一个全新的字符串。以便更容易理解 你的程序的进度第三个函数应该打印出最好的结果 到目前为止生成的字符串及其每1000次尝试的分数

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

然后,它将面临以下额外挑战:

自我检查挑战

在自检中查看您是否可以通过保持 正确的字母,最好只修改一个字符 到目前为止。这是“hill”类中的一种算法 “爬山”算法,也就是说,我们只保留更好的结果 比前一个好

然而,我无法弄清楚这个爬山算法是什么,以及如何在现有代码中实现它


请解释一下如何实现这个爬山算法,非常感谢大家

代码改进属于简单但可能效率低下的方法:在生成第一个随机字符串后,随机选择一个字符位置,检查该字符是否已经位于正确的位置。如果是,请再次选择,直到找到错误的。从字母表中随机选择一个字母,并将其设置在生成的字符串中的此位置。重复此操作,直到所有字符匹配。在
score\u check()
中,您可以在
target
中“擦除”不匹配的字符。然后在
string\u generate()
中,只替换已擦除的字母。@grantgarison哦,好的,如果答案能提供一种实现所谓的“爬山”算法的方法,那就足够了,谢谢@GrantGarrison代码的改进确实如此,但关于如何编写代码的建议却没有。(即回答OP关于如何编写爬山算法的问题)。
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()