美文网首页
爬山法实践

爬山法实践

作者: Nagi | 来源:发表于2017-12-17 16:41 被阅读13次

人工智能将搜索定义为:从初态开始,找到一系列步骤,通过一组中间的搜索状态,到达预定义的终态。

以9宫格数字滑块拼图为例:

  • 运算符就是每次可选的动作,即上下左右移动滑块;

  • 评估函数,就是离完成目标还有多少距离;

  • 终止标准,接近目标到一定程度,或者完成目标,或者行动步数、时间超过一定程度。

  • 初始评估函数1,简单为离终态的累计滑动数量之和。在例子中,需要219步才能完成。

  • 评估函数2,增加了数字加权,权值大优先滑动,优化后需要34步完成。

import copy;

#finalStatus = [[1, 2, 3], [4, 5, 6], [7, 8, 0]]
finalStatus = [[1, 2, 3], [8, 0 , 4], [7, 6, 5]]

def distance1(number, line, index):
    distancef = 0
    for linef in range(len(finalStatus)):
        for indexf in range(len(finalStatus[linef])):
            numberf = finalStatus[linef][indexf]
            if numberf == number:
                distancef = abs(line - linef) + abs(index - indexf)
                break
        if distancef > 0:
            break
    return distancef

def judgement1(status):
    length = 0
    for line in range(len(status)):
        for index in range(len(status[line])):
            number = status[line][index]
            if number != 0 and finalStatus[line][index] != number:
                length = length + distance1(number, line, index)
    return length


def distance2(number, line, index):
    distancef = 0
    for linef in range(len(finalStatus)):
        for indexf in range(len(finalStatus[linef])):
            numberf = finalStatus[linef][indexf]
            if numberf == number:
                if number == 1:
                    distancef = (abs(line - linef) + abs(index - indexf)) * 10
                elif number == 2 or number == 3:
                    distancef = (abs(line - linef) + abs(index - indexf)) * 5
                elif number == 4 or number == 5:
                    distancef = (abs(line - linef) + abs(index - indexf)) * 2
                else:
                    distancef = abs(line - linef) + abs(index - indexf)
                break
        if distancef > 0:
            break
    return distancef

def judgement2(status):
    length = 0
    for line in range(len(status)):
        for index in range(len(status[line])):
            number = status[line][index]
            if number != 0 and finalStatus[line][index] != number:
                length = length + distance2(number, line, index)
    return length



def new_status_from(status):
    status_list = []
    for line in range(len(status)):
        for index in range(len(status[line])):
            number = status[line][index]
            if number == 0:
                if line != 0:
                    status_t = copy.deepcopy(status)
                    status_t[line][index] = status[line - 1][index]
                    status_t[line - 1][index] = 0
                    status_list.append(status_t)
                if line != 2:
                    status_t = copy.deepcopy(status)
                    status_t[line][index] = status[line + 1][index]
                    status_t[line + 1][index] = 0
                    status_list.append(status_t)
                if index != 0:
                    status_t = copy.deepcopy(status)
                    status_t[line][index] = status[line][index - 1]
                    status_t[line][index - 1] = 0
                    status_list.append(status_t)
                if index != 2:
                    status_t = copy.deepcopy(status)
                    status_t[line][index] = status[line][index + 1]
                    status_t[line][index + 1] = 0
                    status_list.append(status_t)
                break
    return status_list


listTemp = []
listSeen = []

def is_new_move(status):
    if status in listSeen:
        return False
    else:
        return True


#beginStatus = [[4, 3, 2], [1, 6, 5], [8, 0, 7]]
beginStatus = [[0, 2, 1], [6, 7, 4], [3, 8, 5]]

listTemp.append(beginStatus)
while len(listTemp) > 0:
    print len(listSeen)
    status0 = listTemp[0]
    print status0[0]
    print status0[1]
    print status0[2]
    length = judgement1(status0)
    print length
    print '----------'
    if length <= 0:
        break
    else:
        listSeen.append(status0)
        listTemp.pop(0)
        status_list = new_status_from(status0)
        status_list = filter(is_new_move, status_list)
        for status in status_list:
            listTemp.append(status)
        listTemp = sorted(listTemp, key=lambda status: judgement2(status), reverse=False)

相关文章

  • 爬山法实践

    人工智能将搜索定义为:从初态开始,找到一系列步骤,通过一组中间的搜索状态,到达预定义的终态。 以9宫格数字滑块拼图...

  • 2020-12-25

    人工智能: 首选爬山法(盲目爬山法): 见坡就上,但凡有比现在好的邻居结点,则立即过渡为邻居结点,不进行更多相邻的...

  • 今日不同往日

    心境真的不一样了,从上次爬山到今天爬山,再来法喜整个心境都不一样。 现在很好。

  • 日常健脾的八个方法

    日常健脾最理想的八个方法:揉带脉、爬山、踮足功、推腹法、跪膝法、捏脊法、吞唾液养生法、拉筋;健脾的食物有:粳米、籼...

  • 《普通心理学》2019-08-26

    三、问题解决中的策略 (一)算法 (二)启发法 ①手段——目的分析 ②逆向搜索 ③爬山法 **影响问题解决的因素 ...

  • 2018-11-24

    在路上 酝酿已久的爬山徒步今天实践了,在龙潭已两个月了,豹舍背靠着大山,出门就可以登山赏景,爬山的地理优势可...

  • 教学方法大全

    四大分类: (1)以语言为主的方法,如讲授法、谈话法、读书指导法等。(2)以实践为主的方法,如实验法、练习法、任务...

  • 这才是帮助好朋友的正确打开方式?

    真正的度人,是怎么样一番景象? 拿佛法,或者拿其他的法是不能度人的。只有亲身实践了佛法或者其他什么法,并且实践成功...

  • 【向优秀学习】认识自我的5种方法

    认识自我的5种方法:比较法、他人评价法、内省法、实践成果法以及测量法。 人是比较复杂的动物,因为有思想。我们很容易...

  • day 1

    实践并不是检验真理的唯一方法。

网友评论

      本文标题:爬山法实践

      本文链接:https://www.haomeiwen.com/subject/qmikwxtx.html