2

I'm trying to create a heatmap for a planetwars bot which indicates which influence a planet is under. The initial map looks like: http://imgur.com/a/rPVnl#0

Ideally the Red planet should have a value of -1, the Blue planet should have a value of 1, and the planet marked 1 should have a value of 0. (Or 0 to 1, mean of 0.5 would work)

My initial analysis code is below, but the results it outputs are between 0.13 and 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

I've also tried to add some code to curb the range from 0 to 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)

The values ended up between 0 and 1, but the mean was 0.245? (Also the values actually ranged from 0.019 to 1.019).

4

2 回答 2

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
于 2012-04-25T16:02:03.893 回答
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将我认为是小于一的正数累加。5q!=pown_valueq_value

但第二次通过,p2q需要1, so q!=p, soown_value上升 1 的几分之一。然后q5如此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

于 2012-04-25T07:25:54.857 回答