我正试图找出是否有解决方案来解决我遇到的问题。 我有X人和Y职位来安置他们。有时可能会有更多的人而不是职位,但在默认情况下X == Y. 我想分配人,使任何一个人必须移动的距离最小化。 所以,如果我有1-5人和A-E职位:
1 2 3 4 5
A B C D E
我已经拥有的琐碎的实现是分配{A2,B3,C4,D5,E1},这导致E比其他任何人都移动得更远,我希望如果比赛是{A1,B2,C3,D4 ,E5},这意味着其他所有人都会进一步发展,但最坏的情况要小得多。
我正在为每个人创建一个数组,包含每个位置,按距离排序(升序)。然后我对所有人的阵列进行反向排序,使得距离最佳位置最远的玩家是第一个。我将他分配到一个位置,然后从其他玩家的列表中删除该位置,并反向排序并重复直到所有位置都被填满。
这给了我合理的结果,但似乎非常低效(从每个数组中移除元素并每次都使用)
显然问题不是要处理人和距离到位,而是可以说是分配资源,每个资源都可以执行具有一定适应性的任务,我想避免使用的工具是对于给定的任务来说非常不合适,即使这意味着每个工具都在执行稍微不合适的任务,如果这是有道理的。
我怀疑有一些经典的优化问题我在这里反映,但我不知道哪一个。
答案 0 :(得分:1)
将每个人都移到中间位置。也就是说,对每个人来说;如果他们是i
最左边的人,那么他们会进入i
'位置。
最佳性证明:
跳过某人并不是有利的,因为你可以将这些人移动一个较小的数量,而你自己移动的数量较少,并且使用的移动量是相同的。
例如:A _ B _ _ C _ _ 1 2 3
A必须移动至少7个槽才能到达边界,然后将自己定位在正方形上
B必须移动至少5 ...
C必须移动至少2 ...
然后我们看到我们有1,2,3个动作要分配,所以跳过对方仍然总是在7 + 5 + 2 + 1 + 2 + 3动作中解决。在右边有字符的情况下,如果其中任何一个字符跳过最左边的字符,那么这意味着左字符必须在插槽的右侧进行额外的移动。
因此,跳跃会导致相同或更多的移动,这绝不是有利的。
现在,由于跳跃没有任何收获,所以唯一的操作是移动或停止。如果角色i
移动到i
之后的某个位置,那么他右边的某个人将不得不向左跳过,或者他们不能全部对齐。同样,如果字符i
在广告位i
之前结束,则左侧的某个人必须向右跳过他。
那不是那么糟糕