想象一个笛卡尔的游戏场。它有3个旗帜在3个不同的位置。也有3个球员在3个不同的位置。目标是让一个球员的位置的旗帜。我试图分配哪个球员应该去哪个旗帜通过最小化的总距离由所有3个球员。我正在寻找一个好的Python逻辑来实现这一点,并确定哪个球员应该去哪个旗帜。
# This is the dictionary of distances between each player and each flag.
# (A,B,C) are the flag IDs
# (x,y,z) are the player IDs
# so, the distance between Flag A and Player x is 12 units and so on
dist_dict = {
"A": [{"x": 12}, {"y": 10}, {"z": 20}],
"B": [{"x": 14}, {"y": 18}, {"z": 25}],
"C": [{"x": 8}, {"y": 15}, {"z": 16}],
}
在这种情况下,预期的输出为
[{'A':'y'},{'B':'x'},{'C':'z'}]
因此,要考虑的约束条件是:
1.一名球员只能被分配到一面旗帜
1.任何玩家只需要到达旗帜一次
1.选择所有三个玩家行进的总距离最小的场景。因此,上面的玩家'x'被分配到旗'B',即使'x'更接近旗'C'
数据不需要以我在这里展示的方式存储。如果存储距离数据更容易获得所需的输出,请推荐一种不同的方法
3条答案
按热度按时间y53ybaqx1#
内部数据结构(
dist_dict
内部)也可以是一个字典,这样您就可以通过键访问所有的距离值。因为你只有三个玩家,所以可以迭代所有可能的玩家到旗帜的分配,看看哪一个会导致最小的总距离。有一个
itertools
函数可以获得这个可迭代对象:permutations
。ux6nzvsh2#
有不同的方法来解决这个问题。这里有一个不太简短的答案和解释:
输出:
iyr7buue3#
使用
itertools.permutations
,并使用一个计算总距离的函数最小化。(您可以对球员或旗帜进行排列。在本例中,我对旗帜进行排列。)另一个选项使用
pandas
和numpy
,这更复杂,但如果你有大量的旗帜和球员,可能会工作得更快。