def create_solution(self) -> PermutationSolution:
        new_solution = PermutationSolution(
            number_of_variables=self.number_of_variables,
            number_of_objectives=self.number_of_objectives)
        new_solution.variables = random.sample(
            range(1, self.number_of_variables + 1), self.number_of_variables)

        return new_solution
Exemple #2
0
    def execute(self, solution: PermutationSolution) -> PermutationSolution:
        rand = random.random()

        if rand <= self.probability:
            pos_one, pos_two = random.sample(range(solution.number_of_variables - 1), 2)
            solution.variables[pos_one], solution.variables[pos_two] = \
                solution.variables[pos_two], solution.variables[pos_one]

        return solution
Exemple #3
0
    def execute(self, solution: PermutationSolution) -> PermutationSolution:
        Check.that(type(solution) is PermutationSolution, "Solution type invalid")

        rand = random.random()

        if rand <= self.probability:
            pos_one, pos_two = random.sample(range(solution.number_of_variables - 1), 2)
            solution.variables[pos_one], solution.variables[pos_two] = \
                solution.variables[pos_two], solution.variables[pos_one]

        return solution
Exemple #4
0
    def evaluate(self, solution: PermutationSolution) -> PermutationSolution:
        distance_fitness = 0
        cost_fitness = 0

        for i in range(self.number_of_variables - 1):
            x = solution.variables[i]
            X = solution.variables[i]
            y = solution.variables[i + 1]
            Y = solution.variables[i + 1]
            distance_fitness += self.distance_matrix[x][y]
            cost_fitness += self.cost_matrix[X][Y]

        first, last = solution.variables[0], solution.variables[-1]
        First, Last = solution.variables[0], solution.variables[-1]
        distance_fitness += self.distance_matrix[first][last]
        cost_fitness += self.cost_matrix[First][Last]

        solution.objectives[0] = distance_fitness
        solution.objectives[1] = cost_fitness

        return solution
    def load_initial_solutions(self, warm_startup_info: Mapping,
                               problem: Problem) -> None:
        self.warm_startup_info = warm_startup_info
        if warm_startup_info and 'paths' in self.warm_startup_info.keys(
        ) and len(self.warm_startup_info['paths']) > 0:
            from jmetal.util.generator import InjectorGenerator
            one_sol_variables = self.warm_startup_info['paths'][0]
            solution = PermutationSolution(
                number_of_variables=problem.number_of_variables,
                number_of_objectives=problem.number_of_objectives)
            solution.variables = one_sol_variables
            self._initial_solutions.append(problem.evaluate(solution))

            for one_sol_variables in self.warm_startup_info['paths'][1:]:
                solution = copy(solution)
                solution.variables = one_sol_variables
                self._initial_solutions.append(problem.evaluate(solution))
            generator = InjectorGenerator(solutions=self._initial_solutions)

        else:
            from jmetal.util.generator import RandomGenerator
            generator = RandomGenerator()
        self._solution_generator = generator
Exemple #6
0
  def evaluate(self, solution: PermutationSolution) -> PermutationSolution:
    fitness = 0

    for i in range(self.number_of_variables - 1):
      x = solution.variables[i]
      y = solution.variables[i + 1]
      fitness += self.distance_matrix[x][y]

    first, last = solution.variables[0], solution.variables[-1]
    fitness += self.distance_matrix[first][last]

    solution.objectives[0] = fitness

    return solution
Exemple #7
0
    def test_should_the_solution_remain_unchanged_if_the_probability_is_zero(self):
        operator = PMXCrossover(0.0)
        solution1 = PermutationSolution(number_of_variables=2, number_of_objectives=1)
        solution1.variables[0] = [1, 2]
        solution1.variables[1] = [2, 6]

        solution2 = PermutationSolution(number_of_variables=2, number_of_objectives=1)
        solution2.variables[0] = [2, 3]
        solution2.variables[1] = [5, 3]

        offspring = operator.execute([solution1, solution2])

        self.assertEqual([1, 2], offspring[0].variables[0])
        self.assertEqual([2, 6], offspring[0].variables[1])

        self.assertEqual([2, 3], offspring[1].variables[0])
        self.assertEqual([5, 3], offspring[1].variables[1])
Exemple #8
0
    def test_should_the_operator_work_with_two_solutions_with_two_variables(self, random_call):
        operator = CXCrossover(1.0)
        solution1 = PermutationSolution(number_of_variables=2, number_of_objectives=1)
        solution1.variables[0] = [1, 2, 3, 4, 7]
        solution1.variables[1] = [2, 6, 4, 5, 3]

        solution2 = PermutationSolution(number_of_variables=2, number_of_objectives=1)
        solution2.variables[0] = [2, 3, 4, 1, 9]
        solution2.variables[1] = [5, 3, 2, 4, 6]

        random_call.return_value = 0
        offspring = operator.execute([solution1, solution2])

        self.assertEqual([1, 2, 3, 4, 9], offspring[0].variables[0])
        self.assertEqual([2, 3, 4, 5, 6], offspring[0].variables[1])

        self.assertEqual([1, 2, 3, 4, 7], offspring[1].variables[0])
        self.assertEqual([2, 6, 4, 5, 3], offspring[1].variables[1])
    def test_should_the_solution_remain_unchanged_if_the_probability_is_zero(
            self, random_call):
        operator = CXCrossover(1.0)
        solution1 = PermutationSolution(number_of_variables=2,
                                        number_of_objectives=1)
        solution1.variables[0] = [1, 2, 3, 4, 7]
        solution1.variables[1] = [2, 6, 4, 5, 3]

        solution2 = PermutationSolution(number_of_variables=2,
                                        number_of_objectives=1)
        solution2.variables[0] = [2, 3, 4, 1, 9]
        solution2.variables[1] = [5, 3, 2, 4, 6]

        random_call.return_value = 0
        offspring = operator.execute([solution1, solution2])

        self.assertEqual([1, 2, 3, 4, 9], offspring[0].variables[0])
        self.assertEqual([2, 3, 4, 5, 6], offspring[0].variables[1])

        self.assertEqual([1, 2, 3, 4, 7], offspring[1].variables[0])
        self.assertEqual([2, 6, 4, 5, 3], offspring[1].variables[1])
Exemple #10
0
    def test_should_the_operator_work_with_permutation_at_the_beginning(self, random_call):
        operator = PMXCrossover(1.0)

        solution1 = PermutationSolution(number_of_variables=10, number_of_objectives=1)
        solution1.variables = [i for i in range(10)]

        solution2 = PermutationSolution(number_of_variables=10, number_of_objectives=1)
        solution2.variables = [i for i in range(10, 20)]

        random_call.side_effect = (0, 5)
        offspring = operator.execute([solution1, solution2])

        self.assertEqual([10, 11, 12, 13, 14, 5, 6, 7, 8, 9], offspring[0].variables)
        self.assertEqual([0, 1, 2, 3, 4, 15, 16, 17, 18, 19], offspring[1].variables)
Exemple #11
0
    def execute(self, solution: PermutationSolution) -> PermutationSolution:
        rand = random.random()

        if rand <= self.probability:
            point1 = random.randint(0, len(solution.variables))
            point2 = random.randint(0, len(solution.variables) - 1)

            if point2 >= point1:
                point2 += 1
            else:
                point1, point2 = point2, point1

            if point2 - point1 >= 20:
                point2 = point1 + 20

            values = solution.variables[point1:point2]
            solution.variables[point1:point2] = random.sample(
                values, len(values))

        return solution
Exemple #12
0
    def execute(self, solution: PermutationSolution) -> PermutationSolution:
        Check.that(
            type(solution) is PermutationSolution, "Solution type invalid")
        rand = random.random()

        if rand <= self.probability:

            if self.randMut == 1:
                # pos_one, pos_two = random.sample(range(solution.number_of_variables - 1), 2)
                # there is no use for the -1 above in the original algorithm
                pos_one, pos_two = random.sample(
                    range(solution.number_of_variables), 2)

            elif self.randMut == 2:
                path = solution.variables
                pos_one, pos_two, length = bestMutation2(
                    self.D, self.n, path, self.first)

            solution.variables[pos_one], solution.variables[
                pos_two] = solution.variables[pos_two], solution.variables[
                    pos_one]

        return solution
    def evaluate(self, solution: PermutationSolution) -> PermutationSolution:
        self.metric.evaluate(
            sort_update_actions(solution.variables, self.test_cases))
        solution.objectives[0] = self.metric.fitness * -1.0

        return solution