0

我正在尝试对 2048 游戏进行 Netlogo 模拟。我已经实现了三个由权重参数确定的启发式函数,并希望使用行为空间来运行模拟并检查赢得这场比赛的最佳策略是什么。

过程搜索使用导出/导入世界原语来搜索可能的移动并选择启发式函数具有最高值的移动。

问题是这个过程非常慢(由于每轮调用四次 import-world 函数)。你有什么想法如何在不经常导出和导入世界的情况下实现这一点吗?

这是我的 AI 入门课程的一个项目。几天后到期,我似乎找不到任何解决方案。

代码的相关部分如下。程序move-(direction)都正常工作且变量可移动?如果正方形可以沿所述方向移动,则为真,否则为假。它在move-(direction)调用的过程moveable-check中进行检查。

非常感谢您的帮助。:)

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
4

1 回答 1

0

您需要能够保存和恢复的最重要和最困难的信息是方块。import-world没有and很容易做到export-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 90or rt 90
于 2017-02-14T20:01:45.647 回答