2

惑星がどの影響を受けているかを示す、planetwarsボットのヒートマップを作成しようとしています。初期マップは次のようになります: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の範囲でした)。

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]です。

初めて、pです1qかかる1のでq==p。次に、qtakes 5、now q!=p、は、 1未満の正の数であると私が推測するものをown_value累積します。q_value

しかし、2回目pはです2qかかる1のでq!=pown_value1の何分の1かだけ上がります。次に、qがかかります5q!=pそれでも、own_value同じ割合で再び上昇します。ここに問題があります(some_value / another_value) + (some_value / another_value)。-1から1のスケールを壊します。それが何回q等しくなかったので、あなたは時々7.23を得るp

には何もありません

for x in foo:
    for y in bar:

正規化を気にする構造for x in foo-ちょうどfor q in bar

于 2012-04-25T07:25:54.857 に答える