a演算法改進
Ⅰ A*演算法的好處
其實A*演算法也是一種最好優先的演算法
只不過要加上一些約束條件罷了。由於在一些問題求解時,我們希望能夠求解出狀態空間搜索的最短路徑,也就是用最快的方法求解問題,A*就是干這種事情的!
我們先下個定義,如果一個估價函數可以找出最短的路徑,我們稱之為可採納性。A*演算法是一個可採納的最好優先演算法。A*演算法的估價函數可表示為:
f'(n) = g'(n) + h'(n)
這里,f'(n)是估價函數,g'(n)是起點到節點n的最短路徑值,h'(n)是n到目標的最短路經的啟發值。由於這個f'(n)其實是無法預先知道的,所以我們用前面的估價函數f(n)做近似。g(n)代替g'(n),但 g(n)>=g'(n)才可(大多數情況下都是滿足的,可以不用考慮),h(n)代替h'(n),但h(n)<=h'(n)才可(這一點特別的重要)。可以證明應用這樣的估價函數是可以找到最短路徑的,也就是可採納的。我們說應用這種估價函數的最好優先演算法就是A*演算法。
舉一個例子,其實廣度優先演算法就是A*演算法的特例。其中g(n)是節點所在的層數,h(n)=0,這種h(n)肯定小於h'(n),所以由前述可知廣度優先演算法是一種可採納的。實際也是。當然它是一種最臭的A*演算法。
再說一個問題,就是有關h(n)啟發函數的信息性。h(n)的信息性通俗點說其實就是在估計一個節點的值時的約束條件,如果信息越多或約束條件越多則排除的節點就越多,估價函數越好或說這個演算法越好。這就是為什麼廣度優先演算法的那麼臭的原因了,誰叫它的h(n)=0,一點啟發信息都沒有。但在游戲開發中由於實時性的問題,h(n)的信息越多,它的計算量就越大,耗費的時間就越多。就應該適當的減小h(n)的信息,即減小約束條件。但演算法的准確性就差了,這里就有一個平衡的問題。
Ⅱ 廣度優先演算法的優化——A*演算法問題
英文叫 a-star 中文叫a星
我以前見過用astar演算法求解這類問題的論文
你在上搜索一下 「A星演算法」有這方面的解釋
Ⅲ A*演算法如何改進
十萬火急:此改進的模糊C-此函數實現遺傳演算法,用於模糊C-均值聚類 %% A=farm(:,Ser(1)); B=farm(:,Ser(2)); P0=unidrnd(M-1); a=[
Ⅳ 什麼是 a演算法a* 演算法有什麼特點
A*演算法:A*(A-Star)演算法是一種靜態路網中求解最短路徑最有效的直接搜索方法。估價值與實際值越接近,估價函數取得就越好
A* (A-Star)演算法是一種靜態路網中求解最短路最有效的直接搜索方法。
注意是最有效的直接搜索演算法。之後涌現了很多預處理演算法(ALT,CH,HL等等),在線查詢效率是A*演算法的數千甚至上萬倍。
公式表示為: f(n)=g(n)+h(n),
其中 f(n) 是從初始點經由節點n到目標點的估價函數,
g(n) 是在狀態空間中從初始節點到n節點的實際代價,
h(n) 是從n到目標節點最佳路徑的估計代價。
保證找到最短路徑(最優解的)條件,關鍵在於估價函數f(n)的選取:
估價值h(n)<= n到目標節點的距離實際值,這種情況下,搜索的點數多,搜索范圍大,效率低。但能得到最優解。並且如果h(n)=d(n),即距離估計h(n)等於最短距離,那麼搜索將嚴格沿著最短路徑進行, 此時的搜索效率是最高的。
如果 估價值>實際值,搜索的點數少,搜索范圍小,效率高,但不能保證得到最優解。
Ⅳ 試解釋Apriori演算法核心思想,演算法的不足,及演算法改進的途徑
自己去找論文下載看看,萬方都有的,你直接搜「Apriori演算法」即可,一大堆,自己看著挑吧
Ⅵ pdiibq 改進A_Star演算法
//程序需要一個輸入文件,名稱必須為 in.txt
//A_Star演算法是個很有名的演算法,從程序競賽,到網路選擇,到游戲設計都有很大的應用
//我將A_Star演算法做了一點小小的改進(但不知道這個改進以前有沒有人做過)用來算迷宮。
//主要的改動是首先判斷G(n)是否足夠小,如果足夠小則直接放棄向前搜索,因為已經有過更短的路徑穿過這個點了
//網上的演算法都是使用F(n)=G(n)+H(n)來判斷該選擇那個方向的下一步,而沒有驗證G(n)是否足夠小
#include <stdio.h>
#include <string.h>
#include <math.h>
const unsigned int Largest=~0; //無符號int的最大值
struct Step //步
{
unsigned int X,Y;
unsigned char ZhuBin;
};
unsigned char Detect[9]={1<<7,1<<6,1<<5,1<<4,1<<3,1<<2,1<<1,1<<0,0xFF}; //探針
char **Maze; //原始迷宮
unsigned int SizeX,SizeY; //迷宮尺寸
unsigned int StartX,StartY; //起點
unsigned int EndX,EndY; //終點
Step *WorkPath; //工作棧
char *StepKind; //表示前進的步是斜向還是橫豎向,以便縮減步長
unsigned int WorkLenth,Length; //總步數與總步長
char **ResultMaze; //結果迷宮
unsigned int ResultLength; //最短步長和
unsigned int **GDistance,**HDistance; //輔助表,這個是關鍵
int MoveX[8]={0,1,1,1,0,-1,-1,-1},MoveY[8]={-1,-1,0,1,1,1,0,-1}; //偏移量
int Read(char pFileName[])
{
FILE *pFile;
if( (pFile=fopen(pFileName,"r")) == 0)
{
printf("不能打開文件 %s\n",pFileName);
return 0;
}
fscanf(pFile,"%d %d",&SizeX,&SizeY);
fscanf(pFile,"%d %d",&StartX,&StartY);
fscanf(pFile,"%d %d",&EndX,&EndY);
unsigned int i,j;
WorkPath=new Step[SizeX*SizeY+1];//動態一維分配工作棧
StepKind=new char[SizeX*SizeY+1];
Maze=new char *[SizeY+1]; //動態二維分配迷宮與輔助表
GDistance=new unsigned int *[SizeY+1];
HDistance=new unsigned int *[SizeY+1];
ResultMaze=new char *[SizeY+1];
for(j=1;j<=SizeY;j++)
{
Maze[j]=new char [SizeX+1];
GDistance[j]=new unsigned int [SizeX+1];
HDistance[j]=new unsigned int [SizeX+1];
ResultMaze[j]=new char [SizeX+1];
}
fgetc(pFile);
for(j=1;j<=SizeY;j++)
{
for(i=1;i<=SizeX;i++)
{
ResultMaze[j][i]=(Maze[j][i]=fgetc(pFile)-'0');
GDistance[j][i]=Largest;
HDistance[j][i]=(unsigned int)(sqrt((i-EndX)*(i-EndX)+(j-EndY)*(j-EndY))*5.0);
}
fgetc(pFile);
}
fclose(pFile);
return 1;
}
int OutTable_F(char **p,char pFileName[])
{
FILE *pFile;
if( (pFile=fopen(pFileName,"w")) == 0)
return 0;
fprintf(pFile,"迷宮程序,採用自己改進的A_Star演算法。作者:朱斌 [email protected]\n");
fprintf(pFile,"\n");
unsigned int i,j;
for(i=1 ; i<=SizeX+2 ; i++)
fprintf(pFile,"■");
fprintf(pFile,"\n");
for(j=1;j<=SizeY;j++)
{
fprintf(pFile,"■");
for(i=1;i<=SizeX;i++)
{
if(p[j][i]==0)
fprintf(pFile," ");
else if(p[j][i]==1)
fprintf(pFile,"■");
else
fprintf(pFile,"⊙");
}
fprintf(pFile,"■");
fprintf(pFile,"\n");
}
for(i=1 ; i<=SizeX+2 ; i++)
fprintf(pFile,"■");
fprintf(pFile,"\n");
fclose(pFile);
return 1;
}
Ⅶ 如何利用矩陣對a*演算法進行優化
如果A確實能完全存入一級緩存,那麼把B按列分塊,一塊一塊乘就行了.
一般來講矩陣乘法並不是像你說的那樣做的,而要把A,B,C都分塊,對於每一級存貯器而言,應該至少分成5個部分來管理.比如說,A的某一塊常駐於這一級存貯,然後餘下的部分分為四塊:
(1)上一步已經運算完成的C塊——寫入低一級存貯
(2)下一步將參與運算的B塊——從低一級存貯讀入
(3),正在參與運算的B和C塊
(4)然後對於這一級存貯器上的小矩陣塊運算C=AB仍然按照同樣的管理方式遞交給上一級存貯來計算.一般來講A塊選得略小一點,具體的分配方式取決於運算和I/O的速度,盡量保持計算單元忙碌.
Ⅷ 如何修改A*演算法,以便得到前n個最優解
把A*演算法的最優解變為最優解的小堆
Ⅸ A*演算法用於路徑規劃,有什麼缺點
缺點:A*演算法通過比較當前路徑柵格的8個鄰居的啟發式函數值F來逐步確定下一個路徑柵格,當存在多個最小值時A*演算法不能保證搜索的路徑最優。
A*演算法;A*(A-Star)演算法是一種靜態路網中求解最短路徑最有效的直接搜索方法。估價值與實際值越接近,估價函數取得就越好。A*[1] (A-Star)演算法是一種靜態路網中求解最短路最有效的直接搜索方法。注意是最有效的直接搜索演算法。之後涌現了很多預處理演算法(ALT,CH,HL等等),在線查詢效率是A*演算法的數千甚至上萬倍。公式表示為: f(n)=g(n)+h(n),其中 f(n) 是從初始點經由節點n到目標點的估價函數,g(n) 是在狀態空間中從初始節點到n節點的實際代價,h(n) 是從n到目標節點最佳路徑的估計代價。保證找到最短路徑(最優解的)條件,關鍵在於估價函數f(n)的選取:估價值h(n)<= n到目標節點的距離實際值,這種情況下,搜索的點數多,搜索范圍大,效率低。但能得到最優解。並且如果h(n)=d(n),即距離估計h(n)等於最短距離,那麼搜索將嚴格沿著最短路徑進行, 此時的搜索效率是最高的。如果 估價值>實際值,搜索的點數少,搜索范圍小,效率高,但不能保證得到最優解。
Ⅹ 為什麼a*演算法會出現重復擴展節點的問題解決的方法有哪些
演算法沒有錯。只是考慮到所有可能的情況。
如果x出現在close集中,並且新的估價小於原有估價,說明還存在另一條經過x到達目標並且更快捷路徑是之前沒有搜索到的。這時當然要重新把x放回open集中統一考慮。
依你所講,大概你是在方格棋盤類的路徑搜索。則上述情況不會出現,因為方格棋盤構造出的圖很規則。但如果是在某一非常奇怪的圖上,比如兩行星之間有個蟲洞,經過後可以使時間倒流時(哈哈,暫時只想到這樣一個奇怪的例子),則很有可能出現上述情況。
所以,不是演算法誰對誰錯,而是在不同問題中做法不一樣。網路給出的演算法考慮情況更全面。