人工智能第三版第二章讨论题和练习题

1.搜索为什么是 AI 系统的重要组成部分?

因为搜索在信息获取、智能决策、知识发现与推进、人机交互和智能推荐等方面有着重要的作用,促进了AI技术的发展和应用。

2.状态空间图是什么?

状态空间图(State Space Diagram)是一种图形化的表示方法,用于描述问题的状态和状态之间的转换关系。它是强调问题的状态和状态转移的固有特性,常用于解决搜索、规划和决策等问题。
状态空间图是一个有向图,其中节点表示系统或问题的状态,边表示状态之间的转换。每个节点代表一个特定的状态,而边表示从一个状态到另一个状态的转换。转换可以由某些操作或规则触发,也可以是随时间的推移而自动发生。
通过定义合适的状态和转换规则,状态空间图能够帮助我们可视化和理解问题的状态空间,以及在该空间中如何进行搜索和决策。它可以用于各种人工智能问题,如路径规划、推理问题、机器学习和决策论等,帮助我们设计和分析算法、优化问题求解过程,并使得问题的解决更加可行和高效。
状态空间图在人工智能中通常与搜索算法结合使用,如深度优先搜索、广度优先搜索、A*算法等,以发现最优解或满足特定目标的解决方案。通过利用状态空间图和搜索算法的结合,可以为人工智能系统提供决策支持、规划路径、推理和问题求解等功能。

3.描述生成-测试范式。

生成-测试范式(generate-and-test paradigm)是一种常见的问题求解方法,也被称为穷举搜索。它的基本思想是通过生成候选解,并对每个候选解进行测试和评估,最终找到满足特定条件的解决方案。
生成-测试范式通常适用于问题的解空间较小且可以穷举的情况。以下是生成-测试范式的一般步骤:
1.生成:根据问题的要求和约束,生成一系列候选解。这些候选解可能是问题中涉及的选项、状态、变量的组合,或者是可能的决策序列等。
2.测试:对每个生成的候选解,对其进行测试或评估,以确定它是否满足特定的目标或约束条件。测试方法可以根据问题的性质和要求而有所不同。测试过程可能涉及数学计算、逻辑推理、模型训练等。
3.评估:根据测试结果,对每个候选解进行评估,通常使用某种评价函数或指标来衡量解的质量。这些评价函数可以是最小化或最大化目标函数、满足约束条件的程度等。
4.选择:从生成的候选解中选取满足特定条件的最优解,通常是基于评估结果。最优解可以是满足特定准则或具有最高评分的解,在某些情况下还可以有多个最优解。
5.终止条件:在某些情况下,可以设置终止条件,比如找到一个满足条件的解就终止搜索。或者,可以设置搜索的时间、资源或步数限制。
综上,生成-测试范式的优点在于简单直观,适用于小规模问题或解空间可穷举的情况。然而,它的缺点是在解空间较大时,穷举搜索的代价很高。为了应对解空间庞大的问题,可以结合其他优化策略,如剪枝、启发式搜索等,来提高搜索效率。

4.生成器有什么属性?

什么属性呢??很多吧

1.数据生成:生成器能够生成数据的序列或流,这在机器学习和深度学习中特别有用。生成器可以按需生成数据样本,而不需要一次性将所有数据加载到内存中,从而节省内存资源。
2.延迟计算:生成器采用延迟计算的方式,只有在需要时才生成数据。这对于处理大规模数据集或无限序列数据非常有效,可以节省计算资源和时间。
3.内存效率:由于生成器不需要一次性存储所有数据,而是逐步生成和提供数据,因此在内存利用方面非常高效。这对于处理大规模数据集或限制内存的环境尤其重要。
4.可迭代性:生成器是可迭代对象,在循环中可以依次访问它们生成的数据。这使得生成器可以方便地与其他模型组件(如神经网络模型)配合使用。
5.状态保持:生成器在生成过程中可以保持状态,这允许它们记住先前的状态并基于它产生下一个值。这对于生成与先前生成的数据相关的序列或流非常重要。
6.无限生成:生成器可以生成无限数量的数据,例如,生成图像、音频或文本数据的模型。它们可以持续生成新的数据样本,直到被手动中止。
7.可扩展性:生成器可以根据需要进行扩展和定制。可以根据问题的特定需求,设计和实现自定义的生成器函数,以生成符合特定要求的数据序列。
8.异步处理:生成器可以与异步编程结合使用,以异步地生成和处理数据。这对于处理实时数据流或网页爬虫等任务非常有用。
综上所述,生成器在人工智能领域中具有数据生成、延迟计算、内存效率、可迭代性、状态保持、无限生成、可扩展性和异步处理等属性,为处理大规模数据集、延迟计算和实时数据流等场景提供了强大的能力。

5.回溯法如何对完全枚举法进行改进?

完全枚举法搜索空间过大,以及效率太低,,所以改进点关注于减少搜索空间和提高效率。

下是回溯法如何对完全枚举法进行改进的几个方面:
1.剪枝策略:回溯法可以通过在搜索过程中应用剪枝策略,即提前终止不满足条件的搜索路径,从而避免不必要的计算和进一步搜索。剪枝可以基于问题的特性、限定条件、约束等进行,以减少搜索的时间和空间复杂度。
2.排序和优先级:回溯法可以通过在生成候选解之前对可能的选择进行排序或设置优先级,使得有更高概率找到满足条件的解,从而减少搜索的深度和宽度。通过选择合适的排序指标,可以将更有希望的解放在较早的搜索阶段。
3.双向搜索:回溯法可以采用双向搜索的策略,即同时从初始状态和目标状态出发进行搜索。通过从两个方向逐步逼近,可以减少搜索空间的规模,提高搜索效率。
4.约束传播:回溯法可以借助约束传播的技术,利用问题的约束信息缩小搜索空间。通过维护变量的可行值域,剔除不满足约束条件的值,可以减少搜索范围并加速求解过程。
5.记忆化搜索:回溯法可以通过记忆化搜索技术,在搜索过程中缓存已经计算的结果,避免重复计算。这种技术可以极大地提高搜索的效率,特别是在具有重叠子问题的情况下。
总的来说,回溯法通过剪枝策略、排序和优先级、双向搜索、约束传播以及记忆化搜索等技术,对完全枚举法进行改进,以减少搜索空间、提高效率和加速求解过程。这些改进方法可以根据具体问题的特性和约束条件进行灵活应用,从而更高效地获得满足条件的解。

6.用一两句话描述贪心算法。

贪心算法是一种以局部最优选择来构建解决方案的算法,每一步都选择当前最佳的选项,不考虑其对后续步骤的影响,以期望达到全局最优解。陈述旅行商问题。

7.陈述旅行商问题.

旅行商问题是一个经典的组合优化问题,要求在给定一组城市和它们之间的距离时,找到一条最短路径,使得旅行商可以恰好访问每个城市一次,最后回到出发点。

8.简述 3 种盲目搜索算法。

1.广度优先搜索(BFS):BFS从起始节点开始,逐层地向外扩展搜索,直到找到目标节点或搜索无果。它通过维护一个队列来实现,先搜索当前节点的所有邻居,再搜索邻居的邻居,以此类推。BFS保证能够找到最短路径,但是空间复杂度较高。

2.深度优先搜索(DFS):DFS从起始节点开始,一直沿着路径向前搜索,直到达到目标节点或无法继续前进。它通过维护一个栈(或递归调用栈)来实现,先探索最深的路径,直到达到最大深度或找到目标。DFS的空间复杂度较低,但不保证找到最短路径。

3.深度优先搜索-迭代加深(DFS-ID):DFS-ID结合了深度优先搜索和迭代加深的概念。它使用深度优先搜索的思想,在每一轮搜索中限制深度,并逐渐增加深度的限制。首先,从初始节点开始,以初始深度为限制进行搜索。如果找不到目标节点,就增加深度限制并重新进行搜索,直到找到目标节点为止。DFS-ID的优点是不需要额外的存储空间来存储搜索过程中的状态,且能够逐渐扩大搜索范围。但对于具有无限深度的搜索空间来说,DFS-ID并不适用,因为最终会耗尽可用的深度限制。

这三种盲目搜索算法各有特点,在不同问题和场景下有着不同的应用。BFS适用于需要找到最短路径的情况,DFS适用于空间有限但不关心最短路径的情况,而DFS-ID则在空间受限的情况下,通过迭代加深的方式探索更深的节点。

9.在何种意义上,盲目搜索算法是盲目的?

如果在搜索过程中依赖问题特定知识或启发知识的时候,这个时候盲目搜索算法只是按照预订策略进行搜索,我感觉这个时候就会体现出其“盲目性”

10.按照完备性、最优性和时空复杂性,比较本章描述的 3 种盲目搜索算法。

完备性
BFS:BFS是一种完备的搜索算法,当搜索空间是有限的情况下,它能够找到目标节点(如果存在)。
DFS:DFS的完备性取决于搜索空间的特性。如果搜索空间是有限的且不存在环路,DFS可以找到目标节点。然而,在无限搜索空间或存在环路的情况下,DFS可能无法找到目标节点。
DFS-ID:DFS-ID在有限的搜索空间中是完备的,由于使用迭代加深策略,它能够找到目标节点(如果存在)。
最优性:
BFS:BFS能够找到最短路径,因此具有最优性。
DFS:DFS不能保证找到最短路径,因此不具备最优性。
DFS-ID:DFS-ID通过逐渐增加深度限制来搜索,可以在每次搜索中找到较短的路径,但仍然不能保证找到最短路径。
时空复杂性:
BFS:BFS的时间复杂度为O(V+E),其中V是节点数,E是边数。空间复杂度取决于存储所有节点和边的数据结构,通常是O(V)。
DFS:DFS的时间复杂度取决于搜索的深度和分支因子,通常是O(b^d),其中b是分支因子,d是最大深度。空间复杂度取决于递归栈的最大深度,通常是O(d)。
DFS-ID:DFS-ID的时间复杂度介于DFS和BFS之间,取决于最大深度限制。空间复杂度与DFS类似,通常是O(d)。
综合而言,BFS具有完备性和最优性,但空间复杂度较高;DFS具有完备性和较低的空间复杂度,但不具备最优性;DFS-ID具有完备性和较低的空间复杂度,但在搜索空间较大且没有深度限制的情况下,仍然可能无法找到最优解。

11.在什么情况下,DFS 比 BFS 好?

DFS比BFS更好的情况是在解空间广泛且空间限制较低的问题中,或者当问题只需要找到任意解而不需要最短路径或最优解时。

12.在什么情况下,BFS 比 DFS 好?

BFS比DFS更好的情况是在需要找到最短路径或最优解的问题中,或者在图中存在较短的路径时。此外,如果问题的解分布比较均匀或存在较少的解,BFS通常比DFS更为适用。

13.在什么意义上,可以说 DFS-ID 是 BFS 和 DFS 的折中?

DFS-ID可以被视为BFS和DFS的折中,因为它综合了两种算法的优点。DFS-ID使用深度优先搜索的思想,通过增加深度限制的方式逐渐扩展搜索范围,从而在空间有限的情况下完成搜索。这使得DFS-ID具有较低的空间复杂度,与DFS类似。同时,DFS-ID也能保证在有限深度内找到解,类似于BFS的完备性。因此,DFS-ID在时间和空间复杂度之间达到了一种平衡,提供了一种较为综合的搜索方法。

练习题

1.在只允许称重 3 次的情况下,求解 12 枚硬币的假币问题。回忆一下,天平可以返回以 下 3 种结果之一:相等、左侧轻或左侧重。.

首先,将这12枚硬币平均分成3组,每组4枚硬币。
步骤1:先称量两组硬币,可以得到以下三种结果:
如果两组硬币的重量相等,说明假币在第三组中。
如果其中一组硬币比另一组重,说明假币在较重的那组中。
如果其中一组硬币比另一组轻,说明假币在较轻的那组中。
步骤2:将第三组中的4枚硬币继续平分成两组,每组2枚硬币。
步骤3:使用天平称量这两组硬币,可以得到以下三种结果:
如果两组硬币的重量相等,说明假币是第三组中未称重的两枚硬币中的一枚。
如果其中一组硬币比另一组重,说明假币是较重的那组硬币中的一枚。
如果其中一组硬币比另一组轻,说明假币是较轻的那组硬币中的一枚。
 

2.在只称重两次的情况下,求解微型假币问题或证明这是不可能的。

在只允许称重两次的情况下,解决微型假币问题是不可能的,下面我来进行证明。假设有n枚硬币,其中只有一枚是假币。我们需要确定这枚假币是轻还是重。在第一次称重时,我们将n枚硬币分成两组,每组数量尽可能相等。我们将一组放在天平的左侧,另一组放在右侧,剩下的一枚放在一边。根据题设,天平可以返回以下三种结果之一:相等、左侧轻或左侧重。

情况1:如果天平显示两侧重量相等,那么假币必然在剩下的一枚硬币中,且我们并不知道它是轻还是重。由于我们只有一次称重的机会,无法确定。

情况2:如果天平显示左侧重,那么假币要么是左侧的一组硬币中的一枚,要么是右侧的一组中的一枚。
如果我们将左侧的硬币分成两组平分称重,我们最多只能确定假币在其中一组中,但无法确定它是轻还是重。
同样的,如果我们将右侧的硬币分成两组平分称重,也只能确定假币在其中一组中,但无法确定它是轻还是重。
无论我们如何划分分组,我们都无法在第一次称重结果中确定假币是轻还是重。

由此可见,在只允许称重两次的情况下,解决微型假币问题是不可能的。我们至少需要进行三次称重才能确定假币的轻重。

3.非确定性搜索(nondeterministic search)是本章未讨论的一种盲目搜索方法。在这种搜索 中,刚刚扩展的子节点以随机顺序放在开放表中。请判断非确定性搜索是否完备以及是否最优。

非确定性搜索不是完备的,因为在非确定性环境中,无法保证一定能够找到解决方案。即使存在解决方案,也无法保证搜索算法能够找到它。
非确定性搜索也不是最优的,因为在非确定性环境中,无法保证找到的解决方案是最优的。由于无法预测环境的变化和结果,搜索算法可能会得到次优解甚至是错误的解。

4.n 皇后问题的另一个生成器如下:第一个皇后放在第一行,第二个皇后不放在受第一个 皇后攻击的任何方格中。在状态 i,将第 i 列的皇后放在未受前面(i−1)个皇后攻击的方格中, 如图 2.34 所示。

(a)使用这个生成器求解 4 皇后问题。

,使用该生成器,一个可能的解如下图所示

 

(b)证明这个生成器比文中使用的两个生成器拥有更多的信息。

在这个生成器中,每个皇后只能放在未受前面所有皇后攻击的方格中,这就限制了后续皇后的可选范围。这种限制性的规则提供了更多的信息,从而减少了搜索空间,使搜索更加高效。

(c)画出搜索第一个解时在搜索树中展开的部分。

  

5.思考下列 4 皇后问题的生成器:从 i=1 到 i=4,随机地分配皇后 i 到某一行。这个生成器 完备吗?非冗余吗?解释你的答案。

(1) 这个生成器不完备,因为它只是随机地分配皇后到某一行,而没有考虑到皇后之间的攻击冲突。因此,生成的解可能会存在皇后之间相互攻击的情况,这样的解是无效的。

(2) 这个生成器也是冗余的。因为它是随机地分配皇后到某一行,可能会生成相同的解多次。这些相同的解在搜索过程中会被多次尝试,从而浪费时间和资源。
为了解决4皇后问题,一个更加有效的生成器是基于回溯算法的,在每一行依次尝试将皇后放在不受攻击的方格中。这个生成器是完备的,因为它会考虑所有可能的放置方式,并且保证不会存在皇后之间的攻击冲突。这种生成器在搜索过程中不会出现重复的解,因此也是非冗余的。

6.如果一个数等于其因数(不包括这个数本身)的和,则称这个数是完美数。例如,6 是 完美数,因为 6 = 1 + 2 + 3,其中整数 1、2 和 3 都是 6 的因数。给出你所能想到的拥有最多信息 的生成器,使用这个生成器,可以找到 1 和 100 之间(包括 1 和 100在内)的所有完美数。

我们可以使用以下的算法来找到1到100之间的所有完美数:
对于每个数字n从1到100:
初始化和sum为0。
对于每个可能的因数i从1到n-1:
如果i是n的因数,将其加入sum中。
如果sum等于n,说明n是一个完美数。
使用这个生成器,我们可以找到1到100之间的所有完美数。

7.使用 Dijkstra 算法找到从源顶点 V0到所有其他顶点的最短路径,如图 2.35 所示

1.到 ( V1 ) 的最短路径距离为 ( 4 )
2.到 ( V2 ) 的最短路径距离为 ( 9 )
3.到 ( V3 ) 的最短路径距离为 ( 6 )
4.到 ( V4 ) 的最短路径距离为 ( 11 )

 

8.创建拼图(如 15 拼图)的表示以适合检查重复状态。

一个15拼图可以表示为一个4x4的矩阵,其中每个元素表示一个拼图的数字,空格用0表示。例如:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0

这样的表示可以用一个二维数组来存储。在检查重复状态时,可以将这个二维数组转换成一个字符串,然后将这个字符串作为状态的标识符。例如,上面的拼图可以表示为字符串"1234567891011121314150"。通过比较这些字符串,就可以检查拼图状态是否重复。

9.使用广度优先搜索求解传教士与野人问题。

from collections import deque

class State:
    def __init__(self, missionaries, cannibals, boat, parent):
        self.missionaries = missionaries
        self.cannibals = cannibals
        self.boat = boat
        self.parent = parent

    def is_valid(self):
        if self.missionaries < 0 or self.missionaries > 3 or self.cannibals < 0 or self.cannibals > 3:
            return False
        if self.missionaries < self.cannibals and self.missionaries > 0:
            return False
        if 3 - self.missionaries < 3 - self.cannibals and 3 - self.missionaries > 0:
            return False
        return True

    def is_goal(self):
        return self.missionaries == 0 and self.cannibals == 0 and self.boat == 0

    def __eq__(self, other):
        return self.missionaries == other.missionaries and self.cannibals == other.cannibals and self.boat == other.boat

    def __hash__(self):
        return hash((self.missionaries, self.cannibals, self.boat))

def successors(state):
    children = []
    if state.boat == 1:
        for x in range(3):
            for y in range(3):
                if x + y > 0 and x + y <= 2:
                    new_state = State(state.missionaries - x, state.cannibals - y, 0, state)
                    if new_state.is_valid():
                        children.append(new_state)
    else:
        for x in range(3):
            for y in range(3):
                if x + y > 0 and x + y <= 2:
                    new_state = State(state.missionaries + x, state.cannibals + y, 1, state)
                    if new_state.is_valid():
                        children.append(new_state)
    return children

def breadth_first_search():
    initial_state = State(3, 3, 1, None)
    if initial_state.is_goal():
        return initial_state
    frontier = deque([initial_state])
    explored = set()
    while frontier:
        state = frontier.popleft()
        if state.is_goal():
            return state
        explored.add(state)
        for child in successors(state):
            if child not in explored and child not in frontier:
                frontier.append(child)
    return None

def print_solution(solution):
    path = []
    while solution is not None:
        path.append((solution.missionaries, solution.cannibals, solution.boat))
        solution = solution.parent
    path.reverse()
    for i, p in enumerate(path):
        print(f"Step {i}: Missionaries={p[0]}, Cannibals={p[1]}, Boat={p[2]}")

solution = breadth_first_search()
print_solution(solution)

10.在河的西岸,一个农夫带着一匹狼、一只山羊和一篮子卷心菜(参见图 2.0)。河上有 一艘船,可以装下农夫以及狼、山羊、卷心菜三者中的一个。如果留下狼与羊单独在一起,那 么狼会吃掉羊。如果留下羊与卷心菜单独在一起,那么羊会吃掉卷心菜。现在的目标是将它们 都安全地转移到河的对岸。请分别使用以下搜索算法解决上述问题:

(a)深度优先搜索;

步骤如下

①将当前状态设为起始状态,河的西岸。
②检查当前状态是否为目标状态,即农夫、狼、山羊和卷心菜都在河的对岸。
③如果是目标状态,返回找到的路径并结束搜索。
④如果不是目标状态,继续下一步。
⑤对于当前状态的每个可能的动作(将农夫与一只动物或卷心菜一起过河):
⑥检查该动作是否导致状态无效(狼与山羊单独在一起,或者羊与卷心菜单独在一起)。
⑦如果是无效状态,放弃该动作。
⑧如果是有效状态,将该动作应用于当前状态,得到新状态。
⑨如果新状态已经在先前的路径中出现过,放弃该状态以避免循环。
⑩如果新状态是新的有效状态,将其添加到路径中,并递归地继续搜索。
如果没有找到安全路径,返回无解。
使用深度优先搜索,我们将尝试所有的可能路径,直到找到安全路径或无法继续搜索为止。

(b)广度优先搜索。

步骤1:初始化队列,将初始状态(农夫、狼、羊、卷心菜都在西岸)加入队列。
步骤2:从队列中取出一个状态,尝试所有可能的移动方式,生成新的状态。
步骤3:将生成的新状态加入队列。
步骤4:重复步骤2和3,直到找到一个状态,其中农夫、狼、羊、卷心菜都在东岸,且满足题目给出的条件。

11.首先使用 BFS,然后使用 DFS,从图 2.36(a)和图 2.36(b)的起始节点 S 开始,最 终到达目标节点 G。其中每一步都按照字母表顺序浏览节点。

①使用 BFS 的步骤如下:

1.将起始节点 S 放入队列中。

2.从队列中取出节点 S,并访问它的相邻节点(按字母表顺序),如 C 和 D。

3.将 C 和 D 放入队列。

4.重复此过程,直到找到目标节点 G。

②使用 DFS 的步骤如下:

1.访问起始节点 S。
2.从 S 开始,按字母表顺序深入探索(如先访问 C),沿途访问节点。
3.如果到达分支末端,向上回溯并探索其他分支。
4.重复此过程,直到找到目标节点 G。

12.标记图 2.37 所示的迷宫。

13.对于图 2.37 所示的迷宫,先使用 BFS,再使用 DFS,从起点处开始走到目标处。 图 2.36 使用 BFS 和 DFS 到达目标节点 图 2.37 迷宫

14.我们已经确定,12 枚硬币的假币问题需要对 3 组硬币进行称重才能确定假币。那么在 15 枚硬币中,需要称重多少次才可以确定假币?20 枚硬币时又会怎么样?请开发出一种算法来 证明自己的结论。 提示:可以先考虑 2~5 枚硬币所需的基本称量次数,从而开发出事实知识库,自底向上得 到这个问题的解。

为了确定 15 枚硬币中的假币,我们需要称重 4 次。
我们可以按照以下步骤来证明:

1.首先,将 15 枚硬币分成 3 组,每组 5 枚硬币。
2.对这 3 组硬币进行称重。
3.如果有一组硬币的重量与其他两组不同,那么这组硬币中一定有假币。
4.如果三组硬币的重量都相同,那么假币一定在剩下的 5 枚硬币中。
5.将剩下的 5 枚硬币分成 2 组,每组 3 枚硬币和 2 枚硬币。
6.对这 2 组硬币进行称重。
7.如果有一组硬币的重量与另一组不同,那么这组硬币中一定有假币。
8.如果两组硬币的重量都相同,那么假币一定在剩下的 2 枚硬币中。
9.将剩下的 2 枚硬币进行称重,即可确定哪一枚是假币。
因此,总共需要 4 次称重才能确定 15 枚硬币中的假币。
对于 20 枚硬币的情况,我们可以按照以下步骤来证明:
1.首先,将 20 枚硬币分成 4 组,每组 5 枚硬币。
2.对这 4 组硬币进行称重。
3.如果有一组硬币的重量与其他三组不同,那么这组硬币中一定有假币。
4.如果四组硬币的重量都相同,那么假币一定在剩下的 5 枚硬币中。
5.将剩下的 5 枚硬币分成 2 组,每组 3 枚硬币和 2 枚硬币。
6.对这 2 组硬币进行称重。
7.如果有一组硬币的重量与另一组不同,那么这组硬币中一定有假币。
8.如果两组硬币的重量都相同,那么假币一定在剩下的 2 枚硬币中。
9.将剩下的 2 枚硬币进行称重,即可确定哪一枚是假币。
因此,总共需要 5 次称重才能确定 20 枚硬币中的假币。

一般来说,对于 n 枚硬币,我们需要称重的次数为 log2(n) + 1。

我们可以用数学归纳法来证明这个结论:

1.当 n = 2 时,我们需要称重 1 次即可确定假币。
2.假设对于 n = k 时,我们需要称重 log2(k) + 1 次即可确定假币。
3.对于 n = k + 1 时,我们可以将这 k + 1 枚硬币分成 2 组,每组 k/2 枚硬币和 k/2 + 1 枚硬币。
4.对这 2 组硬币进行称重。
5.如果有一组硬币的重量与另一组不同,那么这组硬币中一定有假币。
6.如果两组硬币的重量都相同,那么假币一定在剩下的 k/2 + 1 枚硬币中。
7.根据归纳假设,对于 k/2 + 1 枚硬币,我们需要称重 log2(k/2 + 1) + 1 次即可确定假币。
8.因此,对于 n = k + 1 枚硬币,我们需要称重 log2(k/2 + 1) + 1 + 1 = log2(k + 1) + 1 次即可确定假币。
9.因此,对于 n 枚硬币,我们需要称重的次数为 log2(n) + 1。

15.我们讨论了传教士与野人问题。假定“移动”或“转移”是强行(受迫)的,找出这个问 题的一个解。确定问题解决状态的“子目标状态”,我们必须获得这个状态,才能解决这个问题。

在传教士与野人问题中,移动传教士和野人的过程必须遵守以下规则:
在每个岸边,传教士的数量不能超过野人的数量,否则传教士将会被野人杀害。
在每个岸边,无论是起始岸还是目标岸,都必须保持传教士和野人的数量大于等于0,否则某一方将会被灭绝。
为了找出问题的一个解,我们可以使用搜索算法,如深度优先搜索或广度优先搜索。通过搜索所有可能的移动序列,我们可以找到一个符合上述规则的状态序列,从起始状态到目标状态。
在搜索算法中,我们可以将以下子目标状态(局部目标)定义为必须达到的状态:
传教士和野人都在起始岸,没有人在目标岸。
传教士和野人的数量在每个岸边都符合规则要求。
传教士和野人都安全到达目标岸。
通过移动传教士和野人,我们可以依次达到这些子目标状态,直到最终到达目标状态,即所有的传教士和野人都安全到达目标岸。
需要注意的是,即使使用搜索算法找到一个解,也并不代表是问题的唯一解。传教士与野人问题存在多个解,取决于起始状态和目标状态的设置。

  • 28
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值