eated on Fri Jul 20 15:42:42 2018
"""
import random
import numpy as np
from matplotlib.ticker import MultipleLocator
import matplotlib.pyplot as plt
class SPEA2():
def __init__(self, dim, pop, max_iter): #维度,群体数量,迭代次数
self.pc = 0.4 #交叉概率
self.pm = 0.4 #变异概率
self.dim = dim #搜索维度
self.pop = pop #粒子数量
self.K = int(np.sqrt(pop + pop)) #距离排序,第k个距离值
self.max_iter = max_iter #迭代次数
self.population = [] #父代种群
self.archive = [] #存档集合
self.popu_arch = [] #合并后的父代与存档集合种群
#self.fronts = [] #Pareto前沿面
self.KNN = [] #最近领域距离,K-th
#self.rank = []#np.zeros(self.pop) #非支配排序等级
self.S = [] # 个体 i的 Strength Value
self.D = [] # density,距离度量
self.R = [] # 支配关系度量
self.F = [] # 适应度
self.objectives = [] #目标函数值
#self.np = [] #该个体支配的其它个体数目
self.set = [] # 被支配的个体集
def init_Population(self): #初始化种群
self.population = np.zeros((self.pop,self.dim))
self.archive = np.zeros((self.pop,self.dim))
for i in range(self.pop):
for j in range(self.dim):
self.population[i][j] = random.random()
self.archive[i][j] = random.random()
def popu_archive(self): # Population和 Archive合并,pop*2
self.popu_arch = np.zeros((2*self.pop,self.dim))
for i in range(self.pop):
for j in range(self.dim):
self.popu_arch[i][j] = self.population[i][j]
self.popu_arch[i+self.pop][j] = self.archive[i][j]
def cal_obj(self,position): #计算一个个体的多目标函数值 f1,f2 最小值
f1 = position[0]
f = 0
for i in range(self.dim-1):