2017-02-14 66 views
0

我試圖做一個2048遊戲的Netlogo模擬。我已經實現了三個由權重參數確定的啓發函數,並希望使用行爲空間來運行模擬,並檢查贏得此遊戲的最佳策略是什麼。NetLogo:2048機器人優化

程序搜索使用導出/導入世界基元搜索可能的移動並選擇啓發函數具有最高值的移動。

問題是這個過程非常緩慢(由於導入世界函數每次被稱爲四次)。如果不經常導出和導入世界,您是否有任何想法來實現這一點?

這是我介紹AI類的項目。這是在幾天後,我似乎無法找到任何解決方案。

代碼的相關部分如下。程序移動 - (方向)所有工作正常和變量可移動?如果方塊可以在所述方向上移動則爲true,否則爲false。它在程序中檢查移動檢查調用移動 - (方向)

我非常感謝您的幫助。 :)

to search 

    let x 0 
    let direction "down" 

    export-world "state.csv" 
    move-up 
    ifelse not any? squares with [moveable?] 
    [set h-value -5000] 
    [set x h-value 
    set direction "up" 
    import-world "state.csv"] 


    export-world "state.csv" 
    move-down 
    ifelse not any? squares with [moveable?] 
    [set h-value -5000] 
    [if h-value > x 
     [set x h-value 
     set direction "down"] 
    import-world "state.csv"] 


    export-world "state.csv" 
    move-left 
    ifelse not any? squares with [moveable?] 
    [set h-value -5000] 
    [if h-value > x 
     [set x h-value 
     set direction "left"] 
    import-world "state.csv"] 

    export-world "state.csv" 
    move-right 
    ifelse not any? squares with [moveable?] 
    [set h-value -5000] 
    [if h-value > x 
     [set x h-value 
     set direction "right"] 
    import-world "state.csv"] 

    ifelse direction = "up" 
    [move-up 
     print "up"] 
    [ifelse direction = "down" 
     [move-down 
     print "down"] 
     [ifelse direction = "right" 
     [move-right 
      print "right"] 
     [move-left 
      print "left"]]] 
    if not any? squares with [moveable?] 
    [ 
     ask squares [set heading heading + 90] 
     moveable-check 
     if not any? squares with [moveable?] 
      [ask squares [set heading heading + 90] 
      moveable-check 
      if not any? squares with [moveable?] 
       [ask squares [set heading heading + 90] 
       moveable-check 
       if not any? squares with [moveable?] 
        [stop]]] 
     ] 
end 

回答

0

您需要能夠保存和恢復的最重要,最困難的信息是正方形。這是很容易沒有import-worldexport-world做(注意,以下使用的NetLogo 6語法;如果你還在的NetLogo 5,你需要使用的foreach老任務語法):

to-report serialize-state 
    report [(list xcor ycor value)] of squares 
end 

to restore-state [ state ] 
    clear-squares 
    foreach state [ [sq] -> 
    create-squares 1 [ 
     setxy (item 0 sq) (item 1 sq) 
     set heading 0 ;; or whatever 
     set value item 2 sq 
    ] 
    ] 
end 
上面的

value只是顯示瞭如何存儲你的方塊的任意變量。我不確定你有哪些數據與他們關聯或需要恢復。這個代碼背後的想法是,你將有關正方形的信息存儲在列表中,其中每個內部列表包含一個正方形的數據。你使用的方式是:

let state serialize-state 
;; make changes to state that you want to investigate 
restore-state state 

你可能需要存儲一些全局變量等。這些可以存儲在本地變量或state列表(這是更一般的,但更難實施)。

一些其他的想法:

  • 現在它看起來像你只想找一個狀態進取,在只有一個,那將被放置在新廣場可能的位置(確保你不要通過知道新廣場將在哪裏作弊)。最終,您可能想要使用某種樹搜索進行隨意查找。這棵樹真的很大。如果你這樣做,你會想要使用修剪策略,如:https://en.wikipedia.org/wiki/Alpha%E2%80%93beta_pruning。此外,這使得國家恢復工作更加困難,但仍然可行。你將會存儲一堆狀態而不是一個狀態。
  • 而不是set heading heading + 90你可以做right 90rt 90