演算法一直維護兩個表: open和close
公式表示為: f(n)=g(n)+h(n),
其中 f(n) 是從初始狀態經由狀態n到目標狀態的代價估計,
g(n) 是在狀態空間中從初始狀態到狀態n的實際代價,
h(n) 是從狀態n到目標狀態的最佳路徑的估計代價。
通俗一點講:
g(n)代表你從起始點到下一點的實際距離(制定到下一點的距離的規則)
h(n)是自己設計的函式,可以是到目的地大致的距離
可將迴圈過程封裝成函式:
[cpp]view plain
copy
print?
while (isnotend())
舉個栗子:
對於以下圖:5行15列
000000000000000
0000000x0000000
00s0000x0000
e00
0000000x0000000
00000000
0000000
其中x為牆壁,s為起點,e為終點,建立合適的模型,呼叫a star演算法,找到一條s到e的最短路徑。
取直走g值為10,斜走g值為14
這裡h值設定為無視障礙到達終點所需的 步數*10
我們看開始的幾步:
000000000000000
0000000x0000000 00
s0000x0000e00
0000000x0000000
000000000000000
灰色的點g=10,h=9*10 ,其f值最小,加入close
000000000000000
0000
000x0000000 00
s0000x0000e00
0000000x0000000
000000000000000
灰色的點g=10+10,h=8*10 ,其f值最小,加入close
000000000000000
0000
000x0000000 00
s0000x0000e00
00000
00x0000000
000000000000000
灰色的點g=10+10+10,h=7*10 ,其f值最小,加入close
000000000000000
0000
000x0000000 00
s000
0x0000e00
00000
00x0000000
000000000000000
灰色的點g=10+10+10+10,h=6*10 ,其f值最小,加入close
以此迴圈,直到e在open中,此時只需要沿著父節點往回走就可以到達起點了,這條路就是當前情況下最優的解
結果:000000000000000
0000000x0000000 00
s000
0x0000e
000000000x0
000000
00000000
0000000
c++實現:
[cpp]view plain
copy
print?
#include#include#include#includeusing namespace std;
char square[5][15] = ;
class point
pair parentposi;
pair posi;
char v;//value
int f;
int g;
int h;
int updatef()
int updateh()
if (y < 0)
h = x + y;
return h;
} void setposi(pair x)
void setparentposi(pair x)
void setg(int g)
void seth(int h)
point &operator = (point &s)
};
vector open;
vector close;
point squ[5][15] = ;
bool isinopenlist(pair s)
} return
false;
} bool isincloselist(pair s)
} return
false;
} void putreachableintoopen(point min) ;
for (int i = 0;i < 8;i++)
} if (direc[i][0] * direc[i][1] != 0)
} else
continue;
} //既不在關閉也不在開啟列表中而且可到達 就將其加入開啟列表
if ((!isinopenlist(make_pair(x, y))) && (!isincloselist(make_pair(x,y)))&&x >= 0 && x < 5 && square[x][y] != 'x')
else
//cout << "(" << squ[x][y].posi.first << "," << squ[x][y].posi.second << ")" << endl;
} x = x - direc[i][0];
y = y - direc[i][1];
} //cout << "------------------------" << "(" << x << "," << y << "):" << "------------------------" << endl;
} void find_deleteminfromopen_addtoclose()
} close.push_back(min_);
std::vector::iterator it=open.begin()+tempi;
open.erase(it);
//cout << "close: (" << min_.posi.first << "," << min_.posi.second << ")" << endl;
//cout << "closesize()=" << close.size() << endl;
//cout << "opensize()=" << open.size() << endl;
} bool isnotend()
} return
true;
} void findpath(pair begin,pairend)
} std::vector::iterator it = open.begin()+tempi;//刪除起點
while (isnotend())
} void print_path()
}//初始化point.posi
findpath(make_pair(2,2),make_pair(2,12));
point temp = squ[2][12];
vectorpoint_out;
while (temp.posi!=squ[2][2].posi)
point_out.push_back(squ[2][2].posi);
while (point_out.size() != 0)
} void print()
cout << endl;
} }
int main()
RSA演算法簡介
rsa演算法簡介 1 簡介 當前最著名 應用最廣泛的公鑰系統rsa是在1978年,由美國麻省理工學院 mit 的rivest shamir和adleman在題為 獲得數字簽名和公開鑰密碼系統的方法 的 中提出的。它是乙個基於數論的非對稱 公開鑰 密碼體制,是一種分組密碼體制。其名稱來自於三個發明者的...
演算法分析(簡介)
演算法分析即指對乙個演算法所需要的資源進行 記憶體,通訊頻寬或計算機硬體等資源偶爾是我們主要關心的,乙個演算法所需要的資源越多,該演算法的複雜性越高,反之,所需要的資源越少,該演算法的複雜性越低,在計算機的資源中,最重要的是時間和空間 即儲存器 資源,因此演算法複雜性有時間複雜性和空間複雜性之分,不...
RSA演算法簡介
rsa演算法是 r rirest asllalnlr和l adleman於1977年在美國麻省理工學院開發,於1978年首次公布,其演算法如下 a 選擇兩質數p q。b 計算n p q。c 計算n的尤拉函式 n p 1 q 1 d 選擇整數e,使e與 n 互質,且1 利用rsa加密,首先需將明文數位...