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(
    mutation=PolynomialMutation(probability=0.3, distribution_index=20),
    crossover=SBXCrossover(probability=0.9, distribution_index=20),

    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.')
  • $\begingroup$ Are you comparing change in hypervolume between iteration then this would be expected. $\endgroup$ Oct 29 '21 at 17:31
  • $\begingroup$ No. Its thehypervolume value and not the change $\endgroup$
    – vp_050
    Oct 29 '21 at 17:51
  • $\begingroup$ Are you looking for a minimum or maximum? $\endgroup$ Oct 29 '21 at 18:21
  • $\begingroup$ its a minimization problem $\endgroup$
    – vp_050
    Oct 29 '21 at 18:25
  • $\begingroup$ @worldsmithhelper any answers? $\endgroup$
    – vp_050
    Nov 1 '21 at 19:37

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Browse other questions tagged or ask your own question.