Source code for jmetal.problem.singleobjective.unconstrained
import math
import random
from jmetal.core.problem import BinaryProblem, FloatProblem
from jmetal.core.solution import BinarySolution, FloatSolution
"""
.. module:: unconstrained
:platform: Unix, Windows
:synopsis: Unconstrained test problems for single-objective optimization
.. moduleauthor:: Antonio J. Nebro <antonio@lcc.uma.es>, Antonio Benítez-Hidalgo <antonio.b@uma.es>
"""
[docs]
class OneMax(BinaryProblem):
""" The implementation of the OneMax problems defines a single binary variable. This variable
will contain the bit string representing the solutions.
"""
def __init__(self, number_of_bits: int = 256):
super(OneMax, self).__init__()
self.number_of_bits_per_variable = [number_of_bits]
self.obj_directions = [self.MINIMIZE]
self.obj_labels = ["Ones"]
[docs]
def number_of_variables(self) -> int:
return 1
[docs]
def number_of_objectives(self) -> int:
return 1
[docs]
def number_of_constraints(self) -> int:
return 0
[docs]
def evaluate(self, solution: BinarySolution) -> BinarySolution:
counter_of_ones = 0
for bits in solution.variables[0]:
if bits:
counter_of_ones += 1
solution.objectives[0] = -1.0 * counter_of_ones
return solution
[docs]
def create_solution(self) -> BinarySolution:
new_solution = BinarySolution(number_of_variables=1, number_of_objectives=1)
new_solution.variables[0] = [True if random.randint(0, 1) == 0 else False for _ in range(self.number_of_bits_per_variable[0])]
return new_solution
[docs]
def name(self) -> str:
return "OneMax"
[docs]
class Sphere(FloatProblem):
def __init__(self, number_of_variables: int = 10):
super(Sphere, self).__init__()
self.obj_directions = [self.MINIMIZE]
self.obj_labels = ["f(x)"]
self.lower_bound = [-5.12 for _ in range(number_of_variables)]
self.upper_bound = [5.12 for _ in range(number_of_variables)]
FloatSolution.lower_bound = self.lower_bound
FloatSolution.upper_bound = self.upper_bound
[docs]
def number_of_objectives(self) -> int:
return 1
[docs]
def number_of_constraints(self) -> int:
return 0
[docs]
def evaluate(self, solution: FloatSolution) -> FloatSolution:
total = 0.0
for x in solution.variables:
total += x * x
solution.objectives[0] = total
return solution
[docs]
def name(self) -> str:
return "Sphere"
[docs]
class Rastrigin(FloatProblem):
def __init__(self, number_of_variables: int = 10):
super(Rastrigin, self).__init__()
self.obj_directions = [self.MINIMIZE]
self.obj_labels = ["f(x)"]
self.lower_bound = [-5.12 for _ in range(number_of_variables)]
self.upper_bound = [5.12 for _ in range(number_of_variables)]
FloatSolution.lower_bound = self.lower_bound
FloatSolution.upper_bound = self.upper_bound
[docs]
def number_of_objectives(self) -> int:
return 1
[docs]
def number_of_constraints(self) -> int:
return 0
[docs]
def evaluate(self, solution: FloatSolution) -> FloatSolution:
a = 10.0
result = a * len(solution.variables)
x = solution.variables
for i in range(len(solution.variables)):
result += x[i] * x[i] - a * math.cos(2 * math.pi * x[i])
solution.objectives[0] = result
return solution
[docs]
def name(self) -> str:
return "Rastrigin"
[docs]
class SubsetSum(BinaryProblem):
def __init__(self, C: int, W: list):
"""The goal is to find a subset S of W whose elements sum is closest to (without exceeding) C.
:param C: Large integer.
:param W: Set of non-negative integers."""
super(SubsetSum, self).__init__()
self.C = C
self.W = W
self.number_of_bits = len(self.W)
self.obj_directions = [self.MAXIMIZE]
self.obj_labels = ["Sum"]
[docs]
def number_of_variables(self) -> int:
return 1
[docs]
def number_of_objectives(self) -> int:
return 1
[docs]
def number_of_constraints(self) -> int:
return 0
[docs]
def evaluate(self, solution: BinarySolution) -> BinarySolution:
total_sum = 0.0
for index, bits in enumerate(solution.variables[0]):
if bits:
total_sum += self.W[index]
if total_sum > self.C:
total_sum = self.C - total_sum * 0.1
if total_sum < 0.0:
total_sum = 0.0
solution.objectives[0] = -1.0 * total_sum
return solution
[docs]
def create_solution(self) -> BinarySolution:
new_solution = BinarySolution(
number_of_variables=self.number_of_variables(), number_of_objectives=self.number_of_objectives()
)
new_solution.variables[0] = [True if random.randint(0, 1) == 0 else False for _ in range(self.number_of_bits)]
return new_solution
[docs]
def name(self) -> str:
return "Subset Sum"