啟發式搜索在人工智慧中起著關鍵作用。在本章中,您將詳細了解它。
Concept of Heuristic Search in AI
啟發式是一條經驗法則,它引導我們找到可能的解決方案。人工智慧中的大多數問題都是指數性質的,並且有許多可能的解決方案。你不知道哪些解決方案是正確的,檢查所有的解決方案將是非常昂貴的。
因此,啟發式的使用縮小了對解決方案的搜索範圍,並消除了錯誤的選項。在搜索空間中用啟發式方法引導搜索的方法稱爲啟發式搜索。啟發式技術是非常有用的,因爲當你使用它們的時候,搜索可以得到提升。
Difference between Uninformed and Informed Search
有兩種控制策略或搜索技術:不知情和知情。它們的詳細解釋如下所示;
Uninformed Search
它也被稱爲盲搜索或盲控制策略。之所以這樣命名是因爲只有關於問題定義的信息,而沒有關於狀態的其他額外信息。這種搜索技術會搜索整個狀態空間以獲得解。廣度優先搜索(BFS)和深度優先搜索(DFS)是非信息搜索的例子。
Informed Search
它也被稱爲啟發式搜索或啟發式控制策略。之所以這樣命名,是因爲有一些關於各州的額外信息。此額外信息對於計算要探索和展開的子節點之間的首選項非常有用。每個節點都有一個啟發式函數。最佳第一搜索(BFS)、A*、均值和分析是知情搜索的例子。
Constraint Satisfaction Problems (CSPs)
約束是指限制或限制。在人工智慧中,約束滿足問題是在一定約束條件下必須解決的問題。在解決此類問題時,必須注意不要違反約束。最後,當我們得到最終的解決方案時,CSP必須遵守這個限制。
Real World Problem Solved by Constraint Satisfaction
前面幾節討論了創建約束滿足問題。現在,讓我們把這個應用到現實世界的問題上。用約束滿足法解決現實問題的例子如下:;
Solving algebraic relation
藉助於約束滿足問題,我們可以求解代數關係。在本例中,我們將嘗試求解一個簡單的代數關係a*2=b。它將在我們定義的範圍內返回a和b的值。
在完成這個Python程序之後,您將能夠理解使用約束滿足來解決問題的基礎知識。
注意,在編寫程序之前,我們需要安裝名爲Python constraint的Python包。您可以使用以下命令安裝它−
pip install python-constraint
以下步驟向您展示了一個Python程序,用於使用約束滿足−
使用以下命令導入約束包−
from constraint import *
現在,創建一個名爲problem()的模塊對象,如下所示−
problem = Problem()
現在,定義變量。注意,這裡我們有兩個變量a和b,我們定義10爲它們的範圍,這意味著我們得到了前10個數內的解。
problem.addVariable('a', range(10)) problem.addVariable('b', range(10))
接下來,定義要應用於此問題的特定約束。注意,這裡我們使用約束a*2=b。
problem.addConstraint(lambda a, b: a * 2 == b)
現在,使用以下命令創建getSolution()模塊的對象−
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}]
Magic Square
幻方是一個正方形網格中不同數字(通常是整數)的排列,其中每一行、每一列中的數字和對角線中的數字加起來都是同一個數字,稱爲「幻方常數」。
下面是生成幻方的簡單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。