人工智能导论——搜索问题与技术

第1关:搜索策略

  • 1、

    若将搜索问题看成是走迷宫,搜索空间越大,则迷宫越大

    正确

  • 2、

    常用的搜索策略方式为盲目搜索与启发式搜索

    正确

  • 3、

    下列说法正确的是:B C D

    A、

    搜索问题只专注于能不能得到解

    B、

    广度优先搜索算法属于盲目搜索

    C、

    搜索问题的解可能有多个

    D、

    A*算法属于启发式搜索

第2关:盲目搜索

def PlayMazz(mazz, start, end):

    '''

    走迷宫,从start走到end

    :param mazz: 迷宫

    :param start: 迷宫的起点

    :param end: 迷宫的出口

    '''

    # queue为队列,当队列为空或者当前地点为H时搜索结束

    visited, queue = set(), [start]

    while queue:

        # 从队列中出队,即当前所处的地点

        vertex = queue.pop(0)

        if vertex not in visited:

            visited.add(vertex)

            print(vertex, end='')

            #********* Begin *********#

            if vertex == end:

                return

            #********* Begin *********#

     #当走到出口时结束算法

            # 将当前所处地点所能走到的地点放入队列

            for v in mazz[vertex]:

                if v not in visited:

                    queue.extend(v)

第3关:启发式搜索 - 扫地机器人最短路径搜索

from a_star_utils import Node

def A_star(map, mapSize, start, end):

    '''

    A*算法,从start走到end

    :param map:地图

    :param mapSize:地图大小,例如[10,10]表示地图长10宽10

    :param start:表示出发地,类型为列表,如[1,2]表示出发地为地图中的第1行第2列的方块

    :param end:表示目的地,类型为列表,如[1,2]表示目的地为地图中的第1行第2列的方块

    :return:从出发地到目的地的路径

    '''

    openedList = []

    #********* Begin *********#

    # 获得出发地方块的信息,并将信息保存为node变量

    node = map[start[0]][start[1]]  

    #********* End *********#

    node.distanceFromOri = 0

    node.allDistance = 0

    #********* Begin *********#

    # 将当前方块存到开启列表中

    openedList.append (node)

    node.added = True

    #********* End *********#

    while len(openedList) != 0:

        node = openedList.pop(0)

        node.closed = True

        if node.y == end[0] and node.x == end[1]:

            finalListNeedReverse = []

            while node != None:

                finalListNeedReverse.append(node)

                node = node.parent

            finalListNeedReverse.reverse()

            return finalListNeedReverse

        neighboursList = []

        y = node.y

        x = node.x

        parentDistanceFromOri = node.distanceFromOri

        for needNodey in (y + 1, y, y - 1):

            if needNodey < 0 or needNodey >= mapSize[0]:

                continue

            for needNodex in (x + 1, x, x - 1):

                if needNodex < 0 or needNodex >= mapSize[1]:

                    continue

                needNode = map[needNodey][needNodex]

                if needNode.unable == True or needNode.closed == True or needNode.added == True:

                    continue

                yOffset = needNodey - y

                xOffset = needNodex - x

                allOffset = yOffset + xOffset

                if allOffset == 1 or allOffset == -1:

                    distanceFromOri = parentDistanceFromOri + 1

                else:

                    distanceFromOri = parentDistanceFromOri + 1.4

                if needNode in neighboursList:

                    # 若新的G值比老的G值低,则更新成老的G值

                    if distanceFromOri < needNode.distanceFromOri:

                        needNode.distanceFromOri = distanceFromOri

                else:

                    needNode.distanceFromOri = distanceFromOri

                    neighboursList.append(needNode)

        for needNode in neighboursList:

            needNode.parent = node

            # 更新F值

            needNode.allDistance = needNode.distanceFromOri + needNode.distanceFromDes

            needNode.added = True

            openedList.append(needNode)

        openedList.sort(key=lambda x: x.allDistance)

    return None

第4关:搜索算法应用 - 四皇后问题

def make(mark):

    '''

    标记皇后的位置,例如mark[0] = 2, 表示第1行皇后放在第3列的位置

    :param mark: 皇后的位置信息

    :return: 拼接好的结果

    '''

    #初始化数组

    r = [['X' for _ in range(len(mark))] for _ in range(len(mark))]

    #将每一行中皇后的位置用‘Q’代替

    for i in mark:

        r[i][mark[i]] = 'Q'

    #枚举,将原来散的元素连接成字符串

    for k, v in enumerate(r):

        r[k] = ''.join(v)

    return r

def FourQueens(mark, cur, ret):

    '''

    深度优先搜索的方式求解四皇后问题

    :param mark:表示皇后的位置信息,例如[0,1,3,2]表示棋盘的第1行第1列,第2行第2列,第3行第4列,第4行第3列放置了皇后。例如[1, None, None, None]表示第1行第2列放置了皇后,其他行没有放置皇后。初始值为[None,None,None,None]

    :param cur:表示当前准备在第几行放置皇后,例如`cur=1`时,表示准备在第`2`行放置皇后。初始值为0

    :param ret:表示存放皇后摆放结果的列表,类型为列表。初始值为[]

    :return:无

    '''

    if cur == len(mark):

        #********* Begin *********#

        # 如果当前行是最后一行,记录一个解,并返回结束此次搜索

        ret.append(make(mark))

        return

        #********* End *********#

    #试探处理,将当前行的皇后应该在的位置遍历每一列,如果满足条件,递归调用处理下一行

    for i in range(len(mark)):

        mark[cur], down = i, True

        for j in range(cur):

            # 当想在当前位置放皇后会与其他皇后冲突时不放置皇后

            if mark[j] == i or abs(i-mark[j]) == cur - j:

                down = False

                break

        if down:

            # 准备在下一行找能放置换后的位置

            FourQueens(mark, cur+1, ret)

  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
⼈⼯智能技术导论——博弈树搜索 我在之前整理过⼀篇博客关于博弈论和纳什均衡的⼏个例⼦ 这⾥来介绍博弈树搜索。 ⼀、博弈树的概念 ⼀、博弈树的概念 在博弈过程中, 任何⼀⽅都希望⾃⼰取得胜利。因此,当某⼀⽅当前有多个⾏动⽅案可供选择时, 他总是挑选对⾃⼰最为有利⽽对对⽅最 为不利的那个⾏动⽅案。 此时,如果我们站在A⽅的⽴场上,则可供A⽅选择的若⼲⾏动⽅案之间是"或"关系, 因为主动权操在A⽅⼿⾥,他或 者选择这个⾏动⽅案, 或者选择另⼀个⾏动⽅案, 完全由A⽅⾃⼰决定。当A⽅选取任⼀⽅案⾛了⼀步后,B⽅也有若⼲个可供选择的⾏动⽅案, 此时这些⾏动⽅案对A⽅来说它们之间则是"与"关系,因为这时主动权操在B⽅⼿⾥,这些可供选择的⾏动⽅案中的任何⼀个都可能被B⽅选 中, A⽅必须应付每⼀种情况的发⽣。 这样,如果站在某⼀⽅(如A⽅,即在A要取胜的意义下), 把上述博弈过程⽤图表⽰出来, 则得到的是⼀棵"与或树"。 描述博弈过程的与 或树称为博弈树,它有如下特点:   (1) 博弈的初始格局是初始节点。   (2) 在博弈树中, "或"节点和"与"节点是逐层交替出现的。⾃⼰⼀⽅扩展的节点之间是"或"关系, 对⽅扩展的节点之间是"与"关 系。双⽅轮流地扩展节点。   (3) 所有⾃⼰⼀⽅获胜的终局都是本原问题, 相应的节点是可解节点;所有使对⽅获胜的终局都是不可解节点。 ⼆、极⼩极⼤值分析法 ⼆、极⼩极⼤值分析法 在⼆⼈博弈问题中,为了从众多可供选择的⾏动⽅案中选出⼀个对⾃⼰最为有利的⾏动⽅案, 就需要对当前的情况以及将要发⽣的情况进 ⾏分析,从中选出最优的⾛步。最常使⽤的分析⽅法是极⼩极⼤分析法。 其基本思想是: (1) 设博弈的双⽅中⼀⽅为A,另⼀⽅为B。然后为其中的⼀⽅(例如A)寻找⼀个最优⾏动⽅案。   (2) 为了找到当前的最优⾏动⽅案, 需要对各个可能的⽅案所产⽣的后果进⾏⽐较。具体地说, 就是要考虑每⼀⽅案实施后对⽅可能采取 的所有⾏动, 并计算可能的得分。 (3) 为计算得分,需要根据问题的特性信息定义⼀个估价函数, ⽤来估算当前博弈树端节点的得分。此时估算出来的得分称为静态估值。 (4) 当端节点的估值计算出来后, 再推算出⽗节点的得分, 推算的⽅法是:对"或"节点, 选其⼦节点中⼀个最⼤的得分作为⽗节点的得 分,这是为了使⾃⼰在可供选择的⽅案中选⼀个对⾃⼰最有利的⽅案;对"与"节点, 选其⼦节点中⼀个最⼩的得分作为⽗节点的得分,这是为 了⽴⾜于最坏的情况。这样计算出的⽗节点的得分称为倒推值。 (5) 如果⼀个⾏动⽅案能获得较⼤的倒推值, 则它就是当前最好的⾏动⽅案。 倒推值的计算 在博弈问题中,每⼀个格局可供选择的⾏动⽅案都有很多, 因此会⽣成⼗分庞⼤的博弈树。据统计,西洋跳棋完整的博弈树约有1040个节 点。试图利⽤完整的博弈树来进⾏极⼩极⼤分析是困难的。可⾏的办法是只⽣成⼀定深度的博弈树, 然后进⾏极⼩极⼤分析,找出当前最好的 ⾏动⽅案。在此之后, 再在已选定的分⽀上扩展⼀定深度, 再选最好的⾏动⽅案。如此进⾏下去, 直到取得胜败的结果为⽌。⾄于每次⽣成博 弈树的深度, 当然是越⼤越好, 但由于受到计算机存储空间的限制, 只好根据实际情况⽽定。 例 ⼀字棋游戏。设有如图(a)所⽰的九个空格, 由A, B⼆⼈对弈, 轮到谁⾛棋谁就往空格上放⼀只⾃⼰的棋⼦, 谁先使⾃⼰的棋⼦构成"三⼦ 成⼀线"谁就取得了胜利。 ⼀字棋 设A的棋⼦⽤"a"表⽰, B的棋⼦⽤"b"表⽰。为了不致于⽣成太⼤的博弈树,假设每次仅扩展两层。估价函数定义如下:  设棋局为P,估价函数为e(P)。    (1) 若P是A必胜的棋局, 则e(P)=+ 。   (2) 若P是B必胜的棋局, 则e(P)=- 。  (3) 若P是胜负未定的棋局, 则 e(P)=e(+P)-e(-P) 其中e(+P)表⽰棋局P上有可能使a成为三⼦成⼀线的数⽬; e(-P)表⽰棋局P上有可能使b成为三⼦成⼀线的数⽬。 例如, 对于图(b)所⽰的棋局, 则 按照棋盘上红⾊连线安放棋⼦a使得三⼦成⼀线,共6条连线。 按照棋盘上蓝⾊连线安放棋⼦b使得三⼦成⼀线,共4条连线。 e(P)=6-4=2 另外,我们假定具有对称性的两个棋局算作⼀个棋局。还假定A先⾛棋, 我们站在A的⽴场上。 下图给出了A的第⼀着⾛棋⽣成的博弈树。图中节点旁的数字分别表⽰相应节点的静态估值或倒推值。由图可以看出, 对于A来说最好的⼀着 棋是S3,因为S3⽐S1和S2有较⼤的倒推值。 ⼀字棋极⼩极⼤搜索 在A⾛S3这⼀着棋后,B的最优选择是S4, 因为这⼀着棋的静态估值较⼩,对A不利。不管B选择S4或S5,A都要再次运⽤极⼩极⼤分析法产⽣ 深度为2的博弈树,以决定下⼀步应该如何⾛棋, 其过程与上⾯类似, 不再
人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考 人工智能项目相关代码、系统项目设计文档、使用说明,供参考
### 回答1: 《分布式计算系统导论:原理与组成》是一本介绍分布式计算系统的入门学习资料。本书从系统介绍、原理讲解、组成要素、应用案例等多个方面进行了全面阐述。 首先,本书介绍了分布式计算系统的定义和基本概念。分布式计算系统是一种将任务分散到多个计算节点上进行并行处理的系统,它具有高性能、可靠性、可扩展性等特点。 接着,本书详细解释了分布式计算系统的原理和工作机制。说明了数据分布、并行计算、通信协议等关键技术,并介绍了分布式文件系统、分布式数据库、分布式存储等常用的组成要素。 然后,本书还通过实际应用案例来展示分布式计算系统的实际应用场景和解决问题的能力。例如,分布式计算系统在科学计算、云计算、大数据处理等领域具有广泛的应用。 最后,本书提供了相关教学参考和学习资源,包括习题和参考文献。这些资源对于读者深入理解分布式计算系统的原理和组成具有重要作用。 总之,《分布式计算系统导论:原理与组成》通过简明扼要的方式,全面介绍了分布式计算系统的原理和组成要素,深入浅出地向读者展示了分布式计算系统的基本概念、工作原理和应用案例。这本书对于学习和研究分布式计算系统的人员来说是一本很好的入门资料。 ### 回答2: 《分布式计算系统导论——原理与组成》是一本介绍分布式计算系统的相关原理和组成的书籍。分布式计算系统是指将任务或数据拆分为多个子任务或子数据,并在多个计算节点上进行并行计算和处理的一种系统。本书从理论和实践两方面详细介绍了分布式计算系统的基本原理和构成要素。 在原理方面,本书首先介绍了分布式计算系统的基本概念和发展历程,然后讲解了分布式计算系统的基本原理,包括任务划分与调度、通信与同步、容错与恢复等。这些原理是构建分布式计算系统的基石,对于理解和设计分布式计算系统非常重要。 在组成方面,本书详细讲解了分布式计算系统的各个组成部分。首先介绍了分布式文件系统,它是分布式计算系统的底层支撑,用于存储和管理分布式计算系统的数据。然后介绍了任务管理器和资源调度器,它们负责分配任务和资源给计算节点,确保系统能够高效地完成任务。接着介绍了通信中间件和数据传输协议,它们负责计算节点之间的通信和数据传输。最后介绍了容错和恢复机制,保证系统在节点故障时仍然能够正常运行。 总之,《分布式计算系统导论——原理与组成》是一本深入浅出地介绍分布式计算系统的理论和实践的书籍。通过学习本书,读者可以全面了解分布式计算系统的基本原理,以及构成分布式计算系统的各个组成部分。这将有助于读者在实际应用中设计和搭建高效可靠的分布式计算系统。 ### 回答3: 《分布式计算系统导论——原理与组成》是一本介绍分布式计算系统的教材。该教材主要围绕分布式计算系统的原理和组成展开讲解。 在原理方面,教材首先介绍了分布式计算系统的概念和基本原理。分布式计算系统是由多个计算节点组成的系统,节点之间通过网络进行通信和协作,共同完成任务。教材深入阐述了分布式系统的通信模型、一致性协议、容错原理等重要内容,使读者能够全面了解分布式计算系统的基本原理。 在组成方面,教材详细介绍了分布式计算系统的关键组成部分。其中包括分布式文件系统、分布式数据库、分布式调度器、分布式存储等。针对每个组成部分,教材都给出了其设计思路、实现原理和应用场景等详细信息,帮助读者全面掌握分布式计算系统的搭建和应用。 此外,教材还涉及了分布式计算系统的挑战和趋势。随着信息技术的不断发展,分布式计算系统面临着越来越多的挑战,如数据安全、任务调度等。教材对这些挑战进行了深入的分析,并提供了一些解决方案。同时,教材还展望了分布式计算系统的未来发展趋势,如云计算、边缘计算等,使读者对分布式计算系统的未来有一个清晰的认识。 总的来说,《分布式计算系统导论——原理与组成》通过深入浅出的讲解,帮助读者全面了解分布式计算系统的原理和组成。无论是学习分布式计算系统的初学者还是从事相关工作的专业人士,都能从该教材中获得宝贵的知识和经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Element_南笙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值