嗨,我正在尝试生成所有可能的建筑工人组合。(让我解释一下我的情况):
我在玩minecraft。在这个mod中,你有殖民者,他们可以被分配到建筑物中工作。这些工人拥有技能,并为他们分配了分数。(比如敏捷度:20,力量:5等等)如果指派一个技能与之相得益彰的殖民者,建筑物的工作表现会更好
所以我创建了一个所有工人和建筑物的数据库,希望优化哪些工人在哪些建筑物工作
buildings_dict = {1: ['Strength', 'Focus'],
2: ['Adaptability', 'Athletics'],
3: ['Knowledge', 'Dexterity'],
4: ['Adaptability', 'Knowledge'],
6: ['Stamina', 'Athletics'],
5: ['Athletics', 'Stamina'],
7: ['Focus', 'Agility'],
8: ['Dexterity', 'Creativity'],
9: ['Strength', 'Focus'],
10: ['Adaptability', 'Stamina'],
11: ['Agility', 'Adaptability'],
12: ['Mana', 'Knowledge'],
13: ['Strength', 'Stamina'],
14: ['Athletics', 'Strength'],
15: ['Creativity', 'Dexterity'],
16: ['Knowledge', 'Mana'],
17: ['Agility', 'Adaptability']}
workers_dict = {3: {'Mana': 30,
'Focus': 1,
'Agility': 3,
'Stamina': 3,
'Knowlege': 30,
'Strenght': 8,
'Athletics': 13,
'Dexterity': 6,
'Creativity': 10,
'Adaptability': 10,
'Intelligence': 10},
4: {'Mana': 29,
'Focus': 32,
'Agility': 22,
'Stamina': 28,
'Knowlege': 21,
'Strenght': 30,
'Athletics': 20,
'Dexterity': 31,
'Creativity': 31,
'Adaptability': 8,
'Intelligence': 18},
5: {'Mana': 13,
'Focus': 1,
'Agility': 9,
'Stamina': 27,
'Knowlege': 9,
'Strenght': 13,
'Athletics': 15,
'Dexterity': 21,
'Creativity': 16,
'Adaptability': 13,
'Intelligence': 28},
6: {'Mana': 17,
'Focus': 14,
'Agility': 10,
'Stamina': 17,
'Knowlege': 13,
'Strenght': 5,
'Athletics': 10,
'Dexterity': 15,
'Creativity': 1,
'Adaptability': 11,
'Intelligence': 4},
7: {'Mana': 1,
'Focus': 8,
'Agility': 6,
'Stamina': 27,
'Knowlege': 11,
'Strenght': 17,
'Athletics': 30,
'Dexterity': 1,
'Creativity': 5,
'Adaptability': 11,
'Intelligence': 5},
8: {'Mana': 6,
'Focus': 1,
'Agility': 12,
'Stamina': 30,
'Knowlege': 20,
'Strenght': 15,
'Athletics': 30,
'Dexterity': 9,
'Creativity': 17,
'Adaptability': 30,
'Intelligence': 19},
9: {'Mana': 5,
'Focus': 7,
'Agility': 19,
'Stamina': 5,
'Knowlege': 22,
'Strenght': 18,
'Athletics': 26,
'Dexterity': 10,
'Creativity': 24,
'Adaptability': 20,
'Intelligence': 22},
10: {'Mana': 8,
'Focus': 12,
'Agility': 27,
'Stamina': 3,
'Knowlege': 17,
'Strenght': 1,
'Athletics': 5,
'Dexterity': 9,
'Creativity': 7,
'Adaptability': 29,
'Intelligence': 1},
11: {'Mana': 1,
'Focus': 4,
'Agility': 5,
'Stamina': 30,
'Knowlege': 16,
'Strenght': 11,
'Athletics': 28,
'Dexterity': 11,
'Creativity': 5,
'Adaptability': 12,
'Intelligence': 4},
12: {'Mana': 7,
'Focus': 1,
'Agility': 17,
'Stamina': 25,
'Knowlege': 23,
'Strenght': 4,
'Athletics': 8,
'Dexterity': 26,
'Creativity': 15,
'Adaptability': 29,
'Intelligence': 22},
13: {'Mana': 2,
'Focus': 1,
'Agility': 5,
'Stamina': 21,
'Knowlege': 24,
'Strenght': 18,
'Athletics': 20,
'Dexterity': 10,
'Creativity': 12,
'Adaptability': 30,
'Intelligence': 5},
14: {'Mana': 9,
'Focus': 16,
'Agility': 14,
'Stamina': 25,
'Knowlege': 14,
'Strenght': 24,
'Athletics': 30,
'Dexterity': 9,
'Creativity': 19,
'Adaptability': 23,
'Intelligence': 18},
15: {'Mana': 23,
'Focus': 15,
'Agility': 5,
'Stamina': 12,
'Knowlege': 24,
'Strenght': 12,
'Athletics': 20,
'Dexterity': 29,
'Creativity': 5,
'Adaptability': 19,
'Intelligence': 12},
17: {'Mana': 21,
'Focus': 23,
'Agility': 30,
'Stamina': 18,
'Knowlege': 27,
'Strenght': 7,
'Athletics': 30,
'Dexterity': 10,
'Creativity': 5,
'Adaptability': 22,
'Intelligence': 18},
18: {'Mana': 11,
'Focus': 11,
'Agility': 4,
'Stamina': 7,
'Knowlege': 28,
'Strenght': 11,
'Athletics': 20,
'Dexterity': 28,
'Creativity': 13,
'Adaptability': 12,
'Intelligence': 30},
19: {'Mana': 11,
'Focus': 11,
'Agility': 4,
'Stamina': 7,
'Knowlege': 28,
'Strenght': 11,
'Athletics': 20,
'Dexterity': 28,
'Creativity': 13,
'Adaptability': 12,
'Intelligence': 30},
20: {'Mana': 15,
'Focus': 20,
'Agility': 28,
'Stamina': 22,
'Knowlege': 18,
'Strenght': 15,
'Athletics': 23,
'Dexterity': 19,
'Creativity': 20,
'Adaptability': 27,
'Intelligence': 20},
21: {'Mana': 30,
'Focus': 7,
'Agility': 9,
'Stamina': 7,
'Knowlege': 30,
'Strenght': 3,
'Athletics': 6,
'Dexterity': 17,
'Creativity': 4,
'Adaptability': 11,
'Intelligence': 28},
22: {'Mana': 9,
'Focus': 10,
'Agility': 28,
'Stamina': 26,
'Knowlege': 1,
'Strenght': 8,
'Athletics': 5,
'Dexterity': 26,
'Creativity': 1,
'Adaptability': 14,
'Intelligence': 16},
23: {'Mana': 4,
'Focus': 14,
'Agility': 19,
'Stamina': 5,
'Knowledge': 21,
'Strength': 25,
'Athletics': 12,
'Dexterity': 23,
'Creativity': 26,
'Adaptability': 21,
'Intelligence': 22},
24: {'Mana': 1,
'Focus': 1,
'Agility': 18,
'Stamina': 24,
'Knowledge': 25,
'Strength': 20,
'Athletics': 9,
'Dexterity': 14,
'Creativity': 19,
'Adaptability': 30,
'Intelligence': 7},
25: {'Mana': 12,
'Focus': 13,
'Agility': 21,
'Stamina': 23,
'Knowledge': 11,
'Strength': 16,
'Athletics': 18,
'Dexterity': 24,
'Creativity': 1,
'Adaptability': 20,
'Intelligence': 1},
26: {'Mana': 10,
'Focus': 14,
'Agility': 12,
'Stamina': 27,
'Knowledge': 17,
'Strength': 24,
'Athletics': 23,
'Dexterity': 21,
'Creativity': 5,
'Adaptability': 5,
'Intelligence': 28},
27: {'Mana': 11,
'Focus': 23,
'Agility': 21,
'Stamina': 12,
'Knowledge': 15,
'Strength': 24,
'Athletics': 17,
'Dexterity': 12,
'Creativity': 1,
'Adaptability': 11,
'Intelligence': 9},
28: {'Mana': 7,
'Focus': 21,
'Agility': 22,
'Stamina': 21,
'Knowledge': 14,
'Strength': 15,
'Athletics': 9,
'Dexterity': 16,
'Creativity': 2,
'Adaptability': 11,
'Intelligence': 5},
29: {'Mana': 12,
'Focus': 25,
'Agility': 29,
'Stamina': 6,
'Knowledge': 7,
'Strength': 10,
'Athletics': 14,
'Dexterity': 15,
'Creativity': 6,
'Adaptability': 13,
'Intelligence': 29},
30: {'Mana': 21,
'Focus': 17,
'Agility': 8,
'Stamina': 21,
'Knowledge': 22,
'Strength': 22,
'Athletics': 26,
'Dexterity': 13,
'Creativity': 15,
'Adaptability': 24,
'Intelligence': 13}}
很抱歉代码块太长,是的,我意识到ID不一定正确(我想让它重现)
因此,我使用itertools.permutations
让所有工人组合到建筑物中:
import itertools
workers_ls = list(workers_dict.keys())
combinations = list(itertools.permutations(workers_ls, len(buildings_dict))
(我计划在之后为组合打分)
显然,这辆车从来没有跑完,因为它大约是27辆1×10²⁸. 我想知道我的问题是否有另一种解决方案,或者是一种不用经过每种组合就能确定最佳解决方案的方法。(我愿意使用其他编码语言)
谢谢
我假设你想使总产量最大化。例如,当未分配工人时,总产量为零(或不依赖于工人分配的某个常数)。如果将工人与
Agility
2和Focus
3与属性为[Agility, Focus]
的建筑配对,则将2+3=5
添加到总产量中像这样的问题通常用线性规划来解决。我将使用
pulp
来帮助制定线性规划问题。我还建议查看Julia
包JuMP
计算总产量的实际规则可能更复杂。如果(1)可以定义生产矩阵的一些模拟值,(2)总产量可以表示为(工人、建筑)对生产的总和,则仍然可以使用线性规划
这里有两种方法来解决这个问题。第一个允许每个建筑有多个工人,第二个不允许
设置
允许每个建筑有多个工人
每栋建筑最多一名工人
我们可以看到,当我们允许每个建筑有多个工人时,总产量更高。这是意料之中的,因为最大化问题具有较少的约束
我们还可以将优化生产与工人随机分配到建筑物时的生产进行比较。垂直线对应于最佳生产。看起来我们做得很好
相关问题 更多 >
编程相关推荐