a* 演算法以估值函式為核心。
alpha-beta 以剪枝為核心。簡單的說就是把比已知的一步棋更臭的棋剪掉。
現在我希望尋求某個問題接下來幾步的最優解,蠻力計算是不可行的。a* 的準確性較差。但這本身不是乙個博弈情況,所以alpha-beta不適用,只能期望於一種比較好的搜尋演算法。
正在構思一種逆a*演算法。a*演算法以價值為中心,逆a* 演算法以代價(cost)為中心。
a* 演算法採用寬度搜尋獲取最優解。逆a* 演算法採用深度搜尋。
部分**冗餘,在任何步驟都不足以滿足目標價值時
[b]乙個lua的實現[/b]
local currentcost;
local wantedvalue;
local maxvalue,mincost,maxrate =0,0,0
local statusmap;--狀態圖,棋盤
local callcount;
routes={};
if table.getn == nil then
local fun, err = loadstring("return function(tb) return #tb end")
table.getn = fun()
end
--depth 最大限制深度
--value 目標價值
-- cost 花費
--return: min cost,max value
--todo: jstar(map,depth) return routes,狀態空間對應的路由是確定的
function jstar(depth,needvalue,costed)
if(depth<=0)then
--計算maxvalue,未實現,重要
return 0
endcallcount=callcount+1;
local actions = getactions(map);
for i=1,table.getn(actions) do
a = actions[i]
v = needvalue - getvalue(a);
c = getcost(a)+costed;
if(v <=0 )then
if( c < mincost)then
mincost=c;
exec(map,a)
routes={}
--clone
for j=1,table.getn(map.routing) do
routes[j]=map.routing[j]
endroutes.cost=c
routes.value=v
undo(map)
endelseif(cexec(map,a)
jstar(depth-1,v,c)
undo(map)
--else 則超出最優解範圍,忽略
endend
endlocal testzb=,,,,,,,}
map={}
map.current=
map.routing={}
--獲取所有可能的點
function getactions(m)
ac={}
for i=1,table.getn(testzb) do
f=true
for j=1,table.getn(m.routing) do
if(map.routing[j]==i)then f=false;break;end
endif(f)then
table.insert(ac,i)
endend
return ac
endfunction exec(m,action)
m.old=map.current;
m.current=testzb[action]
table.insert(m.routing,action)
endfunction undo(m)
if(table.getn(m.routing)==1)then
m.current=
else
m.current=testzb[m.routing[table.getn(m.routing)-1]]
endtable.remove(m.routing,table.getn(m.routing))
endfunction getvalue(a)
return testzb[a][3]
endfunction getcost(a)
dx = map.current[1]-testzb[a][1]
dy = map.current[2]-testzb[a][2]
return math.sqrt(dx*dx+dy*dy)
end--執行jstar演算法,初始引數深度
function start(depth,w)
wantedvalue=w;
maxvalue=0;
mincost=1000000000;
callcount=0;
jstar(depth,wantedvalue,0);
print(callcount);
endstart(5,5)
print(callcount)
print(table.concat(routes,','))
詳解alpha beta演算法
最近在做中國象棋對弈程式,用到了alpha beta演算法。在網上搜尋了很多但是智商的因素讓我無法清除的弄明白。今天我的人機對弈終於完成了,我把我對alpha beta演算法的理解寫出來。希望大神們有什麼不同的意見能夠指出來,幫助我改正加深我對演算法的理解,小弟先行謝過。首先貼出如下這幅圖,我會細緻...
AlphaBeta剪枝演算法
關於alphabeta剪枝的文章太多,這個方法是所有其它搜尋方法的基礎,得多花些時間認真地理解。先把基本概念再回顧一遍 節點 在中國象棋中就是乙個棋盤的當前局面board,當然該輪到誰走棋也是確定的。這裡的圓形節點表示終止節點,在中國象棋裡就是一方被將死的情況 或者到達了搜尋的最大深度 後續不會再有...
Alpha Beta減枝演算法
演算法 採取minmax演算法,利用alpha beta演算法減枝。原理 首先,演算法是用於計算出當前下棋所產生的最好價值。那麼,定義自己的價值越高數值越大 正 對手的價值越高數值越小 負 下棋是你一手我一手的下,根據下棋的步驟,構建決策樹 所謂決策樹就是 每個節點是當前局面的評分,節點的基數層該自...