Javascript 分配工人任务
在模拟中,工作人员必须在地图周围移动以执行任务 每次模拟“滴答”时,它们可以移动一个正方形 一旦他们与任务相邻,执行该任务需要10个刻度 任务方块不能通过。带工人的广场不能通过。一个广场上可以有多个工人工作 工人之间没有竞争;目标是尽快完成所有任务 添加:理想情况下,算法应易于概念化,易于实现。这不是每个人都想要的吗?这是一个很大的优势,如果它是有效的,例如,模型可以更新和重用,而不是经常从头开始重新计算。理想情况下,它将能够使用局部最优解,这样它就不会试图强行解决NP问题,而是避免过于贪婪和提前思考,而不是本质上的随机游荡,工人们很少注意其他人的计划 以下是一个例子: 工人1和2必须完成广场A、B、C和D上的任务 你如何决定哪个工人做哪个任务 1应该做A,2应该做C,这似乎是不言而喻的 1距离A有4个正方形,因此将在14个刻度内完成。我下一步应该去哪里,为什么 如果有另一个任务——E——直接放在B上面呢 工人用什么逻辑来决定下一步的行动方向 我所尝试的: 这是一个业余RTS游戏,我试着让空闲的工人去做最近的任务,或者去做其他工人都不做的最近的任务Javascript 分配工人任务,javascript,algorithm,artificial-intelligence,Javascript,Algorithm,Artificial Intelligence,在模拟中,工作人员必须在地图周围移动以执行任务 每次模拟“滴答”时,它们可以移动一个正方形 一旦他们与任务相邻,执行该任务需要10个刻度 任务方块不能通过。带工人的广场不能通过。一个广场上可以有多个工人工作 工人之间没有竞争;目标是尽快完成所有任务 添加:理想情况下,算法应易于概念化,易于实现。这不是每个人都想要的吗?这是一个很大的优势,如果它是有效的,例如,模型可以更新和重用,而不是经常从头开始重新计算。理想情况下,它将能够使用局部最优解,这样它就不会试图强行解决NP问题,而是避免过于贪婪和提
这种贪婪的方法被证明是非常低效的,玩家测试表明它是站不住脚的。因为战略性的采矿/建筑/耕作是游戏的关键,而且我不希望玩家对所有工人进行微观管理和路由,所以我正在寻找一种工人可以使用的公平合理的优化算法。即使只有一名工人,这也是一个NP完全优化问题(这就变成了旅行推销员的问题)所以让我们忘掉“最优”吧 如果您知道工作人员1将处理任务A1、A2、…,工作人员2将处理任务B1、B2、…,等等,那么您可以在做出该决定后,尝试逐个解决独立旅行推销员问题,并获得所有工作人员的时间表和路径 然而,问题是,在解决一组旅行推销员问题之前,您无法知道工人完成一组任务A1、A2……需要多长时间,因为步行时间会影响执行任务的总时间 因为这只是一个游戏,工人们可以被认为不是最佳思考者,所以我会使用一个随机过程:
因为这是一款RTS游戏,我会尝试选择一种简单、快速、易懂的方法
请记住:无论你选择什么算法,都会有一个失败惨重的例子。这听起来确实很像(已经提到的)针对多个代理的旅行商问题(TSP)。这实际上是一个类似于多背包(MKP)的问题甚至是箱子包装() 有一组算法可能适合这种情况,称为“蚁群优化”(ACO) 为了将两者结合起来,有一些实现使用ACO来解决MKP问题;在这种情况下,这似乎是一种很好的方法,例如:
我建议采用类似于的方法,但更精细:
- 为每个工作人员初始化一个空工作队列,以及完成此队列所需的时间
z
- 为每个任务指定一个属性
,设置为0。它表示根据当前计划此任务“已处理”的程度d
- 重复此操作,直到所有工人至少有一个工作和(
>某个固定值或经过一定时间):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
- 计算
- 将
- 以最小的