def compute_utility(self, grid: FastGrid) -> float: r = prairie_fire(grid) rewards = 0.0 penalties = 0.0 top_score_reward = 0 for tile in r: clusters = r[tile] num_clusters = len(clusters) if num_clusters > 0: top_score_reward = self.rewards_for_top_score[tile] max_cluster_size = max(c['count'] for c in clusters) penalties += 3.0**num_clusters rewards += 1.5**max_cluster_size # # # for cluster in clusters: # # {'count': 0, 'minx': 1000, 'maxx': -1, 'miny': 5, 'maxy': -1, 'adjacent_tiles': []} # # # # rewards += (self.rewards_for_cluster_sizes[tile] * cluster['count']) #if cluster['count'] >= 2 else 0 # rewards += self.rewards_for_cluster_dimensions_x[cluster['maxx'] - cluster['minx']] # rewards += self.rewards_for_cluster_dimensions_y[cluster['maxy'] - cluster['miny']] # special_reward_for_zeros = sum(x['count'] for x in r[0]) # rewards += 10 * special_reward_for_zeros rewards += top_score_reward return sigmoid(rewards - penalties)
def test_can_distinguish_between_two_cut_off_clusters(self): B = self.create_fastgrid_from( [2, 2, 2, 0, 64, 64, 64, 64, 0, 0, 2, 2, 0, 0, 0, 2]) # 2 groups of connected 2s each size 3 r = prairie_fire(B) self.assertIsNotNone(r) self.assertTrue(r[2][0]['count'] == 3) self.assertTrue(r[2][1]['count'] == 3)
def test_can_light_fire_on_thread_of_values_grid(self): B = self.create_fastgrid_from( [2, 2, 2, 0, 0, 0, 2, 0, 0, 0, 2, 2, 0, 0, 0, 2]) # 7 connected 2s r = prairie_fire(B) self.assertIsNotNone(r) self.assertEqual(r[2][0]['count'], 7) self.assertEqual(r[2][0]['minx'], 0) self.assertEqual(r[2][0]['maxx'], 3) self.assertEqual(r[2][0]['miny'], 0) self.assertEqual(r[2][0]['maxy'], 3) self.assertEqual(r[0][0]['count'], 7) self.assertEqual(r[0][0]['minx'], 0) self.assertEqual(r[0][0]['maxx'], 2) self.assertEqual(r[0][0]['miny'], 1) self.assertEqual(r[0][0]['maxy'], 3) self.assertEqual(r[0][1]['count'], 2) self.assertEqual(r[0][1]['minx'], 3) self.assertEqual(r[0][1]['maxx'], 3) self.assertEqual(r[0][1]['miny'], 0) self.assertEqual(r[0][1]['maxy'], 1)
def test_can_light_fire_on_monotonous_grid(self): B = self.create_smooth_grid() r = prairie_fire(B) self.assertIsNotNone(r)