NSGA2_python

import random
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])):
  • 9
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值