Source code for pyJaya.variants.quasiOppositional
# -*- coding: utf-8 -*-
import numpy as np
from .base import JayaBase
from .clasic import JayaClasic
from pyJaya.population import Population
from pyJaya.solution import Solution
[docs]class JayaQuasiOppositional(JayaBase):
"""Jaya clasic class
Args:
numSolutions (int): Number of solutions of population.
listVars (list): Range list.
functionToEvaluate (funtion): Function to minimize or maximize.
listConstraints (list, optional): Constraint list. Defaults to [].
population (Population, optional): Population. Defaults to None.
"""
[docs] def generateQuasiOpposite(self, population):
"""Generate quasi-opposite population
Args:
population (Population): Population to generate quasi-opposite.
Returns:
Population: [description]
"""
newPopulation = Population(self.minimax, solutions=[])
for solution in population.solutions:
newSolution = Solution(
self.listVars, self.functionToEvaluate, self.listConstraints)
newsolution = []
for solt_item, solt_value in enumerate(solution.solution):
AL = self.listVars[solt_item].minor
AU = self.listVars[solt_item].major
a = self.listVars[solt_item].convert((AL + AU) / 2)
b = self.listVars[solt_item].convert(AL + AU - solt_value)
val = (max(a, b) - min(a, b)) *\
np.random.random_sample() + min(a, b)
newsolution.append(self.listVars[solt_item].convert(val))
newSolution.setSolution(newsolution)
newPopulation.solutions.append(newSolution)
return newPopulation
[docs] def newPopulation(self):
"""New population with quasi-opposite elements.
Returns:
Population: Population with quasi-opposite elements.
"""
auxPopulation = Population(self.minimax, solutions=[])
quasiOppositePopulation = self.generateQuasiOpposite(self.population)
for s in self.population.solutions:
auxPopulation.solutions.append(s)
for s in quasiOppositePopulation.solutions:
auxPopulation.solutions.append(s)
newPopulation = Population(self.minimax, solutions=[])
if self.minimax:
for s in auxPopulation.sorted()[-self.numSolutions:]:
newPopulation.solutions.append(s)
else:
for s in auxPopulation.sorted()[:self.numSolutions]:
newPopulation.solutions.append(s)
return newPopulation
[docs] def run(self, number_iterations, rn=[]):
"""Run method
Args:
number_iterations (int): Number of iterations.
Returns:
Population: Final population.
"""
if len(rn) == 0:
self.rn = self.generate_rn(number_iterations)
else:
assert number_iterations == len(rn)
assert len(rn[0]) == self.cantVars
assert len(rn[0][0]) == 2
self.rn = rn
for i in range(number_iterations):
self.population = self.newPopulation()
self.population = JayaClasic(
self.population.size(), self.listVars,
self.functionToEvaluate, listConstraints=self.listConstraints,
population=self.population).run(1, [self.rn[i]])
return self.population