# Relationship between Hypervolume and population size, number of generations, and number of functional evaluations?

I have a multi-objective optimization with the following properties:

Objective function: two non-linear functions and one linear function

Decision variable: two real variables (Bounded)

Constraint: three linear constraint (two bounding constraint and one relationship constraint)

Problem type: non-convex

Solution required: Global optimum

I have used two heuristic algorithms to solve the problem NSGA-II and NSGA-III.

I have performed NSGA-II and NSGA-III for the following instances (population size, number of generations, maximum number of functional evaluations(i.e. pop size x no. of gen)): (100,10,1000), (100,50,5000),(100,100,10000), (500, 10, 1000), (500, 50, 25000), and (500,100,50000).

My observations:

1. Hypervolume increases with increase in number of functional evaluations. However, for a given population size, as the number of generation increases the hypervolume reduces. Which I think should rather increase. Why am I getting such an answer?

Reference front contains 45000 points.

Code used:

import os
import sys
iter = 1
maxIter = 3 #How many times you want to do it…
while (iter <= maxIter):
from jmetal.algorithm.multiobjective.nsgaii import NSGAII
from jmetal.operator import SBXCrossover, PolynomialMutation
from jmetal.util.termination_criterion import StoppingByEvaluations

problem = MyProblem()
MFES= 10000

algorithm = NSGAII(
problem=problem,
population_size=100,
offspring_population_size=100,
mutation=PolynomialMutation(probability=0.3, distribution_index=20),
crossover=SBXCrossover(probability=0.9, distribution_index=20),
termination_criterion=StoppingByEvaluations(max_evaluations=MFES)
)

algorithm.run()
solutions = algorithm.get_result()

from jmetal.util.solution import get_non_dominated_solutions
front = get_non_dominated_solutions(solutions)

approximation_front = np.array([s.objectives for s in front])
reference_front = RF
from sklearn.preprocessing import MinMaxScaler
min_max_scaler = MinMaxScaler()
reference_front_norm = min_max_scaler.fit_transform(reference_front)
approximation_front_norm = min_max_scaler.transform(approximation_front)
reference_point_norm = np.array([1,1,1])

from jmetal.core.quality_indicator import GenerationalDistance,InvertedGenerationalDistance,EpsilonIndicator,HyperVolume

GD = GenerationalDistance(reference_front_norm)
IGD = InvertedGenerationalDistance(reference_front_norm)
Epsilon = EpsilonIndicator(reference_front_norm)
HV = HyperVolume(reference_point_norm)

print('GD:', GD.compute(approximation_front_norm))
print('IGD:', IGD.compute(approximation_front_norm))
print('Epsilon:', Epsilon.compute(approximation_front_norm))
print('Hypervolume:', HV.compute(approximation_front_norm))

iter += 1
print('Loop ended.')

• Are you comparing change in hypervolume between iteration then this would be expected. Oct 29 '21 at 17:31
• No. Its thehypervolume value and not the change Oct 29 '21 at 17:51
• Are you looking for a minimum or maximum? Oct 29 '21 at 18:21
• its a minimization problem Oct 29 '21 at 18:25
• @worldsmithhelper any answers? Nov 1 '21 at 19:37