演算法筆記之回溯法(2)

2021-09-19 17:52:35 字數 2871 閱讀 1469

假設地圖共有7個區域,分別是a/b/c/d/e/f/g,對上面順序進行編號,每個區域用乙個結點表示,相鄰的區域有連線,那麼地圖就轉化成乙個無向連線圖。

定義問題的解空間。圖的m著色問題解空間形式為n元組,每個分量取值為1,2,3,...,m,即問題的解是乙個n元向量。由此可得,問題的解空間為,其中顯約束為xi=1,2,...,m。

確定解空間的組織結構:一顆滿m叉樹,樹的深度為n。

搜尋解空間

地圖7個區域,3種顏色。

開始搜尋第1層(t=1)。擴充套件a結點第乙個分支,首先判斷是否滿足約束條件,因為之前還未著色任何結點,所以滿足約束條件,擴充套件該分支,令1號結點著1號色,即x[1]=1,生成b。

拓展b結點(t=2)。擴充套件第乙個分支x[2]=1,首先判斷2號結點是否和前面已經確定色號的結點(1號)有邊相連且色號相同,不滿足約束條件,剪掉該分支,然後沿著x[2]=2擴充套件,2號結點和前面已經確定色號的結點(1號)有邊相連,但色號不同,滿足約束條件,擴充套件該分支,令x[2]=2。

擴充套件c結點(t=3)。擴充套件第乙個分支x[3]=1,首先判斷3號結點是否和前面已經確定色號的結點(1、2號)有邊相連且色號相同,不滿足約束條件,剪掉該分支;同理剪掉x[3]=2分支。然後沿著x[3]=3擴充套件,3號結點和前面已經確定色號的結點(1、2號)有邊相連,但色號不同,滿足約束條件,擴充套件該分支,令x[3]=3。生成d。

擴充套件d結點(t=4)。擴充套件第乙個分支x[4]=1,首先判斷4號結點是否和前面已經確定色號的結點(1、2、3號)有邊相連且色號相同,不滿足約束條件(4餘1相連),剪掉該分支;然後令x[4]=2,符合條件,生成e。

擴充套件e結點(t=5)。擴充套件第乙個分支x[5]=1,首先判斷4號結點是否和前面已經確定色號的結點(1、2、3號)有邊相連且色號相同,確定5與2、3、4相連但色號不同,滿足約束條件,擴充套件該分支,生成f。

擴充套件f結點(t=6)。擴充套件第乙個分支x[6]=1,同理不滿足,剪掉分支;然後沿著x[6]=2擴充套件,6與5號有邊相連但色號不同,故滿足約束條件,擴充套件該分支,令x[6]=2,生成g。

擴充套件g結點(t=7)。擴充套件第乙個分支x[7]=1,剪掉x[7]=1和x[7]=2的分支,然後令x[7]=3,符合要求,生成h。

擴充套件h結點(t=8)。t>n,找到乙個可行解,輸出該可行解,回溯到最近的活結點g。

重新擴充套件g結點(t=7)。g已經考察完畢,成為死結點,回溯到最近的活結點f。

//約束條件

bool isright(int t)

}return true;

}//回溯方法函式

void backtrack(int t)

cout << endl;

}else

}}

時間複雜度:o(nmn)。

空間複雜度:o(n)。

在n×n的棋盤上放置彼此不受攻擊的n個皇后。按照西洋棋規則,皇后可以攻擊與之在同一行、同一列、同一斜線上的棋子。現在在n*n的棋盤上放置n個皇后,使其不受攻擊。

求解策略:

以行為主導:

(1)定義問題的解空間。n皇后問題解的形式為n元組:,分量xi表示第i個皇后放置在第i行第xi列,xi取值為1,2,3,...,n。顯約束為不同行。

(2)解空間的組織結構:一顆m(m=n)叉樹,樹深度為n。

(3)搜尋解空間。

約束條件:在第t行放置第t個皇后時,第t個皇后的位置不能和前t-1個皇后同列、同斜線。第i個皇后和第j個皇后不同列,即xi!=xj。

限界條件:不需要設定。

搜尋過程:

bool isplace(int t)

}return place;

}void backtrack(int t)

cout << endl;

cout << "---------" << endl;

}else

}}

時間複雜度:o(nn+1)。

空間複雜度:o(n)。

現在有3個機器零件,在第一台機器上的加工時間分別為2、5、4,在第二台機器上的加工時間分別為3、1、6.如何安排零件加工順序,使第乙個零件從機器1上加工開始到最後乙個零件在機器2上加工完成,所需的總加工時間最短?

我們通過分析可以發現,第一台機器可以連續加工,而第二台機器開始加工的時間是當前第一台機器的下線時間第二台機器下線時間最大值

實際上就是找到n個機器零件的乙個排列,使總的加工時間最短。

定義問題的解空間。解的形式為n元組:,分量xi表示第i個加工的零件號,n個零件組成的集合為s=,xi取值為s-。

解空間的組織形式為一顆排列數,深度為n。

搜尋解空間。

1.資料結構

struct node

t[max];

2.按限界條件進行搜尋求解:t表示當前擴充套件結點在第t層,f1表示當前第一台機器上加工的完成時間,f2表示當前第二台機器上加工的完成時間。如果t>n表示已經到達葉子結點,記錄最優值和最優解,返回。否則,分別判斷每個分支是否滿足約束條件,若滿足則進入下一層backtrack(t+1);如果不滿足則反操作復位,考察下乙個分支(兄弟結點)。

void backtrack(int t)

for(int i=t;i<=n;i++)

t[mx] ;

bool cmp(node a,node b)

int main()

sort(t,t+n,cmp); //排序

int f1=0,f2=0;

for(int i=0;icout<<"最優的機器零件加工順序為:";

for(int i=0;icout

cout

}

演算法筆記之回溯法(2)

假設地圖共有7個區域,分別是a b c d e f g,對上面順序進行編號,每個區域用乙個結點表示,相鄰的區域有連線,那麼地圖就轉化成乙個無向連線圖。定義問題的解空間。圖的m著色問題解空間形式為n元組,每個分量取值為1,2,3,m,即問題的解是乙個n元向量。由此可得,問題的解空間為,其中顯約束為xi...

演算法筆記之回溯法(1)

回溯法的思想是 能進則進,進不了換,換不了退。隱約束指對能否得到問題的可行解和最優解做出的約束。隱約束包括約束函式和限界函式。關鍵步驟是 定 空間 確定解空間的組織結構 子集樹 排列數 m叉樹等 搜尋解空間。回溯法階梯的關鍵是設計有效的顯約束和隱約束。每個物品重量w和價值v如下表所示,購物車容量為w...

回溯 皇后 演算法筆記 演算法筆記 回溯法

1 0 1揹包問題 思路 構造乙個二叉樹,每個商品都有兩種狀態,要或者不要。如果要就在這個節點的左枝掛子節點,如果不要就在右節點掛子節點。如果全部商品都分配完狀態之後就回溯,回溯到乙個還有其他選擇的節點,接著往這個選擇發展節點,然後再回溯,然後再往下。直到無路可走,就結束了。假如限制重量是10,總共...