启发式是一种经验法则,它引导我们找到可能的解决方案。人工智能中的大多数问题是指数级的,有许多可能的解决方案。你不知道确切哪些解决方案是正确的,并且检查所有解决方案将会非常昂贵。
因此,使用启发式缩小了寻找解决方案的范围,并消除了错误的选择。使用启发式来引导搜索空间中的搜索的方法称为启发式搜索。启发式技术是非常有用的,因为当你使用它们时,搜索可以被加速。
无信息搜索与有信息搜索的区别
有两种类型的控制策略或搜索技术:无信息搜索和有信息搜索。它们的详细解释如下:
无信息搜索
这也被称为盲搜索或盲控制策略。之所以如此命名是因为只有关于问题定义的信息,而没有其他额外的信息可用。这种类型的搜索技术将在整个状态空间中搜索解决方案。广度优先搜索(BFS)和深度优先搜索(DFS)就是无信息搜索的例子。
有信息搜索
这也被称为启发式搜索或启发式控制策略。之所以如此命名是因为有关于状态的额外信息。这些额外的信息是有用的,用来计算探索和扩展子节点的偏好。每个节点都将有一个与之关联的启发函数。最佳优先搜索(BFS),A*,Mean 和 Analysis 都是有信息搜索的例子。
约束满足问题(CSPs)
约束意味着限制或局限。在人工智能中,约束满足问题是指必须在某些约束条件下解决的问题。在解决此类问题时,重点在于不要违反约束。最终,当我们达到最终解决方案时,约束满足问题必须遵守限制。
通过约束满足解决现实世界的问题
前面的部分讨论了创建约束满足问题。现在让我们也将其应用于现实世界的问题。一些通过约束满足解决的现实世界问题的例子如下:
解决代数关系
借助约束满足问题,我们可以解决代数关系。在这个例子中,我们将尝试解决一个简单的代数关系 a*2 = b。它将在我们定义的范围内返回 a 和 b 的值。
完成这个 Python 程序后,你将能够理解使用约束满足解决问题的基础。
注意,在编写程序之前,我们需要安装名为 python-constraint 的 Python 包。你可以通过以下命令来安装它:
pip install python-constraint
以下步骤展示了用于解决代数关系的 Python 程序:
导入约束包
from constraint import *
创建问题对象
problem = Problem()
定义变量
problem.addVariable('a', range(10))
problem.addVariable('b', range(10))
定义约束条件
problem.addConstraint(lambda a, b: a * 2 == b)
获取解决方案
solutions = problem.getSolutions()
输出结果
print(solutions)
你可以观察到上述程序的输出如下:
[{'a': 4, 'b': 8}, {'a': 3, 'b': 6}, {'a': 2, 'b': 4}, {'a': 1, 'b': 2}, {'a': 0, 'b': 0}]
魔方阵
魔方阵是一种独特的排列方式,其中不同的数字,通常是整数,在一个方形网格中排列,使得每一行、每一列以及对角线上的数字加起来都等于同一个被称为“魔数”的数字。
以下是生成魔方阵的简单 Python 代码的逐步执行:
定义一个名为 magic_square 的函数
def magic_square(matrix_ms):
iSize = len(matrix_ms[0])
sum_list = []
计算列方向上的总和
for col in range(iSize):
sum_list.append(sum(row[col] for row in matrix_ms))
计算行方向上的总和
sum_list.extend([sum(lines) for lines in matrix_ms])
计算对角线方向上的总和
dlResult = 0
for i in range(0,iSize):
dlResult += matrix_ms[i][i]
sum_list.append(dlResult)
drResult = 0
for i in range(iSize-1,-1,-1):
drResult += matrix_ms[i][i]
sum_list.append(drResult)
检查所有方向的总和是否一致
if len(set(sum_list)) > 1:
return False
return True
测试矩阵并检查输出
print(magic_square([[1,2,3], [4,5,6], [7,8,9]]))
你可以观察到输出将是 False,因为总和不是同一个数。
print(magic_square([[3,9,2], [3,5,7], [9,1,6]]))
你可以观察到输出将是 True,因为总和是同一个数,这里是 15。