對於A 演算法 alpha beta演算法的思考

2021-08-22 19:02:54 字數 2692 閱讀 4436

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演算法減枝。原理 首先,演算法是用於計算出當前下棋所產生的最好價值。那麼,定義自己的價值越高數值越大 正 對手的價值越高數值越小 負 下棋是你一手我一手的下,根據下棋的步驟,構建決策樹 所謂決策樹就是 每個節點是當前局面的評分,節點的基數層該自...