试图为行星战争机器人制作热图,显示哪支军队影响最大

时间:2012-04-25 05:31:26

标签: python python-2.7 pygame pydev

我正在尝试为行星战争机器人创建一个热图,表明行星受到的影响。 初始地图如下所示:http://imgur.com/a/rPVnl#0

理想情况下,红色星球的值应为-1,蓝色星球的值应为1,标记为1的行星的值应为0.(或0到1,平均值为0.5)< / p>

我的初始分析代码如下,但输出的结果介于0.13和7.23之间。

for p in gameinfo.planets: #gameinfo.planets returns {pid:planet_object}
        planet = gameinfo.planets[p]
        own_value = 1
        for q in gameinfo.my_planets.values():
            if q != planet:
                q_value = q.num_ships / planet.distance_to(q)
                own_value = own_value + q_value

        enemy_value = 1
        for q in gameinfo.enemy_planets.values():
            if q != planet:
                q_value = q.num_ships / planet.distance_to(q)
                enemy_value = enemy_value + q_value

        self.heatmap[p] = own_value/enemy_value

我还尝试添加一些代码来控制范围从0到1

highest = self.heatmap.keys()[0]
    lowest = self.heatmap.keys()[0]
    for p in gameinfo.planets.keys():
        if self.heatmap[p] > highest:
            highest = self.heatmap[p]
        elif self.heatmap[p] < lowest:
            lowest = self.heatmap[p]
    map_range = highest-lowest

    for p in gameinfo.planets.keys():
        self.heatmap[p] = self.heatmap[p]/map_range

    self.heatmap_mean = sum(self.heatmap.values(), 0.0) / len(self.heatmap)

值最终介于0和1之间,但均值为0.245? (实际值也在0.019到1.019之间。)

2 个答案:

答案 0 :(得分:3)

我已经解决了我的问题,这就是解决方案的样子。

#HEATMAP ANALYSIS
    for p in gameinfo.planets:

        ave_self_value = 0
        for q in gameinfo.my_planets:
            if q != p:
                ave_self_value = ave_self_value + (self.planet_distances[p][q] * gameinfo.planets[q].num_ships / self.own_strength)

        ave_enemy_value = 0
        for q in gameinfo.enemy_planets:
            if q != p:
                ave_enemy_value = ave_enemy_value + (self.planet_distances[p][q] * gameinfo.planets[q].num_ships / self.enemy_strength)

        self.heatmap[p] = ave_enemy_value - ave_self_value

    hmin, hmax = min(self.heatmap.values()), max(self.heatmap.values())

    for h in self.heatmap.keys():
        self.heatmap[h] = 2 * (self.heatmap[h] - hmin) / (hmax - hmin) - 1

    self.heatmap_mean = sum(self.heatmap.values(), 0.0) / len(self.heatmap)
    #END HEATMAP ANALYSIS

答案 1 :(得分:0)

for p in foo:
    ...
    ...
    for q in bar:
        ...
        if q != p:
            q_value = some_value / another_value
            own_value = own_value + q_value

粗略简化道歉。说foo[1, 2, 3, 4, 5],栏为[1, 5]

第一次,p1q需要1,所以q==p。接下来,q需要5,现在q!=pown_value会累积q_value,我认为这是一个小于一的正数。

但第二次,p2q需要1,所以q!=pown_value会增加一小部分。然后q需要5,所以q!=p仍然是own_value,所以(some_value / another_value) + (some_value / another_value)再次上升到相同的分数。这就是问题所在:q打破-1到1的比例。你有时得到7.23因为p不等于for x in foo: for y in bar: 的次数。

中没有任何内容
for x in foo

关注规范化for q in bar的建设 - 仅{{1}}。