これは、私が理解しているような動的プログラミングを初めて使用する試みです。私はこの興味深い問題に取り組むためにしようとしている:A* Admissible Heuristic for die rolling on gridハスケルでの動的プログラミングメモ帳
q
機能は、ダイの向きを追跡すること、後方再帰を試みます(visited
は、技術的に次のセルであるが、「訪問」の再帰的に防ぐために、無限の前と後のループ)。それが提供する答えが最善の解決策であるかどうかはわかりませんが、それにもかかわらず、答えを提供するようです。
私はそれをスピードアップするためにメモ化のいくつかの種類を実装する方法についてのアイデアを望んでいる - 私はの組み合わせのリストに代わり!!
のlookup
とmemoized_fib
のようなもの(hereを見て)、マッピングq
を実装しようとして失敗しました(i,j)
ですが、Nothing
を取得しました。
Haskellコード:
import Data.List (minimumBy)
import Data.Ord (comparing)
fst3 (a,b,c) = a
rollDie [email protected][left,right,top,bottom,front,back] move
| move == "U" = [left,right,front,back,bottom,top]
| move == "D" = [left,right,back,front,top,bottom]
| move == "L" = [top,bottom,right,left,front,back]
| move == "R" = [bottom,top,left,right,front,back]
dieTop die = die!!2
leftBorder = max 0 (min startColumn endColumn - 1)
rightBorder = min columns (max startColumn endColumn + 1)
topBorder = endRow
bottomBorder = startRow
infinity = 6*rows*columns
rows = 10
columns = 10
startRow = 1
startColumn = 1
endRow = 6
endColumn = 6
dieStartingOrientation = [4,3,1,6,2,5] --left,right,top,bottom,front,back
q i j visited
| i < bottomBorder || i > topBorder
|| j < leftBorder || j > rightBorder = (infinity,[1..6],[])
| i == startRow && j == startColumn = (dieTop dieStartingOrientation,dieStartingOrientation,[])
| otherwise = (pathCost + dieTop newDieState,newDieState,move:moves)
where previous
| visited == (i, j-1) = zip [q i (j+1) (i,j),q (i-1) j (i,j)] ["L","U"]
| visited == (i, j+1) = zip [q i (j-1) (i,j),q (i-1) j (i,j)] ["R","U"]
| otherwise = zip [q i (j-1) (i,j),q i (j+1) (i,j),q (i-1) j (i,j)] ["R","L","U"]
((pathCost,dieState,moves),move) = minimumBy (comparing (fst3 . fst)) previous
newDieState = rollDie dieState move
main = putStrLn (show $ q endRow endColumn (endRow,endColumn))
を、私はあなたが動作しませんでしたあなたの試みを掲載場合、それが役立つだろうと思います。 – svick
私は数年前、ハスケルでのメモ帳の問題に対して頭を叩きました。詳細を覚えることはできませんが、最終的には、配列のインスタンスを定義して、指定されたインデックスの値が他の配列要素で計算されるようにすることで、私は成功しました(スペースリークのような他の問題があったかもしれません)。レイジーな評価は、すべての配列要素を正しい順序で「人口」にするように思えました。これは少し魔法のようでした(私は満足していたよりも安心していましたが)。 IOWのデータ構造 "リード"、関数 "フォロー"。 –
@j_random_hacker適用されたダイスアルゴリズムをチェックしてください - テーブルなしで300x300の2.13秒で、ポールのA *、クールな何かよりも小さい合計? http://stackoverflow.com/questions/16547724/a-admissible-heuristic-for-die-rolling-on-grid/16629766#16629766 –