예제 #1
0
    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
예제 #2
0
    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
예제 #3
0
    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
예제 #4
0
    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
예제 #5
0
    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
예제 #6
0
    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)
예제 #7
0
    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
예제 #8
0
    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
예제 #9
0
    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
예제 #10
0
    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
예제 #11
0
    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
예제 #12
0
    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)
예제 #13
0
    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
예제 #14
0
    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
예제 #15
0
    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
예제 #16
0
    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
예제 #17
0
    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