【问题标题】:Trying to create a heatmap for a planet wars bot which shows which army has the most influence尝试为星球大战机器人创建热图,显示哪支军队的影响力最大
【发布时间】:2012-04-25 05:31:25
【问题描述】:

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

理想情况下,红色行星的值应为 -1,蓝色行星的值应为 1,标记为 1 的行星的值应为 0。(或 0 到 1,0.5 的平均值可行)

我的初始分析代码如下,但它输出的结果在 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)。

【问题讨论】:

    标签: python python-2.7 pygame pydev


    【解决方案1】:

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

    #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
    

    【讨论】:

    • 恭喜修复!如果可以,请确保将您的答案标记为“已接受”,以便其他人能够从您的成功中学习。干杯~
    • @AndrewKozak 还有12个小时!叹息....新的实际发布堆栈溢出。在过去一年左右的时间里,我只是将其用作资源,但实际上并未注册发布。我会确保尽可能将其标记为答案。
    【解决方案2】:
    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],bar 是[1, 5]

    第一次通过,p1q 接受 1,所以 q==p。接下来,q 采用 5,现在 q!=pown_value 累积 q_value,我认为它是小于一的正数。

    但第二次通过时,p2q 采用1,所以q!=p,所以own_value 上升了几分之一。然后q 采用5,所以q!=p 仍然如此,所以own_value 再次上升相同的分数。这就是问题所在:(some_value / another_value) + (some_value / another_value) 打破了 -1 到 1 的比例。有时你会得到 7.23,因为这是 q 不等于 p 的次数。

    里面什么都没有

    for x in foo:
        for y in bar:
    

    关心规范化for x in foo 的构造 - 只是for q in bar

    【讨论】:

    • 这解释了我做错了什么,不幸的是它对如何做对没有帮助! :(
    猜你喜欢
    • 1970-01-01
    • 2010-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 2013-03-08
    • 1970-01-01
    相关资源
    最近更新 更多