예제 #1
0
    def test_should_handle_expected_case_4(self, cfg):
        # given
        p0 = Perception('11101101')
        time = 703
        cls = Classifier(condition='1##01#0#',
                         action=7,
                         effect='0##10#1#',
                         quality=0.47,
                         cfg=cfg)
        cls.mark[1].update(['0', '2'])
        cls.mark[2].update(['1'])
        cls.mark[5].update(['0', '1'])
        cls.mark[7].update(['1'])

        # when
        new_cls = expected_case(cls, p0, time)

        # then
        assert new_cls is not None
        # One `random` attribute gets specified
        assert new_cls.condition.specificity in [4, 5]
        assert Effect('0##10#1#') == new_cls.effect
        assert 7 == new_cls.action
        assert new_cls.is_marked() is False
        assert 0.5 == new_cls.q
예제 #2
0
    def test_should_handle_expected_case_3(self, cfg):
        # given
        p0 = Perception('00110000')
        time = 26
        cls = Classifier(action=5, quality=0.46, cfg=cfg)
        cls.mark[0].add('0')
        cls.mark[1].add('1')
        cls.mark[2].add('0')
        cls.mark[3].add('1')
        cls.mark[4].add('0')
        cls.mark[5].add('1')
        cls.mark[6].add('1')
        cls.mark[7].add('1')

        # when
        new_cls = expected_case(cls, p0, time)

        # then
        assert new_cls is not None
        # One `random` attribute gets specified
        assert 1 == new_cls.condition.specificity
        assert Effect('########') == new_cls.effect
        assert 5 == new_cls.action
        assert new_cls.is_marked() is False
        assert 0.5 == new_cls.q
예제 #3
0
    def apply_alp(self, previous_situation: Perception, action: int,
                  situation: Perception, time: int,
                  population: ClassifiersList,
                  match_set: ClassifiersList) -> None:
        """
        The Anticipatory Learning Process. Handles all updates by the ALP,
        insertion of new classifiers in pop and possibly matchSet, and
        deletion of inadequate classifiers in pop and possibly matchSet.

        :param previous_situation:
        :param action:
        :param situation:
        :param time:
        :param population:
        :param match_set:
        """
        new_list = ClassifiersList(cfg=self.cfg)
        new_cl: Optional[Classifier] = None
        was_expected_case = False
        delete_count = 0

        for cl in self:
            cl.increase_experience()
            cl.set_alp_timestamp(time)

            if cl.does_anticipate_correctly(previous_situation, situation):
                new_cl = expected_case(cl, previous_situation, time)
                was_expected_case = True
            else:
                new_cl = unexpected_case(cl, previous_situation, situation,
                                         time)

                if cl.is_inadequate():
                    # Removes classifier from population, match set
                    # and current list
                    delete_count += 1
                    lists = [x for x in [population, match_set, self] if x]
                    for lst in lists:
                        lst.safe_remove(cl)

            if new_cl is not None:
                new_cl.tga = time
                self.add_alp_classifier(new_cl, new_list)

        # No classifier anticipated correctly - generate new one
        if not was_expected_case:
            new_cl = cover(previous_situation, action, situation, time,
                           self.cfg)
            self.add_alp_classifier(new_cl, new_list)

        # Merge classifiers from new_list into self and population
        self.extend(new_list)
        population.extend(new_list)

        if match_set is not None:
            new_matching = [
                cl for cl in new_list if cl.condition.does_match(situation)
            ]
            match_set.extend(new_matching)
예제 #4
0
    def test_should_handle_expected_case_2(self, cfg):
        # given
        cls = Classifier(condition='#0######', quality=0.521, cfg=cfg)
        p0 = Perception('10101001')
        time = 59

        # when
        new_cls = expected_case(cls, p0, time)

        # then
        assert new_cls is None
        assert abs(0.54 - cls.q) < 0.01
예제 #5
0
    def apply_alp(population: ClassifiersList, match_set: ClassifiersList,
                  action_set: ClassifiersList, p0: Perception, action: int,
                  p1: Perception, time: int, theta_exp: int,
                  cfg: Configuration) -> None:
        """
        The Anticipatory Learning Process. Handles all updates by the ALP,
        insertion of new classifiers in pop and possibly matchSet, and
        deletion of inadequate classifiers in pop and possibly matchSet.

        Parameters
        ----------
        population
        match_set
        action_set
        p0: Perception
        action: int
        p1: Perception
        time: int
        theta_exp
        cfg: Configuration

        Returns
        -------

        """
        new_list = ClassifiersList()
        new_cl: Optional[Classifier] = None
        was_expected_case = False
        delete_count = 0

        for cl in action_set:
            cl.increase_experience()
            cl.update_application_average(time)

            if cl.does_anticipate_correctly(p0, p1):
                new_cl = alp_acs2.expected_case(cl, p0, time)
                was_expected_case = True
            else:
                new_cl = alp_acs2.unexpected_case(cl, p0, p1, time)

                if cl.is_inadequate():
                    # Removes classifier from population, match set
                    # and current list
                    delete_count += 1
                    lists = [
                        x for x in [population, match_set, action_set] if x
                    ]
                    for lst in lists:
                        lst.safe_remove(cl)

            if new_cl is not None:
                new_cl.tga = time
                alp.add_classifier(new_cl, action_set, new_list, theta_exp)

        # No classifier anticipated correctly - generate new one
        if not was_expected_case:
            new_cl = alp_acs2.cover(p0, action, p1, time, cfg)
            alp.add_classifier(new_cl, action_set, new_list, theta_exp)

        # Merge classifiers from new_list into self and population
        action_set.extend(new_list)
        population.extend(new_list)

        if match_set is not None:
            new_matching = [
                cl for cl in new_list if matching(cl.condition, p1)
            ]
            match_set.extend(new_matching)