Exemple #1
0
class Climber:
    def __init__(self, config):
        self.config = config

        gps = GPS(config)
        measure = Measure()

        self.mobile = Mobile(gps, measure, config)

        self.step = config['step']

    def toward_summit(self):
        while self.mobile.goal is False:
            direction = self.mobile.guide()
            new_alpha, new_beta, new_maxlike, new_score = self._walk(direction)
            self.mobile.assess_results(new_alpha, new_beta, new_maxlike,
                                       new_score)

    def _walk(self, direction):
        if direction == 'alpha':
            new_alpha, new_beta, new_maxlike, new_score = self._set_alpha()

            return new_alpha, new_beta, new_maxlike, new_score

        elif direction == 'beta':
            new_alpha, new_beta, new_maxlike, new_score = self._set_beta()

            return new_alpha, new_beta, new_maxlike, new_score

    def _set_alpha(self):
        alpha_up = self.mobile.gps.alpha + self.step
        alpha_down = self.mobile.gps.alpha - self.step
        new_beta = None

        maxlike_up, score_up = self.__run_machine(alpha_up,
                                                  self.mobile.gps.beta)
        maxlike_down, score_down = self.__run_machine(alpha_down,
                                                      self.mobile.gps.beta)

        if score_up > score_down:
            new_alpha = alpha_up
            new_maxlike = maxlike_up
            new_score = score_up

        else:
            new_alpha = alpha_up
            new_maxlike = maxlike_down
            new_score = score_down

        return new_alpha, new_beta, new_maxlike, new_score

    def _set_beta(self):
        beta_up = self.mobile.gps.beta + self.step
        beta_down = self.mobile.gps.beta - self.step
        new_alpha = None

        maxlike_up, score_up = self.__run_machine(self.mobile.gps.alpha,
                                                  beta_up)
        maxlike_down, score_down = self.__run_machine(self.mobile.gps.alpha,
                                                      beta_down)

        if maxlike_up > maxlike_down:
            new_beta = beta_up
            new_maxlike = maxlike_up
            new_score = score_up

        else:
            new_beta = beta_down
            new_maxlike = maxlike_down
            new_score = score_down

        return new_alpha, new_beta, new_maxlike, new_score

    def __run_machine(self, alpha, beta):
        if str((alpha, beta)) not in self.mobile.memory.keys():
            machine = Machine(self.config)
            machine.run(alpha, beta)
            score = machine.score
            maxlike = machine.maxlike

            self.mobile.memory[str((alpha, beta))] = (maxlike, score)

            return maxlike, score

        else:
            print('machine already been here')
            maxlike = self.mobile.memory[str((alpha, beta))][0]
            score = self.mobile.memory[str((alpha, beta))][1]

            return maxlike, score