import random
import numpy as np
from matplotlib.ticker import MultipleLocator
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.ticker import MultipleLocator
import matplotlib.pyplot as plt
class NSGA2():
def __init__(self, dim, pop, max_iter): #维度,群体数量,迭代次数
self.pc = 0.4 #交叉概率
self.pm = 0.4 #变异概率
self.dim = dim #搜索维度
self.pop = pop #粒子数量
self.max_iter = max_iter #迭代次数
self.population = [] #父代种群
self.new_popu = [] #选择算子操作过后的新种群
#self.children = [] #子代种群
self.popu_child = [] #合并后的父代与子代种群
self.fronts = [] #Pareto前沿面
self.rank = []#np.zeros(self.pop) #非支配排序等级
self.crowding_distance = [] #个体拥挤度
self.objectives = [] #目标函数值,pop行 2列
self.set = [] #个体 i的支配解集
self.np = [] #该个体被支配的数目
def init_Population(self): #初始化种群
self.population = np.zeros((self.pop,self.dim))
for i in range(self.pop):
for j in range(self.dim):
self.population[i][j] = random.random()
def children_parent(self): #父代种群和子代种群合并,pop*2
self.popu_child = np.zeros((2*self.pop,self.dim))#self.population
for i in range(self.pop):
for j in range(self.dim):
self.popu_child[i][j] = self.population[i][j]
self.popu_child[i+self.pop][j] = self.new_popu[i][j]
def select_newparent(self): #根据排序和拥挤度计算,选取新的父代种群 pop*2 到 pop*1
#self.non_donminate2()
#self.crowd_distance()
self.population = np.zeros((self.pop,self.dim)) #选取新的种群
a = len(self.fronts[0]) #Pareto前沿面第一层 个体的个数
if a >= self.pop:
for i in range(self.pop):
self.population[i] = self.popu_child[self.fronts[0][i]]
else:
d = [] #用于存放前b层个体
i = 1
while a < self.pop:
c = a #新种群内 已经存放的个体数目 *列
a += len(self.fronts[i])
for j in range(len(self.fronts[i-1])):
d.append(self.fronts[i-1][j])
#while d < self.dim:
#self.population[j][d] = self.popu_child[self.fronts[i-1][j]][d]
#d += 1
b = i #第b层不能放,超过种群数目了 *行
i = i+1
#把前c个放进去
for j in range(c):
self.population[j] = self.popu_child[d[j]]
temp = np.zeros((len(self.fronts[b]),2)) #存放拥挤度和个体序号
for i in range(len(self.fronts[b])):
def __init__(self, dim, pop, max_iter): #维度,群体数量,迭代次数
self.pc = 0.4 #交叉概率
self.pm = 0.4 #变异概率
self.dim = dim #搜索维度
self.pop = pop #粒子数量
self.max_iter = max_iter #迭代次数
self.population = [] #父代种群
self.new_popu = [] #选择算子操作过后的新种群
#self.children = [] #子代种群
self.popu_child = [] #合并后的父代与子代种群
self.fronts = [] #Pareto前沿面
self.rank = []#np.zeros(self.pop) #非支配排序等级
self.crowding_distance = [] #个体拥挤度
self.objectives = [] #目标函数值,pop行 2列
self.set = [] #个体 i的支配解集
self.np = [] #该个体被支配的数目
def init_Population(self): #初始化种群
self.population = np.zeros((self.pop,self.dim))
for i in range(self.pop):
for j in range(self.dim):
self.population[i][j] = random.random()
def children_parent(self): #父代种群和子代种群合并,pop*2
self.popu_child = np.zeros((2*self.pop,self.dim))#self.population
for i in range(self.pop):
for j in range(self.dim):
self.popu_child[i][j] = self.population[i][j]
self.popu_child[i+self.pop][j] = self.new_popu[i][j]
def select_newparent(self): #根据排序和拥挤度计算,选取新的父代种群 pop*2 到 pop*1
#self.non_donminate2()
#self.crowd_distance()
self.population = np.zeros((self.pop,self.dim)) #选取新的种群
a = len(self.fronts[0]) #Pareto前沿面第一层 个体的个数
if a >= self.pop:
for i in range(self.pop):
self.population[i] = self.popu_child[self.fronts[0][i]]
else:
d = [] #用于存放前b层个体
i = 1
while a < self.pop:
c = a #新种群内 已经存放的个体数目 *列
a += len(self.fronts[i])
for j in range(len(self.fronts[i-1])):
d.append(self.fronts[i-1][j])
#while d < self.dim:
#self.population[j][d] = self.popu_child[self.fronts[i-1][j]][d]
#d += 1
b = i #第b层不能放,超过种群数目了 *行
i = i+1
#把前c个放进去
for j in range(c):
self.population[j] = self.popu_child[d[j]]
temp = np.zeros((len(self.fronts[b]),2)) #存放拥挤度和个体序号
for i in range(len(self.fronts[b])):