人工智能—问题规约法(Reduction)[二]

来源:互联网 发布:acca伦敦大学硕士知乎 编辑:程序博客网 时间:2024/04/29 19:32


梵塔问题编程


求解梵塔问题的关键在于将n盘问题分解为一个1盘问题(本原问题)和两个(n-1)盘问题。然后再将(n-1)盘规约为一个1盘问题和两个(n-2)盘问题。以此类推,最终规约为1盘问题,即本原问题。我们可以用python实现 n 盘转移过程:

这里首先要对我的变量进行说明:

  • n:盘子个数

  • x,y,z:指针表示,这里用赋值为1,2,3

  • state[ ]:n个盘子所在指针的位置。其中列表中位置越靠前表明盘子越大。

  • 若n =4,则初始状态为[1,1,1,1],目标是达到状态[3,3,3,3]

取n= 4,运行文尾代码:

结果如图:

附python代码:

# -*- coding:utf-8 -*-#返回要改变盘的状态的索引def getindexz(state,x):    index = []    for i in range(len(state)-1,-1,-1):        if state[i]==x:           index.append(i)    return index[0]def hanoi(n,x,y,z,state):     #如果是一盘问题,直接对x位置的盘移动到z      if n ==1:       state[getindexz(state, x)]=z       #打印盘子的状态       print x,'--->',z,state    else:    #两个n-1盘问题,规约    #x位置的n-1盘移动到y       hanoi(n-1, x, z, y,state)       state[getindexz(state, x)]=z       print x,'--->',z,state    #y位置的n-1盘移动到z       hanoi(n-1, y, x, z,state)      n = int(raw_input(u'请输入汉诺塔的层数:'))state =[1 for x in xrange(n)]hanoi(n,1,2,3,state)

梵塔问题编程


求解梵塔问题的关键在于将n盘问题分解为一个1盘问题(本原问题)和两个(n-1)盘问题。然后再将(n-1)盘规约为一个1盘问题和两个(n-2)盘问题。以此类推,最终规约为1盘问题,即本原问题。我们可以用python实现 n 盘转移过程:

这里首先要对我的变量进行说明:

  • n:盘子个数

  • x,y,z:指针表示,这里用赋值为1,2,3

  • state[ ]:n个盘子所在指针的位置。其中列表中位置越靠前表明盘子越大。

  • 若n =4,则初始状态为[1,1,1,1],目标是达到状态[3,3,3,3]

取n= 4,运行文尾代码:

结果如图:

附python代码:

# -*- coding:utf-8 -*-#返回要改变盘的状态的索引def getindexz(state,x):    index = []    for i in range(len(state)-1,-1,-1):        if state[i]==x:           index.append(i)    return index[0]def hanoi(n,x,y,z,state):     #如果是一盘问题,直接对x位置的盘移动到z      if n ==1:       state[getindexz(state, x)]=z       #打印盘子的状态       print x,'--->',z,state    else:    #两个n-1盘问题,规约    #x位置的n-1盘移动到y       hanoi(n-1, x, z, y,state)       state[getindexz(state, x)]=z       print x,'--->',z,state    #y位置的n-1盘移动到z       hanoi(n-1, y, x, z,state)      n = int(raw_input(u'请输入汉诺塔的层数:'))state =[1 for x in xrange(n)]hanoi(n,1,2,3,state)
0 0
原创粉丝点击