分配任务


10

在RTS中,要负责工人的任务(例如建造墙),工人如何确定要建造的墙?

玩家决定要在哪里建造哪些墙,但是他们不会将单个工人分配给各个墙角。在许多RTS游戏中,工作人员只是在做靠近他们的任务,但是在我的RTS中,我想使用在特定广场上明确执行任务的策略作为主要策略,因此,我不想让笨拙的工作人员聚集在某个地方并将任务进一步放置离开不做。

我使用示例建筑墙;它可能是开采石头,修路,收集木材等。关键是用户选择哪里,而不是谁。

工人只能在与可进入的正方形相邻的正方形上工作;在工作完成之前,他们自己做的正方形可能无法通行。

在此处输入图片说明

告诉工人1和2开采A,B,C和D广场。

他们可以每游戏滴答移动一个方块,而挖掘一个方块需要10个滴答。

您如何确定哪个工人开采哪个广场?

似乎不言而喻,1应该开采A,2应该开采C。

1距A 4平方,因此将在14滴答中完成挖掘。1接下来应该去哪里,为什么?

而且如果在B的正上方还有另一个正方形-E-怎么办?

工人用来决定下一步工作的逻辑是什么?


我将尝试在SO上碰碰运气:stackoverflow.com/questions/18634701/assigning-worker-tasks-如果mod可以关闭/删除它的话?
2013年

1
交叉发布不是一件好事。您在这里所做的事情是在浪费大家在下面回答您的时间。这是使用SE网站的一种非常自私的方式。
MichaelHouse

Answers:


6

将资源节点标记为忙,或限制可以使用树的工作程序数量。如果指定工作人员在某个点聚集,您真正要告诉他们的是收获最近的树木。

这样做的两条主要途径:现实的方法是在资源到达之前评估和标记资源。为避免奇怪的排队问题,请给工作人员一个视野范围以评估树木。这允许工作人员在走到补丁时接近特定的资源节点。这给出了有限的优化。

但是,许多RTS(SC和SC2)直到它们到达时才让工作人员评估节点。这会导致工作人员四处徘徊,直到找到资源节点为止。这样可以获得更多的技能/优化奖励((是否看到过出色的工作人员拆分?)。但是,您的大多数玩家只是将所有物品都装箱,单击,然后生气,因为他们都先去了相同的位置。

确切的实现将根据资源的分组方式而有所不同。在AoE中,树木和鱼类是不断扩大的,因此随着游戏的进行,收集者可能最终会走得很远。但是在SC和Red Alert这样的游戏中,资源位于离散的补丁中。因此,工作人员只需查看该特定补丁即可。

编辑后进行编辑:不要过分强调工作效率低下。我能想到的任何RTS都会导致工人效率低下。诸如员工拆分之类的事情源于玩家比游戏更擅长管理员工。我认为您可能是从程序员的角度出发,而不是从设计师的角度出发。可以通过调整数字并让节点在不连续的行程中可收获来解决单点剔问题。工人效率低下的原因很明显,因为您知道背后的系统。但是,如果您的游戏测试人员没有注意到,那么不要停留太久。


我已经编辑了问题,以阐明在我的RTS中,玩家可以决定要收获的资源块以及每个工作人员的任务类型,但不必微观管理哪个工作人员去哪里。
2013年

是的,我的游戏可能是非典型的,因为我确实希望用户选择要收获的瓷砖,并且这样做非常具有战略意义。但是我不希望用户必须对单个工作人员执行微任务来完成任务。我已在问题中添加了插图。
2013年

2

解决方案和思路:

解决方案:单击时可以将收集节点放在队列中,然后当作业升至队列顶部时,为工作人员找到加权的任务队列值,然后找到具有最佳加权的任务队列值的最近邻居(队列值)。

在您的示例中,最佳队列值可以为0(这意味着没有当前任务)。将他们必须行进的每个正方形(旅行时间)添加到队列值中,将每个任务的10(执行任务的时间)添加10。对于经过的每个时间单位,从每个工作人员的队列值中除去1(如果起始队列值是10,则在3个时间单位后,队列值将是7)。然后,您找到最近的邻居(如果多个工作线程具有相等的队列值),以查找应执行该任务的工作线程。

因此,对于您的示例,假设收集节点以字母顺序(AD)从任务队列中弹出,并且在队列弹出时不进行任何移动:

(values in format [total] = [preexisting value] + [current task distance])
A Pops: 
    queue value of 1: 4 = 0 + 4 
    queue value of 2: 19 = 0 + 19
    Assigned to 1.
B Pops:
    queue value of 1: 24 = 14 + 10 (distance to B from A) 
    queue value of 2: 9 = 0 + 9
    Assigned to 2.
C Pops:
    queue value of 1: 25 = 14 + 11
    queue value of 2: 20 = 19 + 1 
    Assigned to 2.
D Pops:
    queue value of 1: 36 = 25 + 11
    queue value of 2: 41 = 20 + 21
    Assigned to 1.

这样做的缺点是:计算量大。


思想:

您的游戏将如何处理被资源阻塞的情况?例如,如果存在一个4x4网格,其中每个节点都是资源,那么工作人员能否获得内部4个节点?如果不是,请确保工作人员不要只是闲着在那里尝试去找他们,而是可以给他们分配其他任务,并在外部节点完成后将收集外部节点之一的工人分配给内部节点(请放置它在工作人员的任务队列中)。


是的,资源的某些方块可能(暂时)不可访问。
威尔

1

尝试使用某种权重系统,如果正在收集树,则计算某种堆积惩罚以及某种距离奖励。(从A-> B点到木材需要多长时间,依此类推。然后您可以执行一些算法,检查最接近的木材,检查其重量,然后比较是否然后使用重量最轻的那一种。

当然,这需要一些微调。但想法很简单。


1

每个工作应具有a)重要性b)分配状态(分配的工人数量)

然后,工人可以决定每次都能获得最高“报酬”的工作。奖励由重要性除以分配的工人数除以他需要投资的时间(步行和完成工作)来计算。如果您的工人可以专门从事工作(例如砍柴),他们实际上会更喜欢他们可以有效完成的任务。如果只能在适当的时候继续工作,则当然应该只分配工作(例如,必须提供所需的资源)。

避免长时间取消某些工作(例如,因为工作距离很远)。重要性应随​​时间增加。在收获的情况下,重要性还应取决于目前有/需要多少类型的资源(例如,生产单位除以给定时期内请求的单位)。

为避免工人迅速改变工作,如果奖励显着提高(达到给定阈值),则只允许他们改变当前的工作。在计算每时间的奖励值时,您也可以将成本增加一倍,用于首次步行。此外,您应该让彼此而不是同时重新计算工人的最佳工作。

此外,在计算的奖励中添加一些随机性。这将使工人更好地分配给不同的工作(这样,他们不仅会“全力以赴”从事同一工作)。但是,通过依次重新计算一个工人的下一个最佳工作并调整已经分配的工人数量,已经减少了这种影响(同一工作上的更多工人减少了预期的报酬)。

如果您的工作只能分配给一个工人,则可能需要对算法进行一些调整。在这种情况下,请执行以下操作:工人选择每次获得的最高报酬的工作(重要性除以所需的个人时间)。如果另一个工人每次都能以更高的预期报酬来从事相同的工作,那么他将开始当前分配的工人。然后,新的“失业”工人试图找到另一份工作。在您的示例中,可能是这样的:

  • “ C”具有非常高的重要性。甚至工人1距离更远,工人1仍将自己分配给“ C”。
  • 工人2被分配到下一个,并且每次获得的“ C”(步行较少)的报酬更高。因此它将工人1踢下了工作,并将其自己分配给“ C”。这并没有花费时间,因为我们仍处于相同的仿真时间范围内。因此,用户将看不到作业的这种重新分配。
  • 然后,工人1正在寻找另一份工作。工人1不会将工人2从“ C”中踢出来,因为每次的报酬都不是更好。因此,他被分配为“ A”或“ B”(取决于重要性)。同样,这仍在相同的仿真时间段内。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.