版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
搜索算法搜索算法的基本思想
搜索是計(jì)算機(jī)解題中常用的方法,它實(shí)質(zhì)上是枚舉法的應(yīng)用。由于它相當(dāng)于枚舉法,所以其效率是相當(dāng)?shù)氐?。因此,為了提高搜索的效率,人們想出了很多剪枝的方法,如分枝定界,啟發(fā)式搜索等等。在競(jìng)賽中,我們不僅要熟練掌握這些方法,而且要因地制宜地運(yùn)用一些技巧,以提高搜索的效率。定義:Function
ExpendNode(Situation:Tsituation;ExpendWayNo:Integer):TSituation;表示對(duì)給出的節(jié)點(diǎn)狀態(tài)Sitution采用第ExpendWayNo種擴(kuò)展規(guī)則進(jìn)行擴(kuò)展,并且返回?cái)U(kuò)展后的狀態(tài)。基本搜索算法一【回溯算法】回溯算法是采用了一種“走不通就掉頭”思想作為其控制結(jié)構(gòu),用先根遍歷的方法來構(gòu)造解答樹,可用于找所有解以及最優(yōu)解?;厮菟惴▽?duì)空間的消耗較少,當(dāng)其與分枝定界法一起使用時(shí),對(duì)于所求解在解答樹中層次較深的問題有較好的效果。但應(yīng)避免在后繼節(jié)點(diǎn)可能與前繼節(jié)點(diǎn)相同的問題中使用,以免產(chǎn)生循環(huán)?;舅阉魉惴ㄒ弧净厮菟惴ā?lt;Type>
Node(節(jié)點(diǎn)類型)=Record
Situtation:TSituation(當(dāng)前節(jié)點(diǎn)狀態(tài));Way-NO:Integer(已使用過的擴(kuò)展規(guī)則的數(shù)目);End基本搜索算法一【回溯算法】[遞歸算法]Procedure
BackTrack(Situation:TSituation;deepth:Integer);Var
i:Integer;Begin
If
deepth>Maxthen(空間達(dá)到極限,跳出本過程);IfSituation=Targetthen(找到目標(biāo));
ForI:=1to
TotalExpendMethod
do
Begin
BackTrack(ExpendNode(Situation,I),deepth+1);End-For;End;構(gòu)造字串
生成長(zhǎng)度為n的字串,其字符從26個(gè)英文字母的前p(p≤26)個(gè)字母中選取,使得沒有相鄰的子序列相等。例如p=3,n=5時(shí)
‘a(chǎn)bcba’滿足條件
‘a(chǎn)bcbc’不滿足條件輸入:n,p輸出:所有滿足條件的字串
分析狀態(tài):待擴(kuò)展的字母序號(hào)at。實(shí)際上字串s亦參與了遞歸運(yùn)算,但是由于該變量的存儲(chǔ)量太大,因此我們將s設(shè)為全局變量;
邊界條件和目標(biāo)狀態(tài):產(chǎn)生了一個(gè)滿足條件的字串,即at=n+1;搜索范圍:第at位置可填的字母集{‘a(chǎn)’..chr(ord(‘a(chǎn)’)+p-1)};約束條件:當(dāng)前字串沒有相鄰子串相等的情況varn,p:integer;{字串長(zhǎng)度和可選字母的個(gè)數(shù)}
tl:longint;{滿足條件的字串?dāng)?shù)}ed:char;{可選字母集中的最大字母}s:string;{滿足條件的字串}proceduresolve(at:integer);{遞歸擴(kuò)展第at個(gè)字母}
var
ch:char;
i:integer;
beginifat=n+1{若產(chǎn)生了一個(gè)滿足條件的字串,則輸出,滿足條件的字串?dāng)?shù)+1}thenbegin
writeln(f,s);inc(tl);exit{回溯}end;{then}forch←'a'toeddo{搜索每一個(gè)可填字母}begins←s+ch;i←1;{檢查當(dāng)前字串是否符合條件}
while(i<=atdiv2)and(copy(s,length(s)-i+1,i)<>copy(s,length(s)-2*i+1,i))doinc(i);ifi>atdiv2thensolve(at+1);{若當(dāng)前字串符合條件,則遞歸擴(kuò)展下一個(gè)字母}
delete(s,length(s),1){恢復(fù)填前的字串}
end{for}end;{solve}begin
readln(n,p);{輸入字串長(zhǎng)度和前綴長(zhǎng)短}ed←chr(ord('a')+p-1);{計(jì)算可選字母集中的最大字母}s←'';tl←0;{滿足條件的字串初始化為空,字串?dāng)?shù)為0}solve(1);{從第1個(gè)字母開始遞歸計(jì)算所有滿足條件的字串}
writeln('Total:',tl);{輸出滿足條件的字串?dāng)?shù)}
end.{main}基本搜索算法[深度搜索與廣度搜索]深度搜索與廣度搜索的區(qū)別:深度搜索下一次擴(kuò)展的是本次擴(kuò)展出來的子節(jié)點(diǎn)中的一個(gè),而廣度搜索擴(kuò)展的則是本次擴(kuò)展的節(jié)點(diǎn)的兄弟節(jié)點(diǎn)。在具體實(shí)現(xiàn)上為了提高效率,所以采用了不同的數(shù)據(jù)結(jié)構(gòu)。廣度搜索是求解最優(yōu)解的一種較好的方法,而深度搜索多用于只要求解,并且解答樹中的重復(fù)節(jié)點(diǎn)較多并且重復(fù)較難判斷時(shí)使用,但往往可以用A*或回溯算法代替。搜索策略綜合數(shù)據(jù)庫
與問題相關(guān)的所有數(shù)據(jù)元素構(gòu)成的集合,用來表述問題狀態(tài)或有關(guān)事實(shí)。產(chǎn)生式規(guī)則 構(gòu)建了綜合數(shù)據(jù)庫以后,還需要研究問題的移動(dòng)規(guī)則,稱為產(chǎn)生式規(guī)則。搜索策略 搜索策略的實(shí)質(zhì)是確定如何選取規(guī)則的方式。有兩種基本方式:一種是不考慮給定問題所具有的特定知識(shí),系統(tǒng)根據(jù)事先確定好某種固定順序,依次調(diào)用規(guī)則或隨機(jī)調(diào)用規(guī)則,這實(shí)際上是盲目搜索的方法。另一種是考慮問題領(lǐng)域可應(yīng)用的知識(shí),動(dòng)態(tài)地確定規(guī)則的排列次序,優(yōu)先調(diào)用較合適的規(guī)則使用,這就是通常所說的啟發(fā)式搜索策略。一些基本概念節(jié)點(diǎn):記錄擴(kuò)展的狀態(tài)?;?邊:記錄擴(kuò)展的路徑。搜索樹:描述搜索擴(kuò)展的整個(gè)過程。節(jié)點(diǎn)的耗散值 令C(i,j)為從節(jié)點(diǎn)ni到nj的這段路徑(或者?。┑暮纳⒅?一條路徑的耗散值就等于連接這條路徑各節(jié)點(diǎn)間所有弧的耗散值總和??梢杂眠f歸公式描述如下:
C(ni,t)=C(ni,nj)+C(nj,t)4搜索樹根節(jié)點(diǎn)葉子節(jié)點(diǎn)4,5,6,7,88123567八數(shù)碼問題
在3*3組成的九宮格棋盤上,擺有八個(gè)將牌,每一個(gè)將牌都刻有1—8中的某一個(gè)數(shù)碼。棋盤中留有一個(gè)空格,允許其周圍的某一個(gè)將牌向空格中移動(dòng),如右圖所示。這樣通過移動(dòng)將牌就可以不斷改變的布局結(jié)構(gòu),給出一個(gè)初始布局(稱初始狀態(tài))和一個(gè)目標(biāo)布局(稱目標(biāo)狀態(tài)),問如何移動(dòng)將牌,才能實(shí)現(xiàn)從初始狀態(tài)到目標(biāo)狀態(tài)的轉(zhuǎn)換。綜合數(shù)據(jù)庫{Pxy},其中1<=x,y<=3,Pxy∈{0,1,2,3,4,5,6,7,8},且Pxy互不相等
用Pascal語言描述如下:typeT8no=array[1..3,1..3]ofinteger;{棋盤狀態(tài)}
TList=record{描述一個(gè)節(jié)點(diǎn)}Father:integer;
{父指針}
dep:byte;
{深度}x,y:byte; {空格的位置}state:T8no;
end;constMax=10000;vars,t:T8no;{s為初始狀態(tài),t為目標(biāo)狀態(tài)}List:array[0..max]ofTList;{綜合數(shù)據(jù)庫}產(chǎn)生式規(guī)則if條件then規(guī)則;設(shè)Pxy表示將牌第x行第y列的數(shù)碼,m,n表示數(shù)碼空格所在的行列值,記Pm,n=0,則可以得到如下四條規(guī)則:
①ifn-1>=1thenbeginPm,n:=Pm,n-1-
;Pm,n-1-
-:=0end;②ifm-1>=1thenbeginPm,n:=Pm-1,n;Pm-1,n:=0end;③ifn+1<=3thenbeginPm,n:=Pm,n+1;Pm,n+1:=0end;④ifm+1<=3thenbeginPm,n:=Pm+1-,n;Pm+1-,n:=0end;ConstDir:array[1..4,1..2]ofinteger{對(duì)應(yīng)四種產(chǎn)生式規(guī)則}=((1,0),(-1,0),(0,1),(0,-1));控制策略
PROCEDUREProduction-System;DATA初始化數(shù)據(jù)庫Repeat
在規(guī)則集中選擇某一條可作用于DATA的規(guī)則R
DATAR作用于DATA后得到的結(jié)果
UntilDATA滿足結(jié)束條件寬度優(yōu)先搜索PROCEDUREBFS-SEARCH;(算法1)1.
G:=G0;2.
open:=(Source);3.
closed:=nil;4.
Repeat5.
IFOPEn=nilthenExit(Fail);6.
n:=FIRST(OPEn);Remove(n,open);7.
Add(n,closed);8.
ifn=GoalthenExit(Success);9.
mi:=Expand(n);10.
對(duì)mi,舍去在G中已經(jīng)出現(xiàn)的節(jié)點(diǎn);11.
將圖中未出現(xiàn)的mi加入到open表的表尾12.
Add(mi,G);13.
Untilfalse;
八數(shù)碼問題擴(kuò)展過程
八數(shù)碼搜索的主框架
List[1]=source;closed:=0;open:=1;{初始化open,closed,List}
Repeat
closed:=closed+1;n:=List[closed];{取出closed對(duì)應(yīng)的節(jié)點(diǎn)}
Forx:=1to4do[
new:=Move(n,4);{按第x條規(guī)則擴(kuò)展,得到new}
ifnot_Appear(new,List)then{判重}
[open:=open+1;List[open]:=new;{加入新節(jié)點(diǎn)到open}
List[open].Father:=closed;{修改指針}
ifList[open]=GoalthenGetOut;
];
]
Untilclosed<open;八數(shù)碼問題寬度優(yōu)先算法框架List[1]=source;closed:=0;open:=1;{加入初始節(jié)點(diǎn),List為擴(kuò)展節(jié)點(diǎn)的表}Repeatclosed:=closed+1;n:=List[closed];{取出closed對(duì)應(yīng)的節(jié)點(diǎn)}Forx:=1to4do[new:=Move(n,4);{對(duì)n節(jié)點(diǎn)使用第x條規(guī)則,得到new}ifnot_Appear(new,List)then[{如果new沒有在List中出現(xiàn)}open:=open+1;List[open]:=new;{加入新節(jié)點(diǎn)到open}
List[open].Father:=closed;{修改指針}ifList[open]=GoalthenGetOut;];]Untilclosed<open;八數(shù)碼參考程序(寬度優(yōu)先)program8no_bfs;{八數(shù)碼的寬度優(yōu)先搜索算法}ConstDir:array[1..4,1..2]ofinteger
{四種移動(dòng)方向,對(duì)應(yīng)產(chǎn)生式規(guī)則}=((1,0),(-1,0),(0,1),(0,-1));n=10000;TypeT8no=array[1..3,1..3]ofinteger;
TList=recordFather:integer;
{父指針}
dep:byte;
{深度}X0,Y0:byte; {0的位置}State:T8no;
{棋盤狀態(tài)}end;Var
Source,Target:T8no;List:array[0..10000]ofTList;{綜合數(shù)據(jù)庫}
Closed,open,Best:integer{Best表示最優(yōu)移動(dòng)次數(shù)}Answer:integer;{記錄解}Found:Boolean;{解標(biāo)志}procedureGetInfo;{讀入初始和目標(biāo)節(jié)點(diǎn)}
var
i,j:integer;beginfori:=1to3doforj:=1to3doread(Source[i,j]);fori:=1to3doforj:=1to3doread(Target[i,j]);end;procedureInitialize;{初始化}
var
x,y:integer;beginFound:=false;Closed:=0;open:=1;withList[1]dobeginState:=Source;dep:=0;Father:=0;Forx:=1to3doFory:=1to3doifState[x,y]=0thenBeginx0:=x;y0:=y;End;end;end;FunctionSame(A,B:T8no):Boolean;{判斷A,B狀態(tài)是否相等}
Var
i,j:integer;BeginSame:=false;Fori:=1to3doforj:=1to3doifA[i,j]<>B[i,j]thenexit;Same:=true;End;functionnot_Appear(new:tList):boolean;{判斷new是否在List中出現(xiàn)}
vari:integer;begin
not_Appear:=false;fori:=1toopendoifSame(new.State,List[i].State)thenexit;
not_Appear:=true;end;procedureMove(n:tList;d:integer;varok:boolean;varnew:tList);{將第d條規(guī)則作用于n得到new,OK是new是否可行的標(biāo)志}
var
x,y:integer;beginX:=n.x0+Dir[d,1];Y:=n.y0+Dir[d,2];{判斷new的可行性}ifnot((X>0)and(X<4)and(Y>0)and(Y<4))thenbeginok:=false;exitend;OK:=true;new.State:=n.State;{new=Expand(n,d)}
new.State[X,Y]:=0;new.State[n.x0,n.y0]:=n.State[X,Y];new.X0:=X;new.Y0:=Y;end;procedureAdd(new:tList);{插入節(jié)點(diǎn)new}beginifnot_Appear(new)thenBegin{如果new沒有在List出現(xiàn)}
Inc(open);{new加入open表}
List[open]:=new;end;end;procedureExpand(Index:integer;varn:tList);{擴(kuò)展n的子節(jié)點(diǎn)}
vari:integer;new:tList;OK:boolean;BeginifSame(n.State,Target)thenbegin{如果找到解}Found:=true;Best:=n.Dep;Answer:=Index;Exit;end;Fori:=1to4dobegin{依次使用4條規(guī)則}
Move(n,i,OK,new);ifnotokthencontinue;new.Father:=Index;
new.Dep:=n.dep+1;
Add(new);end;end;
procedureGetOutInfo;{輸出}procedureOutlook(Index:integer);{遞歸輸出每一個(gè)解}
var
i,j:integer;beginifIndex=0thenexit;
Outlook(List[Index].Father);withList[Index]dofori:=1to3dobeginforj:=1to3dowrite(State[i,j],'');
writeln;end;
writeln;end;begin
Writeln('Total=',Best);
Outlook(Answer);end;procedureMain;{搜索主過程}beginRepeat
Inc(Closed);
Expand(Closed,List[Closed]);{擴(kuò)展Closed}Until(Closed>=open)orFound;ifFoundthenGetOutInfo{存在解}elseWriteln('noanswer');{無解}end;Begin
Assign(Input,'input.txt');ReSet(Input);
Assign(Output,'Output.txt');ReWrite(Output);
GetInfo;Initialize;Main;
Close(Input);Close(Output);End.深度優(yōu)先搜索框架PROCEDUREDFS-SEARCH;(算法2)1.
G:=G0;2.
open:=(Source);3.
closed:=nil;4.
Repeat5.
IFOPEn=nilthenExit(Fail);6.
n:=FIRST(open);Remove(n,open);7.
Add(n,closed);8.
ifn=GoalthenExit(Success);9.
mi:=Expand(n);10.
將圖中未出現(xiàn)的mi加入到open表的表頭(壓棧)11.
Add(mi,G);12.
Untilfalse;
深度優(yōu)先搜索遞歸形式procedureDFS_recursive(i);(算法3)
ifn=targetthen更新當(dāng)前最優(yōu)值并保存路徑;
forr:=1to規(guī)則數(shù)
do[
new:=Expand(n,r)
if值節(jié)點(diǎn)new符合條件
then[
產(chǎn)生的子節(jié)點(diǎn)new壓入棧;
DFS_recursive(i+1);
棧頂元素出棧;
]
]
programDFS;
初始化;
DFS_recursive(1);八數(shù)碼問題的遞規(guī)搜索PROCEDURERecursive(step);ifstep>=bestthenexit;{最優(yōu)化剪枝}if(List[step]=Goal)and(step<best)thenbest=step; {記錄當(dāng)前最少步驟}forx:=1to4do[ {對(duì)使用第x條規(guī)則擴(kuò)展} new:=expand(List[step],4);ifnot_Appear(new,List)then{判重}
List[step]:=new;{插入當(dāng)前節(jié)點(diǎn)}
對(duì)new進(jìn)行標(biāo)號(hào);
Recursive(step); {遞歸搜索下一層}
清除new的標(biāo)號(hào);]PROCEDUREDFSList[1]:=Source;Best:=maxint;Recursive(1);
輸出遞歸與非遞歸方式的比較兩種方式本質(zhì)上是等價(jià),但兩者也時(shí)有區(qū)別的。遞歸方式實(shí)現(xiàn)簡(jiǎn)單,非遞歸方式較之比較復(fù)雜;遞歸方式需要利用??臻g,如果搜索量過大的話,可能造成棧溢出,所以在??臻g無法滿足的情況下,選用非遞歸實(shí)現(xiàn)方式較好。啟發(fā)式搜索啟發(fā)式搜索是利用問題擁有的啟發(fā)信息來引導(dǎo)搜索,達(dá)到減少搜索范圍,降低問題復(fù)雜度的目的。這種利用啟發(fā)信息的搜索過程稱為啟發(fā)式搜索方法。評(píng)價(jià)函數(shù) 為了提高搜索效率,引入啟發(fā)信息來進(jìn)行搜索,在啟發(fā)式搜索過程中,要對(duì)open表進(jìn)行排序,這就需要有一種方法來計(jì)算待擴(kuò)展節(jié)點(diǎn)有希望通向目標(biāo)節(jié)點(diǎn)的程度,我們總希望能找到最有希望通向目標(biāo)節(jié)點(diǎn)的待擴(kuò)展節(jié)點(diǎn)優(yōu)先擴(kuò)展。一種常用的方法就是定義評(píng)價(jià)函數(shù)f(evaluationfuntion)對(duì)各個(gè)節(jié)點(diǎn)進(jìn)行計(jì)算,其目的就是估算出“有希望”的節(jié)點(diǎn)來?!安辉谖华?jiǎng)牌個(gè)數(shù)”作為啟發(fā)信息的搜索過程雙向?qū)挾葍?yōu)先搜索雙向?qū)挾葍?yōu)先搜索注意的方面規(guī)則必須可逆隨時(shí)判重交叉擴(kuò)展搜索算法的優(yōu)化一、雙向廣度搜索二、分支定界三、A*算法搜索算法的優(yōu)化一、雙向廣度搜索從正反兩個(gè)方向進(jìn)行廣度搜索,理想情況下可以減少二分之一的搜索量,從而提高搜索速度。從初始狀態(tài)和目標(biāo)狀態(tài)兩個(gè)方向同時(shí)進(jìn)行擴(kuò)展,如果兩棵解答樹在某個(gè)節(jié)點(diǎn)第一次發(fā)生重合,則該節(jié)點(diǎn)所連接的兩條路徑所拼成的路徑就是最優(yōu)解。搜索算法的優(yōu)化添加一張節(jié)點(diǎn)表,作為反向擴(kuò)展表。在正向擴(kuò)展出一個(gè)節(jié)點(diǎn)后,需在反向表中查找是否有重合節(jié)點(diǎn)。反向擴(kuò)展時(shí)與之相同。搜索算法的優(yōu)化對(duì)雙向廣度搜索算法的改進(jìn):略微修改一下控制結(jié)構(gòu),每次while循環(huán)時(shí)只擴(kuò)展正反兩個(gè)方向中節(jié)點(diǎn)數(shù)目較少的一個(gè),可以使兩邊的發(fā)展速度保持一定的平衡,從而減少總擴(kuò)展節(jié)點(diǎn)的個(gè)數(shù),加快搜索速度。搜索算法的優(yōu)化例題1:(最短編號(hào)序列)
表A和表B各含k(k<=20)個(gè)元素,元素編號(hào)從1到k。兩個(gè)表中的每個(gè)元素都是由0和1組成的字符串。(不是空串)字符串的長(zhǎng)度<=20。例如下表的A和B兩個(gè)表,每個(gè)表都含3個(gè)元素(k=3)。
元素編號(hào)
字符串11210111310
元素編號(hào)
字符串111121030表B表A搜索算法的優(yōu)化
對(duì)于表A和表B,存在一個(gè)元素編號(hào)的序列2113,分別用表A中的字符串和表B中的字符串去置換相應(yīng)的元素編號(hào),可得相同的字符串序列101111110,見下表。具有上述性質(zhì)的元素編號(hào)序列稱之為S(AB)。對(duì)于上例S(AB)=2113。編寫程序:從文件中讀入表A和表B的各個(gè)元素,尋找一個(gè)長(zhǎng)度最短的元素編號(hào)序列S(AB)。(若找不到長(zhǎng)度<=100的編號(hào)序列,則輸出“NoAnswer”。
元素編號(hào)序列2113
用表A的字符串替換101111110
用表B的字符串替換101111110【分析】由于表A和表B不確定,所以不可能找到一種數(shù)學(xué)的方法。因?yàn)槭乔笞顑?yōu)解,不適合用深度優(yōu)先搜索,所以必須采用廣度優(yōu)先搜索的方法。但是當(dāng)表A和表B中的元素過多時(shí),直接搜索會(huì)超時(shí)。必須對(duì)搜索的算法加以改進(jìn)。此題的規(guī)則既可以正向使用,又可以逆向使用,因此可以采用雙向搜索。搜索算法的優(yōu)化在大方法確定后,算法的框架就已經(jīng)基本形成,再對(duì)算法進(jìn)行適當(dāng)?shù)馗倪M(jìn):
1、存儲(chǔ)當(dāng)前的A串和B串是很費(fèi)空間的,但因?yàn)椋链停麓拇蟛糠窒嗤?,故只需記錄不同部分,并作個(gè)標(biāo)記。
2、為了保證兩個(gè)方向擴(kuò)展結(jié)點(diǎn)的速度相對(duì)平衡,可以采取每次擴(kuò)展結(jié)點(diǎn)數(shù)較少的方向,而不是兩方向輪流擴(kuò)展。搜索算法的優(yōu)化二、分支定界分支定界實(shí)際上是A*算法的一種雛形,其對(duì)于每個(gè)擴(kuò)展出來的節(jié)點(diǎn)給出一個(gè)預(yù)期值,如果這個(gè)預(yù)期值不如當(dāng)前已經(jīng)搜索出來的結(jié)果好的話,則將這個(gè)節(jié)點(diǎn)(包括其子節(jié)點(diǎn))從解答樹中刪去,從而達(dá)到加快搜索速度的目的。
搜索算法的優(yōu)化二、分支定界解題過程:1、添加一個(gè)全局變量BestAnswer,記錄當(dāng)前最優(yōu)解。2、在每次生成一個(gè)節(jié)點(diǎn)時(shí),計(jì)算其預(yù)期值,并與BestAnswer比較。如果不好,則調(diào)用回溯過程。搜索算法的優(yōu)化三、A*算法A*算法中更一般的引入了一個(gè)估價(jià)函數(shù)f,其定義為f=g+h。其中g(shù)為到達(dá)當(dāng)前節(jié)點(diǎn)的耗費(fèi),而h表示對(duì)從當(dāng)前節(jié)點(diǎn)到達(dá)目標(biāo)節(jié)點(diǎn)的耗費(fèi)的估計(jì)。其必須滿足兩個(gè)條件:1、h必須小于等于實(shí)際的從當(dāng)前節(jié)點(diǎn)到達(dá)目標(biāo)節(jié)點(diǎn)的最小耗費(fèi)h*。2、f必須保持單調(diào)遞增。搜索算法的優(yōu)化三、A*算法
A*算法的控制結(jié)構(gòu)與廣度搜索的十分類似,只是每次擴(kuò)展的都是當(dāng)前待擴(kuò)展節(jié)點(diǎn)中f值最小的一個(gè),如果擴(kuò)展出來的節(jié)點(diǎn)與已擴(kuò)展的節(jié)點(diǎn)重復(fù),則刪去這個(gè)節(jié)點(diǎn)。如果與待擴(kuò)展節(jié)點(diǎn)重復(fù),如果這個(gè)節(jié)點(diǎn)的估價(jià)函數(shù)值較小,則用其代替原待擴(kuò)展節(jié)點(diǎn)。當(dāng)A*算法出現(xiàn)數(shù)據(jù)溢出時(shí),從待擴(kuò)展節(jié)點(diǎn)中取出若干個(gè)估價(jià)函數(shù)值較小的節(jié)點(diǎn),然后放棄其余的待擴(kuò)展節(jié)點(diǎn),從而可以使搜索進(jìn)一步的進(jìn)行下去。搜索算法的優(yōu)化搜索剪枝應(yīng)用舉例
例題2:(任務(wù)安排)
N個(gè)城市,若干城市間有道路相連,一輛汽車在城市間運(yùn)送貨物,總是從城市1出發(fā),又回到城市1。該車每次需完成若干個(gè)任務(wù),每個(gè)任務(wù)都是要求該車將貨物從一個(gè)城市運(yùn)送至另一個(gè)。例如若要完成任務(wù)2->6,則該車一次旅程中必含有一條子路徑。先到2,再到6。編程由文件讀入道路分布的領(lǐng)接矩陣,然后對(duì)要求完成的若干任務(wù),尋找一條旅行路線,使得在完成任務(wù)最多的前提下,經(jīng)過的城市總次數(shù)最少。如上例中經(jīng)過城市總次數(shù)為8,城市1和2各經(jīng)過2次均以2次計(jì)(起點(diǎn)不計(jì)),N<60。 搜索剪枝應(yīng)用舉例
如下圖所示,如果要求的任務(wù)是2->3,2->4,3->1,2->5,6->4,則一條完成全部任務(wù)的路徑是1->2->3->1->2->5->6->4->1。
【分析】如果考慮從城市i出發(fā),搜索所有相鄰的城市,再根據(jù)當(dāng)前所處的城市,確定任務(wù)的完成情況,從中找到最優(yōu)解。這種搜索的效率極低。我們只需到達(dá)上貨和下貨的城市,其它的城市僅作為中間過程。因此,首先必須確定可能和不可能完成的任務(wù),然后求出任意兩城市間的最短路徑。在搜索時(shí),就只需考慮有貨要上的城市,或者
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- JJG 2097-2024太赫茲輻射功率計(jì)量器具檢定系統(tǒng)表
- 2024年度云南省高校教師資格證之高等教育學(xué)模擬考試試卷A卷含答案
- 贛南師范大學(xué)《課外音樂活動(dòng)的組織與指導(dǎo)》2022-2023學(xué)年第一學(xué)期期末試卷
- 阜陽師范大學(xué)《學(xué)前比較教育》2023-2024學(xué)年第一學(xué)期期末試卷
- 阜陽師范大學(xué)《非政府組織管理》2022-2023學(xué)年第一學(xué)期期末試卷
- 南京市2024-2025學(xué)年三年級(jí)上學(xué)期11月期中調(diào)研數(shù)學(xué)試卷一(有答案)
- 福建師范大學(xué)《綜合自然地理》2023-2024學(xué)年第一學(xué)期期末試卷
- 福建師范大學(xué)《演藝娛樂經(jīng)營(yíng)管理》2022-2023學(xué)年第一學(xué)期期末試卷
- 專題77 實(shí)驗(yàn)八:其它測(cè)量電阻的方法(含答案)-十年(2014-2023)高考物理真題分項(xiàng)匯編(全國(guó)用)
- 福建師范大學(xué)《小學(xué)課程與教學(xué)研究》2022-2023學(xué)年第一學(xué)期期末試卷
- 2022年癲癇性精神病臨床路徑
- 三年級(jí)心理健康教學(xué)課件 第15課 專注的力量
- 廣西壯族自治區(qū)北海市各縣區(qū)鄉(xiāng)鎮(zhèn)行政村村莊村名明細(xì)居民村民委員會(huì)
- 藥劑科質(zhì)量與安全管理考核表正式版
- 新教材高考化學(xué)一輪復(fù)習(xí)元素“位-構(gòu)-性”推斷技巧及元素周期律應(yīng)用中的關(guān)鍵點(diǎn)課件(19張)
- 無機(jī)離子檢測(cè)
- 五年級(jí)上冊(cè)數(shù)學(xué)課件 - 三角形的面積 人教版(共16張PPT)
- 乳腺癌科普講座課件
- 2022年《國(guó)民經(jīng)濟(jì)行業(yè)分類》
- 通止規(guī)設(shè)計(jì)公差自動(dòng)計(jì)算表
- 胃癌淋巴結(jié)清掃ppt課件(PPT 39頁)
評(píng)論
0/150
提交評(píng)論