Source code for pyJaya.variants.sampe
# -*- coding: utf-8 -*-
from multiprocessing import Pool
import numpy as np
from .base import JayaBase
from .clasic import JayaClasic
from pyJaya.population import Population
from pyJaya.solution import Solution
[docs]class JayaSAMPE(JayaBase):
"""Jaya SAMPE 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 sprint(self, population):
"""Jaya clasic to sub-population
Args:
population (Population): Population to evaluate whit Jaya clasic.
Returns:
Population: Sprint final population.
"""
result = population.getBestAndWorst()
r1 = np.random.rand(self.cantVars)
r2 = np.random.rand(self.cantVars)
for solution in population.solutions:
solt = []
for v_item, v_value in enumerate(solution.solution):
solt.append(self.listVars[v_item].convert(
(
v_value+r1[v_item] *
(result['best_solution'][v_item] - abs(v_value)) -
r2[v_item] *
(result['worst_solution'][v_item]-abs(v_value)))
))
auxSolution = Solution(
self.listVars, self.functionToEvaluate,
self.listConstraints)
auxSolution.setSolution(np.array(solt))
if self.minimax:
if (auxSolution.value > solution.value) and \
(auxSolution.constraintsOK(np.array(solt))):
solution = auxSolution
else:
if (auxSolution.value < solution.value) and \
(auxSolution.constraintsOK(np.array(solt))):
solution.setSolution(auxSolution.solution)
return population
[docs] def run(self, number_iterations):
"""Run method
Args:
number_iterations (int): Number of iterations.
Returns:
Population: Final population.
"""
result = self.population.getBestAndWorst()
bestValue = result['best_value']
for i in range(number_iterations):
if i == 0:
m = 2
subPopulations = self.population.divideInToWithElitist(m)
for p in subPopulations:
p = self.sprint(p)
newPopulation = Population(self.minimax)
newPopulation.merge(subPopulations)
if self.minimax:
newBest = newPopulation.getBestAndWorst()['best_value']
lastBest = self.population.getBestAndWorst()['best_value']
if newBest > lastBest:
self.population = newPopulation
else:
newBest = newPopulation.getBestAndWorst()['best_value']
lastBest = self.population.getBestAndWorst()['best_value']
if newBest < lastBest:
self.population = newPopulation
else:
if self.minimax:
bV = self.population.getBestAndWorst()['best_value']
if bV > bestValue:
if m < self.numSolutions:
m += 1
bestValue = bV
elif m > 1:
m -= 1
subPopulations = self.population.divideInToWithElitist(m)
for p in subPopulations:
p = self.sprint(p)
newPopulation = Population(self.minimax)
newPopulation.merge(subPopulations)
newBest = newPopulation.getBestAndWorst()['best_value']
lastBest = self.population.getBestAndWorst()['best_value']
if newBest > lastBest:
self.population = newPopulation
else:
bV = self.population.getBestAndWorst()['best_value']
if bV < bestValue:
if m < self.numSolutions:
m += 1
bestValue = bV
elif m > 1:
m -= 1
subPopulations = self.population.divideInToWithElitist(m)
for p in subPopulations:
p = self.sprint(p)
newPopulation = Population(self.minimax)
newPopulation.merge(subPopulations)
newBest = newPopulation.getBestAndWorst()['best_value']
lastBest = self.population.getBestAndWorst()['best_value']
if newBest < lastBest:
self.population = newPopulation
return self.population
[docs]class MultiprocessJayaSAMPE(JayaBase):
"""Multiprocess Jaya SAMPE 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 sprint(self, population):
"""Jaya clasic to sub-population
Args:
population (Population): Population to evaluate whit Jaya clasic.
Returns:
Population: Sprint final population.
"""
numSolutions = len(population.solutions)
jaya_clasic = JayaClasic(
numSolutions, self.listVars, self.functionToEvaluate,
population=population)
if self.minimax:
jaya_clasic.toMaximize()
population = jaya_clasic.run(1)
return population
[docs] @staticmethod
def worker(sampe, population):
"""Worker method
Args:
population (Population): Original population.
Returns:
Population: Generated population by sprint.
"""
return sampe.sprint(population)
[docs] def generate(self, m):
"""Generate population
Args:
m (int): Number of groups based on the quality of the solutions.
Returns:
Population: Generated population.
"""
entrada = self.population.divideInToWithElitist(m)
pool = Pool(processes=3)
results = [
pool.apply_async(
MultiprocessJayaSAMPE.worker,
args=(self, x)) for x in entrada]
subPopulations = [p.get() for p in results]
newPopulation = Population(self.minimax)
newPopulation.merge(subPopulations)
self.population = newPopulation
[docs] def run(self, number_iterations):
"""Run method
Args:
number_iterations (int): Number of iterations.
Returns:
Population: Final population.
"""
result = self.population.getBestAndWorst()
bestValue = result['best_value']
m = 2
for i in range(number_iterations):
if i == 0:
self.generate(2)
else:
if self.minimax:
bV = self.population.getBestAndWorst()['best_value']
if bV > bestValue:
if m < self.numSolutions:
m += 1
bestValue = bV
elif m > 2:
m -= 1
else:
bV = self.population.getBestAndWorst()['best_value']
if bV < bestValue:
if m <= self.numSolutions:
m += 1
bestValue = bV
elif m > 2:
m -= 1
self.generate(m)
return self.population