Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/434.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 分配工人任务_Javascript_Algorithm_Artificial Intelligence - Fatal编程技术网

Javascript 分配工人任务

Javascript 分配工人任务,javascript,algorithm,artificial-intelligence,Javascript,Algorithm,Artificial Intelligence,在模拟中,工作人员必须在地图周围移动以执行任务 每次模拟“滴答”时,它们可以移动一个正方形 一旦他们与任务相邻,执行该任务需要10个刻度 任务方块不能通过。带工人的广场不能通过。一个广场上可以有多个工人工作 工人之间没有竞争;目标是尽快完成所有任务 添加:理想情况下,算法应易于概念化,易于实现。这不是每个人都想要的吗?这是一个很大的优势,如果它是有效的,例如,模型可以更新和重用,而不是经常从头开始重新计算。理想情况下,它将能够使用局部最优解,这样它就不会试图强行解决NP问题,而是避免过于贪婪和提

在模拟中,工作人员必须在地图周围移动以执行任务

每次模拟“滴答”时,它们可以移动一个正方形

一旦他们与任务相邻,执行该任务需要10个刻度

任务方块不能通过。带工人的广场不能通过。一个广场上可以有多个工人工作

工人之间没有竞争;目标是尽快完成所有任务

添加:理想情况下,算法应易于概念化,易于实现。这不是每个人都想要的吗?这是一个很大的优势,如果它是有效的,例如,模型可以更新和重用,而不是经常从头开始重新计算。理想情况下,它将能够使用局部最优解,这样它就不会试图强行解决NP问题,而是避免过于贪婪和提前思考,而不是本质上的随机游荡,工人们很少注意其他人的计划

以下是一个例子:

工人1和2必须完成广场A、B、C和D上的任务

你如何决定哪个工人做哪个任务

1应该做A,2应该做C,这似乎是不言而喻的

1距离A有4个正方形,因此将在14个刻度内完成。我下一步应该去哪里,为什么

如果有另一个任务——E——直接放在B上面呢

工人用什么逻辑来决定下一步的行动方向

我所尝试的:

这是一个业余RTS游戏,我试着让空闲的工人去做最近的任务,或者去做其他工人都不做的最近的任务


这种贪婪的方法被证明是非常低效的,玩家测试表明它是站不住脚的。因为战略性的采矿/建筑/耕作是游戏的关键,而且我不希望玩家对所有工人进行微观管理和路由,所以我正在寻找一种工人可以使用的公平合理的优化算法。

即使只有一名工人,这也是一个NP完全优化问题(这就变成了旅行推销员的问题)所以让我们忘掉“最优”吧

如果您知道工作人员1将处理任务A1、A2、…,工作人员2将处理任务B1、B2、…,等等,那么您可以在做出该决定后,尝试逐个解决独立旅行推销员问题,并获得所有工作人员的时间表和路径

然而,问题是,在解决一组旅行推销员问题之前,您无法知道工人完成一组任务A1、A2……需要多长时间,因为步行时间会影响执行任务的总时间

因为这只是一个游戏,工人们可以被认为不是最佳思考者,所以我会使用一个随机过程:

  • 将所有任务随机分配给所有工人
  • 使用贪婪算法计算工人任务组中每个工人的行走时间上限
  • 尝试随机移动,或者将一个任务从一个工作人员移动到另一个工作人员,或者在两个工作人员之间交换任务
  • 根据禁忌搜索或模拟退火原则接受该移动,这取决于该移动是否减少了最大执行时间的上限(行走时间+任务执行时间),因此目标是尽早完成最后一个任务
  • 在N次迭代后,停止并计算旅行商子问题的更好的解决方案,例如使用随机搜索,或者如果问题很小(例如每个工人少于10个任务),则显式地进行计算

  • 因为这是一款RTS游戏,我会尝试选择一种简单、快速、易懂的方法

  • 它必须快速,因为性能很重要
  • 必须很容易理解为什么一个工人在这里和那里,因为在游戏中你希望仆从按照预期行事。不要试图为玩家着想
  • 首先,当然,我会尝试贪婪的方法。但是你已经提到它根本不起作用

    接下来,我会尝试类似于二阶贪婪算法的方法。每个工作人员选择最近的任务a,然后选择a旁边最近的任务B。他们尝试(!)选择迄今为止没有人选择过的任务。类似的方法


    请记住:无论你选择什么算法,都会有一个失败惨重的例子。

    这听起来确实很像(已经提到的)针对多个代理的旅行商问题(TSP)。这实际上是一个类似于多背包(MKP)的问题甚至是箱子包装()

    有一组算法可能适合这种情况,称为“蚁群优化”(ACO)

    为了将两者结合起来,有一些实现使用ACO来解决MKP问题;在这种情况下,这似乎是一种很好的方法,例如:


    我建议采用类似于的方法,但更精细:

    • 为每个工作人员初始化一个空工作队列,以及完成此队列所需的时间
      z
    • 为每个任务指定一个属性
      d
      ,设置为0。它表示根据当前计划此任务“已处理”的程度
    • 重复此操作,直到所有工人至少有一个工作
      z
      >某个固定值经过一定时间):
      • 以最小的
        z
        选择一个工人
        w
        • p
          设置为
          w
          队列中最新条目的位置,或者如果 队列为空
        • 按距离
          p
          • 计算
            距离/d
          • 如果找到此值的最小值,请将此任务添加到工作队列,将到任务的距离+7添加到
            z    A   B   C   D  
            1  10  22  24   -
            2  29  19  18   -
            
                A   B   C   D  
            1  10  22  24   -
            2   4  0    0   -
            
                A   B   slack    A  B
            1  10  22     0     10 22
            2  21  11  (-)7     14  4
            
            1 [A, B, C, D]
            2 [C, B, A, D]
            
            1 [A=3+10, B=8+10, C=1+10, D=20+10]
            2 [C=7+10, B=1+10, A=10+10, D=11+10]
            
            1 [A=13, B=18, C=11, D=30]
            2 [C=17, B=11, A=20, D=21]
            
            1 [A=13, B=31, C=42, D=72]
            2 [C=17, B=28, A=48, D=69]
            
            1 [A=13, B=31, C=42, D=72]
            2 [C=17, B=28, A=48, D=69]
            
            1 [A=13, B=31, C=42, D=72]
            2 [C=17, B=28, D=59]
            
            1 [A=13, C=32, D=62]
            2 [C=17, B=28, D=59]
            
            1 [A=13, D=24]
            2 [C=17, B=28, D=59]
            
            1 [A=13, D=24]
            2 [C=17, B=28]
            
            Let Arrive(W, T, L) be an arrival event of worker W 
              at task T starting from previous location L, traveling the shortest path
            Let Complete(W, T) be a completion event for worker W of task T
            
            For each worker W, place Arrive(W, T_W1, S_W) on the queue
            While events are left on the queue
              Remove an event E
              If E is an arrival Arrive(W, TW_i, L) 
                If TW_i has no worker yet, 
                  Assign TW_i to W
                  Schedule a future event Complete(W, TW_i) 10 time units in the future.
                Else // T has a worker
                  Schedule Arrive(W, TW_{i+1}, L), if TW_{i+1} exists
              Else E is a completion Complete(W, TW_i)
                Schedule Arrive(W, TW_{i+1}, TW_i), if TW_{i+1} exists