def test_should_find_subsumer_among_nonsubsumers(self, acs2_cfg): # given subsumer = acs2.Classifier(condition='###0####', action=3, effect='##1#####', quality=0.93, reward=1.35, experience=23, cfg=acs2_cfg) nonsubsumer = acs2.Classifier(action=3, cfg=acs2_cfg) cl = acs2.Classifier(condition='1##0####', action=3, effect='##1#####', quality=0.5, reward=0.35, experience=1, cfg=acs2_cfg) population = acs2.ClassifiersList( *[nonsubsumer, subsumer, nonsubsumer]) # when subsumers = find_subsumers(cl, population, acs2_cfg.theta_exp) # then assert len(subsumers) == 1 assert subsumers[0] == subsumer
def test_find_old_classifier_similar_and_subsumer_subsumer_returned(self): # given cfg = acs2.Configuration( classifier_length=8, number_of_possible_actions=4) subsumer = acs2.Classifier( condition='1#######', action=1, experience=21, quality=0.95, cfg=cfg) similar = acs2.Classifier( condition='10######', action=1, cfg=cfg) population = acs2.ClassifiersList(*[similar, subsumer]) cl = acs2.Classifier( condition='10######', action=1, cfg=cfg) # when old_cls = ga._find_old_classifier(population, cl, True, cfg.theta_exp) # then assert similar == cl assert subsumer == old_cls
def test_should_add_classifier(self): # given cfg = acs2.Configuration( classifier_length=8, number_of_possible_actions=4) cl_1 = acs2.Classifier(action=1, cfg=cfg) cl_3 = acs2.Classifier(action=3, cfg=cfg) cl_4 = acs2.Classifier(action=4, cfg=cfg) population = acs2.ClassifiersList(*[cl_1, cl_3, cl_4]) match_set = acs2.ClassifiersList() action_set = acs2.ClassifiersList(*[cl_1]) p0 = Perception('10101010') cl = acs2.Classifier( action=1, condition='1#######', cfg=cfg) # when ga.add_classifier(cl, p0, population, match_set, action_set, do_subsumption=True, theta_exp=cfg.theta_exp) # then assert acs2.ClassifiersList(*[cl_1, cl_3, cl_4, cl]) == population assert acs2.ClassifiersList(*[cl]) == match_set assert acs2.ClassifiersList(*[cl_1, cl]) == action_set
def test_add_ga_classifier_increase_numerosity(self): # given cfg = acs2.Configuration( classifier_length=8, number_of_possible_actions=4) cl_1 = acs2.Classifier(action=2, condition='1#######', cfg=cfg) cl_2 = acs2.Classifier(action=3, cfg=cfg) cl_3 = acs2.Classifier(action=4, cfg=cfg) population = acs2.ClassifiersList(*[cl_1, cl_2, cl_3]) match_set = acs2.ClassifiersList(*[cl_1]) action_set = acs2.ClassifiersList(*[cl_1]) cl = acs2.Classifier(action=2, condition='1#######', cfg=cfg) # when p0 = Perception('10101010') ga.add_classifier(cl, p0, population, match_set, action_set, do_subsumption=True, theta_exp=cfg.theta_exp) # then assert cl_1.num == 2 assert acs2.ClassifiersList(*[cl_1, cl_2, cl_3]) == population assert acs2.ClassifiersList(*[cl_1]) == match_set assert acs2.ClassifiersList(*[cl_1]) == action_set
def test_should_find_old_classifier_only_subsumer(self): # given cfg = acs2.Configuration( classifier_length=8, number_of_possible_actions=4) subsumer1 = acs2.Classifier( condition='1##0####', action=3, effect='##1#####', quality=0.93, reward=1.35, experience=23, cfg=cfg) subsumer2 = acs2.Classifier( condition='#1#0####', action=3, effect='##1#####', quality=0.93, reward=1.35, experience=23, cfg=cfg) most_general = acs2.Classifier( condition='###0####', action=3, effect='##1#####', quality=0.93, reward=1.35, experience=23, cfg=cfg) nonsubsumer = acs2.Classifier(cfg=cfg) cl = acs2.Classifier( condition='11#0####', action=3, effect='##1#####', quality=0.5, reward=0.35, experience=1, cfg=cfg) population = acs2.ClassifiersList( *[nonsubsumer, subsumer1, nonsubsumer, most_general, subsumer2, nonsubsumer]) # when old_cl = ga._find_old_classifier(population, cl, True, cfg.theta_exp) # then assert old_cl == most_general
def test_two_point_crossover(self, _seed, _c1, _c2, _rc1, _rc2): # given cfg = acs2.Configuration( classifier_length=4, number_of_possible_actions=2) cl1 = acs2.Classifier(condition=_c1, cfg=cfg) cl2 = acs2.Classifier(condition=_c2, cfg=cfg) # when np.random.seed(_seed) ga.two_point_crossover(cl1, cl2) # then assert cl1.condition == acs.Condition(_rc1) assert cl2.condition == acs.Condition(_rc2)
def test_should_delete_ga_classifier(self): # given cfg = acs2.Configuration( classifier_length=4, number_of_possible_actions=2) clss = [] # Total of 20 micro-classifiers action_cl_num_fixtures = { 1: [1, 5, 4], 2: [1, 1, 6, 2] } for action, num_lst in action_cl_num_fixtures.items(): for num in num_lst: clss.append(acs2.Classifier( action=action, numerosity=num, cfg=cfg)) insize = 2 # space needed for new classifiers theta_as = 10 # maximum size of the action set # when population = acs2.ClassifiersList(*clss) action_set = population.form_action_set(1) ga.delete_classifiers(population, None, action_set, insize, theta_as) # then assert sum(cl.num for cl in population) == 18 assert sum(cl.num for cl in action_set) == 8
def test_should_distinguish_classifier_as_subsumer(self, _exp, _q, _is_subsumer, acs2_cfg): # given cl = acs2.Classifier(experience=_exp, quality=_q, cfg=acs2_cfg) # when & then # general classifier should not be considered as subsumer assert is_subsumer(cl, acs2_cfg.theta_exp) is _is_subsumer
def test_should_find_most_general_subsumer(self, acs2_cfg): # given subsumer1 = acs2.Classifier(condition='1##0####', action=3, effect='##1#####', quality=0.93, reward=1.35, experience=23, cfg=acs2_cfg) subsumer2 = acs2.Classifier(condition='#1#0####', action=3, effect='##1#####', quality=0.93, reward=1.35, experience=23, cfg=acs2_cfg) most_general = acs2.Classifier(condition='###0####', action=3, effect='##1#####', quality=0.93, reward=1.35, experience=23, cfg=acs2_cfg) nonsubsumer = acs2.Classifier(cfg=acs2_cfg) cl = acs2.Classifier(condition='11#0####', action=3, effect='##1#####', quality=0.5, reward=0.35, experience=1, cfg=acs2_cfg) population = acs2.ClassifiersList(*[ nonsubsumer, subsumer1, nonsubsumer, most_general, subsumer2, nonsubsumer ]) # when subsumers = find_subsumers(cl, population, acs2_cfg.theta_exp) # then assert subsumers[0] == most_general
def test_should_not_distinguish_marked_classifier_as_subsumer( self, acs2_cfg): # given # Now check if the fact that classifier is marked will block # it from being considered as a subsumer cl = acs2.Classifier(experience=30, quality=0.92, cfg=acs2_cfg) cl.mark[3].add('1') # when & then assert is_subsumer(cl, acs2_cfg.theta_exp) is False
def test_find_old_classifier_only_similar(self): # given cfg = acs2.Configuration( classifier_length=4, number_of_possible_actions=2) cl_1 = acs2.Classifier(action=1, experience=32, cfg=cfg) cl_2 = acs2.Classifier(action=1, cfg=cfg) population = acs2.ClassifiersList( *[cl_1, acs2.Classifier(action=2, cfg=cfg), acs2.Classifier(action=3, cfg=cfg), cl_2]) # when cl = acs2.Classifier(action=1, cfg=cfg) old_cl = ga._find_old_classifier(population, cl, True, cfg.theta_exp) # then assert old_cl == cl_1
def test_generalizing_mutation(self, _mu, _cond1, _cond2): # given cfg = acs2.Configuration( classifier_length=4, number_of_possible_actions=2) cl = acs2.Classifier(condition=_cond1, cfg=cfg) # when ga.generalizing_mutation(cl, mu=_mu) # then assert cl.condition == acs.Condition(_cond2)
def test_should_not_find_old_classifier(self): # given cfg = acs2.Configuration( classifier_length=4, number_of_possible_actions=2) cl = acs2.Classifier(cfg=cfg) population = acs2.ClassifiersList() # when old_cl = ga._find_old_classifier(population, cl, True, cfg.theta_exp) # then assert old_cl is None
def test_should_work_with_acs2(self, acs2_cfg): # given c1 = acs2.Classifier(condition='1##1', action=0, effect='0###', quality=0.571313, reward=7.67011, cfg=acs2_cfg) c2 = acs2.Classifier(condition='1##1', action=1, effect='0###', quality=0.581313, reward=7.67011, cfg=acs2_cfg) population = acs2.ClassifiersList(*[c1, c2]) # when eg = EpsilonGreedy(acs2_cfg.number_of_possible_actions, epsilon=0.0) best_action = eg(population) # then assert best_action == 1
def test_should_subsume_another_classifier(self, _cl1c, _cl1a, _cl1e, _cl1q, _cl1r, _cl1exp, _cl2c, _cl2a, _cl2e, _cl2q, _cl2r, _cl2exp, _result, acs2_cfg): # given cl = acs2.Classifier(condition=_cl1c, action=_cl1a, effect=_cl1e, quality=_cl1q, reward=_cl1r, experience=_cl1exp, cfg=acs2_cfg) other = acs2.Classifier(condition=_cl2c, action=_cl2a, effect=_cl2e, quality=_cl2q, reward=_cl2r, experience=_cl2exp, cfg=acs2_cfg) # when & then assert does_subsume(cl, other, acs2_cfg.theta_exp) is _result
def test_should_insert_alp_offspring_1(self): # given cfg = acs2.Configuration(8, 8) population = acs2.ClassifiersList() new_list = acs2.ClassifiersList() child = acs2.Classifier( condition='1##1#010', action=0, effect='0####101', quality=0.5, reward=8.96245, immediate_reward=0, experience=1, tga=423, talp=423, tav=27.3182, cfg=cfg ) c1 = acs2.Classifier( condition='1##1#010', action=0, effect='0####101', quality=0.571313, reward=7.67011, immediate_reward=0, experience=3, tga=225, talp=423, tav=70.881, cfg=cfg ) c2 = acs2.Classifier( condition='1####010', action=0, effect='0####101', quality=0.462151, reward=8.96245, immediate_reward=0, experience=11, tga=143, talp=423, tav=27.3182, cfg=cfg ) c3 = acs2.Classifier( condition='1####0##', action=0, effect='0####1##', quality=0.31452, reward=9.04305, immediate_reward=0, experience=19, tga=49, talp=423, tav=19.125, cfg=cfg ) population.extend([c1, c2, c3]) # when alp.add_classifier(child, population, new_list, cfg.theta_exp) # then assert len(population) == 3 assert c1 in population assert c2 in population assert c3 in population assert abs(0.592747 - c1.q) < 0.01
def test_should_insert_alp_offspring_2(self): # given cfg = acs2.Configuration(8, 8) population = acs2.ClassifiersList() new_list = acs2.ClassifiersList() child = acs2.Classifier( condition='#1O##O##', action=0, reward=18.206, immediate_reward=0, experience=1, tga=747, talp=747, tav=22.0755, cfg=cfg ) c1 = acs2.Classifier( condition='#1O#O###', action=0, quality=0.650831, reward=14.8323, immediate_reward=0, experience=5, tga=531, talp=747, tav=48.3562, cfg=cfg ) c2 = acs2.Classifier( condition='##O#O###', action=0, quality=0.79094, reward=9.97782, immediate_reward=0, experience=10, tga=330, talp=747, tav=43.7171, cfg=cfg ) c3 = acs2.Classifier( condition='#1O###1O', action=0, effect='#O1####1', quality=0.515369, reward=8.3284, immediate_reward=0, experience=8, tga=316, talp=747, tav=57.8883, cfg=cfg ) c3.mark[0].update(['1']) c3.mark[3].update(['0']) c3.mark[4].update(['0']) c3.mark[5].update(['0']) c4 = acs2.Classifier( condition='####O###', action=0, quality=0.903144, reward=14.8722, immediate_reward=0, experience=25, tga=187, talp=747, tav=23.0038, cfg=cfg ) c5 = acs2.Classifier( condition='#1O####O', action=0, effect='#O1####1', quality=0.647915, reward=9.24712, immediate_reward=0, experience=14, tga=154, talp=747, tav=44.5457, cfg=cfg ) c5.mark[0].update(['1']) c5.mark[3].update(['0', '1']) c5.mark[4].update(['0', '1']) c5.mark[5].update(['0', '1']) c5.mark[6].update(['0', '1']) c6 = acs2.Classifier( condition='#1O#####', action=0, quality=0.179243, reward=18.206, immediate_reward=0, experience=29, tga=104, talp=747, tav=22.0755, cfg=cfg ) c6.mark[0].update(['1']) c6.mark[3].update(['1']) c6.mark[4].update(['1']) c6.mark[5].update(['1']) c6.mark[6].update(['0', '1']) c6.mark[7].update(['0', '1']) c7 = acs2.Classifier( condition='##O#####', action=0, quality=0.100984, reward=15.91, immediate_reward=0, experience=44, tga=58, talp=747, tav=14.4171, cfg=cfg ) c7.mark[0].update(['0', '1']) c7.mark[1].update(['0', '1']) c7.mark[3].update(['0', '1']) c7.mark[5].update(['0', '1']) c7.mark[6].update(['0', '1']) c7.mark[7].update(['0', '1']) # Add classifiers into current ClassifierList population.extend([c1, c2, c3, c4, c5, c6, c7]) # When alp.add_classifier(child, population, new_list, cfg.theta_exp) # Then assert 7 == len(population) assert 0 == len(new_list) assert c1 in population assert c2 in population assert c3 in population assert c4 in population assert c5 in population assert c6 in population assert c7 in population # `C4` should be subsumer of `child` assert abs(0.907987 - c4.q) < 0.01