人工智慧 (09) 啟發式搜尋

Jason990420發表於2019-12-22

檔案建立日期: 2019/12/22
最後修訂日期: None
相關軟體資訊:

Win 10 Python 3.7.2 Python-constraint 1.4.0

參考檔案: AI with Python Tutorial

說明: 所有內容歡迎引用, 只需註明來源及作者, 本文內容如有錯誤或用詞不當, 敬請指正.

標題: 人工智慧 (09) 啟發式搜尋

啟發式搜尋 ( Heuristic Search )

試探法的使用縮小了對解決方案的搜尋範圍,並消除了錯誤的選擇。 使用啟發式在搜尋空間中進行搜尋的方法稱為啟發式搜尋。

控制策略或搜尋技術

  1. 盲目搜尋 - 搜尋整個狀態空間以獲得解決方案。廣度優先搜尋(BFS, Breadth First Search)和深度優先搜尋(DFS, Depth First Search)是無資訊搜尋的示例。
  2. 啟發式搜尋 - 有一些關於狀態的額外資訊。此額外資訊對於計算要探索和擴充套件的子節點之間的偏好很有用。最佳優先搜尋(BFS, Best First Search),A*,均值和分析 ( Mean and Analysis ) 是啟發式搜尋的示例。
  3. 限制滿足問題(CSP, Constraint Satisfaction Problems ) - 必須在某些限制下解決的問題。

例 1. 限制滿足

# -----------------------------------------------------------------------------
# Constraint Satisfaction Problems (CSPs)
# -----------------------------------------------------------------------------

from constraint import *

problem = Problem()
problem.addVariable('a', range(10))             # a = 0 ~ 9
problem.addVariable('b', range(10))             # b = 0 ~ 9
problem.addConstraint(lambda a, b: a * 2 == b)  # 條件: 2a = b
solutions = problem.getSolutions()              # 解題 - 答案: (0,0), (1,2),
print (solutions)                               # (2,4), (3,6), (4,8)

例 2. 魔方 (行, 列, 對角線, 反對角線和都是一樣的矩陣)

# -----------------------------------------------------------------------------
# Magic Number
# -----------------------------------------------------------------------------

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(0,iSize):                                # 反對角線加總
        drResult +=matrix_ms[i][iSize-1-i]
    sum_list.append(drResult)
    if len(set(sum_list))>1:                                # 去掉重複的長度
        return False                                        # 如果不是1, 表示
    return True                                             # 八條線的和不一樣

print(magic_square([[1,2,3],
                    [4,5,6],
                    [7,8,9]]))

print(magic_square([[4,9,2],
                    [3,5,7],
                    [8,1,6]]))
本作品採用《CC 協議》,轉載必須註明作者和本文連結
Jason Yang

相關文章