人智導(四):約束滿足問題
約束滿足問題(Constraint Satisfaction Problem)
- 一種結構化的、簡單而標準模式的問題表示
- 狀態被描述爲一系列變量(對應的值域爲)
- 目標測試:一個約束集,描述這些變量或子集允許的取值
CSP問題的定義
約束滿足問題的定義:
- 變量集合:;約束集合:。對應的值域爲;爲一些變量間的約束關係。
- 一個狀態:部分或全部變量的一個賦值
- 完全賦值:每個變量都進行賦值(完全狀態complete state)
- 問題的解:滿足所有約束的完全賦值
約束滿足問題:地圖着色(map coloring)
如圖
- 狀態變量:WT, NT, Q, NSW, V, SA, T
- 值域:
- 約束:相鄰區域必須用不同顏色標識
- 隱式描述:
- 顯式描述:
- 問題的解是滿足約束的變量賦值,如:
約束滿足問題:八皇后問題
約束規則:同一行或同一列、或統一斜線上不能有兩個或以上的Queens
形式化描述:
- 變量:
- 值域:
- 約束:
約束滿足中的變量與約束
- 變量種類:離散變量 vs 連續變量(現實世界中許多問題涉及實數型變量)
- 約束種類:
- 一元約束:如
- 二元約束:如
- 多元約束:涉及三個以上變量的高階約束
- 目標測試:檢查是否滿足所有約束條件
CSP問題的解決
標準搜索方法解決CSP問題
- CSP問題表示:狀態(state)通過變量賦值來定義
- 初始狀態:沒有任何賦值{}
- 後繼函數:對一個未有值的變量賦值,不違反約束條件
- 目標測試:當前狀態賦值已完備,並且滿足所有約束
- 路徑代價可把每一步代價作爲常數(例如取值爲1)
- CSP問題的解:必須是一個滿足約束的完全賦值,若有n個變量,n也就是解的路徑深度
回溯搜索算法
思路:
- 無信息搜索算法解決CSP
- 一次只給一個變量賦值
- 過程中每步都檢測是否滿足約束(不與之前賦值相沖突)
算法:
Function BACKTRACKING-SEARCH (csp) returns solution or failure
return RECURSIVE-BACKTRACKING({},csp)
Function RECURSIVE-BACKTRACKING(assignment, csp) returns solution or failure
if assignment is complete then return assignment
var <--- SELECT-UNASSIGNED-VARIABLE(VARIABLES[csp],assignment, csp)
for each value in ORDER-DOMAIN-VALUES(var assignment, csp) do
if value is consistent with assignment given CONSTRAINTS[csp] then
add{var = value} to assignment
result <--- RECURSIVE-BACKTRACKING(assignment, csp)
if result != failure then return result
remove {var = value} from assignment
return failure
深度優先搜索+有序變量賦值+違反約束即失敗
啓發式:優先選擇合法取值最少變量(最受約束變量)
標準問題求解與完全狀態問題對比
- CSP標準的問題求解:如何發現動作序列,一步一步地達到目標
- 看作是規劃(plan)問題
- 達到目標的途徑是重要的
- CSP解決完全狀態問題:如何發現滿足約束的完全賦值
- 看作是識別(Identification)問題
- 目標本身是重要的,而途徑不是
完全狀態問題
局部搜索:問題的完整狀態(complete-state)形式表示
- 初始狀態:每個變量均被賦值
- 後繼狀態:每次改變一個變量的值
- 直到發現滿足約束的解
如下圖:
初始狀態違反了約束,採用局部搜索來消除違反的約束
算法:最小衝突算法Min-Conflict
Function MIN-CONFLICTS(csp, max_steps) returns a solution or failure
inputs:csp
max_steps //最大嘗試次數
current <--- an initial complete assignment for csp
for i=1 to max_steps do
if current is a solution for csp then return current
var <--- a randomly chosen conflicted variable from csp.VARIABLES
value <--- the value v for var that minimizes CONFLICTS(var, v, current, csp)
set var = value in current
return failure
最小衝突算法:每一步搜索爲一個變量賦予新值,啓發式是新值必須與其他變量相沖突的數目最小化。
爬山或模擬退火等局部搜素可以被應用於目標優化。
總結
局部搜索問題
- 局部搜索:只關心目標狀態本身,而非達到目標的途徑
- 僅需少量存儲空間,適於處理大規模的、甚至是連續狀態空間的目標搜索狀態
- 完全狀態(complete state)的形式化描述問題,諸如佈局、調度、最優化問題等方面應用
- 爬山搜索算法、模擬退火算法、局部集束算法
約束滿足問題 - 從數學意義上定義一種簡單而標準模式的問題形式化表示
- 完全狀態(complete state)的形式化,狀態由一組變量表示
- 約束滿足問題求解:回溯搜索(標準搜索),最小衝突搜索(局部搜索)