我正在尝试为行星战争机器人创建一个热图,表明行星受到的影响。 初始地图如下所示: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之间。)
答案 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]
。
第一次,p
是1
。 q
需要1
,所以q==p
。接下来,q
需要5
,现在q!=p
,own_value
会累积q_value
,我认为这是一个小于一的正数。
但第二次,p
是2
。 q
需要1
,所以q!=p
,own_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}}。