第一章 人工智能概述
人工智能研究领域的应用:
- 搜索算法和拼图
- 二人博弈
- 自动推理
- 产生式系统和专家系统
- 细胞自动机
- 神经计算
- 进化计算
- 知识表示
- 不确定性推理
第二章 盲目搜索
2.1 状态空间图
状态空间图(state-space graph)是对一个问题的表示,通过问题表示,分析解的可能的可替代路径。
假币问题
有12枚硬币,已知其中一枚是假的或是伪造的,但是不知道假币是比其他币更轻还是更重。普通的秤可以用于确定任何两组硬币的质量,即一组硬币比另一组硬币更轻或更重。
2.2 生成与测试范式
生成与测试范式(generate-and-test paradigm)。解决问题的直接方法是提出可能的解,然后检查每个提议,查看是否有提议构成了最终解。
n皇后问题
将n个皇后放在n*n的棋盘上,任何两个皇后都不互相攻击。
约束条件为:任何两个皇后都不应该占据相同的行、列或对角线。
n皇后问题-leetcode
class Solution:
def solveNQueens(self, n: int) -> List[List[str]]:
def generateBoard():
board = list()
for i in range(n):
row[queens[i]] = "Q"
board.append("".join(row))
row[queens[i]] = "."
return board
def solve(row: int, columns: int, diagonals1: int, diagonals2: int):
if row == n:
board = generateBoard()
solutions.append(board)
else:
availablePositions = ((1 << n) - 1) & (~(columns | diagonals1 | diagonals2))
while availablePositions:
position = availablePositions & (-availablePositions)
availablePositions = availablePositions & (availablePositions - 1)
column = bin(position - 1).count("1")
queens[row] = column
solve(row + 1, columns | position, (diagonals1 | position) << 1, (diagonals2 | position) >> 1)
solutions = list()
queens = [-1] * n
row = ["."] * n
solve(0, 0, 0, 0)
return solutions
# 作者:LeetCode-Solution
# 链接:https://leetcode-cn.com/problems/n-queens/solution/nhuang-hou-by-leetcode-solution/
2.2.1 回溯
4皇后问题,完全枚举法有1820种方法,每行每列只能放一个皇后,则只有4^4=256种可能。
2.2.2 贪婪算法
贪婪算法(greedy algorithm)是另一种经典搜索算法,先将一个问题分成几个步骤进行操作。贪婪算法总是包含了一个已优化的目标函数。
Dijkstra的最短路径算法
数学中的拟阵(Matroid)理论可以用于识别是否能够成功使用贪婪算法。
2.2.3 旅行销售员问题
旅行销售员问题(Traveling Salesperson Problme,TSP),给定n个顶点,必须找到始于某个顶点,有且只有一次经过图中的每个顶点。
2.3 盲目搜索算法
盲目搜索算法是不使用领域知识的不知情搜索算法:
- 深度优先搜索(DFS)
- 广度优先搜索(BFS)
- 迭代加深(DFS-ID)的深度优先搜索
2.3.1 深度优先搜索
深度优先搜索,每当搜索方法可以选出选择,选择最左(或最右)的分支,通常选择最左分支。
15拼图
2.3.2 广度优先搜索
传教士和食人者(Missionaries and Cannibals)问题