Skip to main content
Version: 2.0

Python

Ackley Function Example in Python


Mathematical formulation of the Ackley function

Ackely function is a standard function used for benchmarking global optimization solvers. It is chosen for the complexity of the function, its multimodal nature and the known global minima.

An nn-dimensional Ackley function has the following form

f(x)=aexp ⁣(b1ni=1nxi2)exp ⁣(1ni=1ncos(cxi))+a+exp(1)f(x) = -a \exp\!\left(-b \sqrt{\frac{1}{n} \sum_{i=1}^{n} x_i^2}\right) - \exp\!\left(\frac{1}{n} \sum_{i=1}^{n} \cos(c x_i)\right) + a + \exp(1)

where a=20,b=15,c=2πa = 20 , b = \frac{1}{5}, c = 2\pi

The global optima of the function is

f(x)=0atx={0,0,...,0}f(x^{*}) = 0 \quad \text{at} \quad x^{*} = \{0,0,...,0\}

Implementation of Ackley function in BQPhy using Python model file

As an example, we are solving the 2 dimensional Ackley function, whose global optima is

f(x)=0wherex={0,0}f(x^{*}) = 0 \quad \text{where} \quad x^{*} = \{0,0\}

The input variables xix_{i} are bounded with the following constraints 10xi10,i{1,2}-10 \leq x_{i} \leq 10 , \quad i \in \{1,2\}

The bounds for the decision variables are to be passed during the execution in BQPhy

You can get the template for the C++ model file from the BQPhy website and add the objective and constraints.

Assuming the chromosome is a list of length 2 and type double, the objective function can be written as follows.

def objective(x: List[float], dimensionality: int) -> float:
a = 20
b = 1/5
c = 2*math.pi
fitnessValue = a + math.e
fitnessValue += -a*math.exp(-b*math.sqrt(0.5*(x[0]**2 + x[1]**2))) - math.exp(0.5*(math.cos(c*x[0]) + math.cos(c*x[1])))
return fitnessValue

The optimization problem does not have any explicit constraints other than that on the decision variables, hence the constraint function is empty.

You can impose the No_Penalty method to solve this problem.

constraints = []

penalty_type = "No_Penalty"

You can also create a dummy constraint and solve it with Static_Penalty method and penalty coefficient be set to 0.

def constraint1(x: List[float], dimensionality: int) -> float:
constraintFunc = 0
return constraintFunc
# Create constraints vector
constraints = [constraint1]

# Define penalty parameters
penalty_type = "Static_Penalty"
penalty_coefficients = [0.0]

Running the model file in BQPhy platform

The code for the model file is attached in the end of the page

Follow the following steps to run the model file

  • Add the model file to the platform

    Refer the Models page of the documentation for help on adding the model file

  • Create an execution for the model to run the optimization problem. Since the problem consists of 2 continuous decision variables, the following parameters are fixed

    Number of decision variables = 2
    Type of variables = Continuous
    Upper Bound = (Global) 10
    Lower Bound = (Global) -10

    Refer Executions page of the documentation to learn more on the required parameters and on running the model file.

Python model file for the Ackley function

The model file for this function comes out as follows

from userLibrary_helper import OptimizationProblem, PenaltyType, FitnessEvalParameter
from typing import List

# ===============================================================================================
# DO NOT MODIFY CODE ABOVE THIS LINE
# ===============================================================================================

# Import Libraries
import math

def Model(x):
dimensionality = len(x)

# Define objective function
def objective(x: List[float], dimensionality: int) -> float:

a = 20
b = 1/5
c = 2*math.pi
fitnessValue = a + math.e
fitnessValue += -a*math.exp(-b*math.sqrt(0.5*(x[0]**2 + x[1]**2))) - math.exp(0.5*(math.cos(c*x[0]) + math.cos(c*x[1])))
return fitnessValue

# Define penalty parameters
penalty_type = "No_Penalty" # Options: No_Penalty, Death_Penalty, Static_Penalty, Debs_Penalty
# penalty_coefficients = [0.0] # Make sure number of entries are equivalent to number of constraints

if penalty_type == "No_Penalty":
########### Using No-Penalty ###########
problem = OptimizationProblem(objective, constraints, PenaltyType.No_Penalty)

elif penalty_type == "Death_Penalty":
########### Using Death Penalty ############
problem = OptimizationProblem(objective, constraints, PenaltyType.Death_Penalty)

elif penalty_type == "Static_Penalty":
########### Using Static Penalty with a fixed penalty value ############
problem = OptimizationProblem(objective, constraints, PenaltyType.Static_Penalty, penalty_coefficients)

elif penalty_type == "Debs_Penalty":
########### Using Deb's approach ###########
problem = OptimizationProblem(objective, constraints, PenaltyType.Debs_Penalty)

return problem.evaluate_objective(x, dimensionality)

Rastrigin Function Example in Python


Mathematical formulation of the Rastrigin function

The Rastrigin function is one of the standard functions used for benchmarking optimization solvers. It is characterized by its multimodal nature (i.e. it contains multiple local minima) which pose challenges in obtaining the global minima.

The standard form of a nn-dimensional Rastrigin function is as follows

f(x)=10n+i=1n[xi210cos(2πxi)]f(x) = 10n + \sum_{i=1}^{n} \left[ x_i^2 - 10 \cos(2\pi x_i) \right]

The global optima is

f(x)=0atx={0,0,...,0}f(x^{*}) = 0 \quad \text{at} \quad x^{*} = \{0,0,...,0\}

Implementation of Rastrigin function in BQPhy using Python model file

Consider the 4 dimensional Rastrigin function, whose global optimal is

f(x)=0atx={0,0,0,0}f(x^{*}) = 0 \quad \text{at} \quad x^{*} = \{0,0,0,0\}

with the bounds on the variables

5.12xi5.12,i{1,2,3,4}-5.12 \leq x_{i} \leq 5.12 ,\quad i \in \{1,2,3,4\}

The bounds for the decision variables are to be passed during the execution in BQPhy

You can get the template for the C++ model file from the BQPhy website and add the objective and constraints.

The objective function snippet can be written as follows.


def objective(x: List[float], dimensionality: int) -> float:
fitnessValue = 40
for i in range(4):
fitnessValue += x[i]*x[i] - 10*math.cos(2*math.pi*x[i])
return fitnessValue

The optimization problem does not have any explicit constraints other than that on the decision variables, hence the constraint function is empty.

You can impose the No_Penalty method to solve this problem.

constraints = []

penalty_type = "No_Penalty"

You can also create a dummy constraint and solve it with Static_Penalty method and penalty coefficient be set to 0.

def constraint1(x: List[float], dimensionality: int) -> float:
constraintFunc = 0
return constraintFunc
# Create constraints vector
constraints = [constraint1]

# Define penalty parameters
penalty_type = "Static_Penalty"
penalty_coefficients = [0.0]

Running the model file in BQPhy platform

The code for the model file is attached in the end of the page

Follow the following steps to run the model file

  • Add the model file to the platform

    Refer the Models page of the documentation for help on adding the model file

  • Create an execution for the model to run the optimization problem. Since the problem consists of 2 continuous decision variables, the following parameters are fixed

    Number of decision variables = 4
    Type of variables = Continuous
    Upper Bound = (Global) 5.12
    Lower Bound = (Global) -5.12

    Refer Executions page of the documentation to learn more on the required parameters and on running the model file.

Python model file for the Rastrigin function

The model file for the Rastrigin function can be written as follows

from userLibrary_helper import OptimizationProblem, PenaltyType, FitnessEvalParameter
from typing import List

# ===============================================================================================
# DO NOT MODIFY CODE ABOVE THIS LINE
# ===============================================================================================

# Import Libraries
import math

def Model(x):
dimensionality = len(x)

# Define objective function
def objective(x: List[float], dimensionality: int) -> float:

fitnessValue = 40
for i in range(4):
fitnessValue += x[i]*x[i] - 10*math.cos(2*math.pi*x[i])
return fitnessValue

constraints = []
# Define penalty parameters
penalty_type = "No_Penalty" # Options: No_Penalty, Death_Penalty, Static_Penalty, Debs_Penalty
# penalty_coefficients = [0.0] # Make sure number of entries are equivalent to number of constraints

if penalty_type == "No_Penalty":
########### Using No-Penalty ###########
problem = OptimizationProblem(objective, constraints, PenaltyType.No_Penalty)

elif penalty_type == "Death_Penalty":
########### Using Death Penalty ############
problem = OptimizationProblem(objective, constraints, PenaltyType.Death_Penalty)

elif penalty_type == "Static_Penalty":
########### Using Static Penalty with a fixed penalty value ############
problem = OptimizationProblem(objective, constraints, PenaltyType.Static_Penalty, penalty_coefficients)

elif penalty_type == "Debs_Penalty":
########### Using Deb's approach ###########
problem = OptimizationProblem(objective, constraints, PenaltyType.Debs_Penalty)

return problem.evaluate_objective(x, dimensionality)