NSGA2 Python实现

NSGA2 Python实现#importingnecessarymodulesimportmathimportrandomimportmatplotlib.pyplotasPlt#FirstFunctiontooptimizedeffunction1(x1,x2):value=-x1*2+x2returnvalue#SecondFunctiontooptimizedeffunction2(x1,x2):value=-x1*5*x2

大家好,又见面了,我是你们的朋友全栈君。

#importing necessary modules
import math
import random
import matplotlib.pyplot as Plt


#First Function to optimize
def function1(x1,x2):
    value = -x1*2 + x2
    return value
#Second Function to optimize
def function2(x1,x2):

    value = -x1*5*x2
    return value

def index_of(a,list):
    for i in range(0,len(list)):
        if a == list[i]:
            return i
    return 0

#求rank
def cd_index(front,f_values):
    #将front中的目标值排序,
    sorted_index = []
    for i in range(0, len(front)):
        temp_list = []
        temp_index =[]
        for j in front[i]:
            temp_list.append(f_values[j])
        temp_list.sort()
        for n in range(0,len(temp_list)):
            temp_index.append(index_of(temp_list[n],f_values))
        sorted_index.append(temp_index)
    return sorted_index

#求单个目标拥挤度
def crowding_distance(front,f_values):
    #将front中的目标值排序,
    sorted_values = []
    for i in range(0, len(front)):
        temp_list = []
        temp_index =[]
        for j in front[i]:
            temp_list.append(f_values[j])
        temp_list.sort()
        for n in range(0,len(temp_list)):
            temp_index.append(index_of(temp_list[n],f_values))
        sorted_values.append(temp_list)
     #计算拥挤度
    distance = [[] for i in range(0, len(front))]
    for i in range(0, len(front)):
        if len(front[i]) == 1:
            distance[i].append(math.inf)
        elif len(front[i]) == 2:
            distance[i].append(math.inf)
            distance[i].append(math.inf)
        else:
            distance[i].append(math.inf)
            for k in range(1,len(front[i])-1):
                if max(sorted_values[i]) == min(sorted_values[i]):
                    break
                distance[i].append((sorted_values[i][k+1]-sorted_values[i][k-1])/(max(sorted_values[i])-min(sorted_values[i])))
            distance[i].append(math.inf)
    return distance

#求总拥挤度
def Get_TOTAL_Distance(front,f1,f2):
    Tol_Dis = [[] for i in range(0, len(front))]
    tem_tol = []
    crowding_distance1 = crowding_distance(front, f1)  # 每个个体在f1上的拥挤度
    crowding_distance2 = crowding_distance(front, f2)  # 每个个体在f2上的拥挤度
    sorted_index1 = cd_index(front, f1)  # 对f1排序后的个体变换
    sorted_index2 = cd_index(front, f2)  # 对f1排序后的个体变换
    for i in range(0, len(sorted_index1)):
        for j in sorted_index1[i]:
            tem_tol.append(
                crowding_distance1[i][sorted_index1[i].index(j)] + crowding_distance2[i][sorted_index2[i].index(j)])
        Tol_Dis.append(tem_tol)
    return Tol_Dis


def fast_non_dominated_sort(values1,values2):
    S = [[] for i in range(0,len(values1))]
    front = [[]]
    n = [0 for i in range(0,len(values1))]

    for p in range(0,len(values1)):
        #S[p] = []
        #n[p] = 0
        for q in range(0,len(values1)):
            if ( values1[p] < values1[q] and values2[p] < values2[q]) or \
                    (values1[p] < values1[q] and values2[p] <= values2[q]) or \
                    (values1[p] <= values1[q] and values2[p] < values2[q]) :
                S[p].append(q)
            elif ( values1[p] > values1[q] and values2[p] > values2[q]) or \
                    (values1[p] > values1[q] and values2[p] >= values2[q]) or \
                    (values1[p] >= values1[q] and values2[p] > values2[q]) :
                n[p] += 1
        if n[p] == 0:
            front[0].append(p)
    i = 0
    while( front[i] != []):
        Q = []
        for p in front[i]:
            for q in S[p]:
                n[q] -= 1
                if(n[q] == 0):
                    Q.append(q)
        i += 1
        front.append(Q)
    del front[len(front)-1]
    return front

#离散重组
def crossover(a,b):
    r = random.random()
    list = []
    A =[0,0]
    B = [0,0]
    if r>0.5:
        A[0] = mutation(a[0])
        B[1] = mutation(b[1])
        list.append(A[0])
        list.append(B[1])
        return list
    else:
        A[1] = mutation(a[1])
        B[0] = mutation(b[0])
        list.append(B[0])
        list.append(A[1])
        return list

def mutation(a):
    mutation_pro=random.random()
    pop = 0
    if mutation_pro <0.05 :
        pop = min_x[0] + (max_x[0]-min_x[0])*random.random()
        return pop
    elif mutation_pro >0.05 and mutation_pro <0.1 :
        pop = min_x[1] + (max_x[1] - min_x[1]) * random.random()
        return pop
    else:
        return a



#Main program
popsize = 50
max_gen = 200

#Initialization
min_x = [-1,1]
max_x = [2,6]
pop = [[] for i in range(0,popsize)]
for i in range(0,popsize):
    for j in range(0,len(min_x)):
        pop[i].append(min_x[j]+(max_x[j]-min_x[j])*random.random())

gen = 0
while gen<max_gen:
    #Selection
    f1_values = [function1(pop[i][0], pop[i][1]) for i in range(0, popsize)]  # 得到每个个体的目标1值f1
    f2_values = [function2(pop[i][0], pop[i][1]) for i in range(0, popsize)]  # 得到每个个体的目标2值f2
    Front = fast_non_dominated_sort(f1_values[:],f2_values[:])#非支配排序
    #计算拥挤度
    Tol_Dis = Get_TOTAL_Distance(Front,f1_values,f2_values)

    pop2 = pop[:]
    # Generating offsprings
    while (len(pop2)!= 2*popsize) :
        p1 = random.randint(0,popsize-1)
        p2 = random.randint(0, popsize - 1)
        pop2.append(crossover(pop[p1],pop[p2]))

    f1_values1 = [function1(pop2[i][0], pop2[i][1]) for i in range(0, 2*popsize)]  # 得到每个个体的目标1值f1
    f2_values1 = [function2(pop2[i][0], pop2[i][1]) for i in range(0, 2*popsize)]  # 得到每个个体的目标2值f2
    Front1 = fast_non_dominated_sort(f1_values1[:], f2_values1[:])  # 非支配排序
    # 计算拥挤度
    Tol_Dis1 = Get_TOTAL_Distance(Front1, f1_values1, f2_values1)
    #Select
    num = 0
    new_pop_index = []
    for i in range(0, len(Front1)):
        if len(Front1[i]) < (popsize - num):  # 非支配排序选择 popsize是初代种群个数
            for j in range(0,len(Front1[i])):
                new_pop_index.append(Front1[i][j])
        else:  # 拥挤度选择
            for j in range(0, popsize - num):
                new_pop_index.append(Front1[i][j])
                if len(new_pop_index)== popsize:
                    break;
        num += len(Front1[i])
    new_pop = [pop2[i] for i in new_pop_index]
    pop = new_pop
    gen +=1

#plot
function1 = [i * -1  for i in f1_values]
function2 = [j * -1  for j in f2_values]
Plt.xlabel('Function 1 ',fontsize = 15)
Plt.ylabel('Function 2 ',fontsize = 15)
Plt.scatter(function1,function2)
Plt.show()



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/144579.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql字符串截取函数_excel 截取部分字符

    mysql字符串截取函数_excel 截取部分字符MySQL 字符串截取函数:left(), right(), substring(), substring_index()。还有 mid(), substr()。其中,mid(), substr() 等价于 substring() 函数,substring() 的功能非常强大和灵活。  1. 字符串截取:left(str, length)  mysql> select left(‘sqls

    2022年10月2日
    0
  • linux系统下安装软件的命令(在linux下安装win系统)

    rabbitMq是用erlang分布式语言开发的,故需先安装erlang下载erlang的tar包:erlang下载首先连接到linux,切换至root用户,并cd至usr/local目录下,在该目录下使用如下命令新建erlang文件夹cd/usr/locallsmkdirerlang使用如下命令给文件夹授权//给local赋予读写权限chmod777local/…

    2022年4月11日
    75
  • tcpdump抓包命令怎么用_tcpdump指定ip抓包命令

    tcpdump抓包命令怎么用_tcpdump指定ip抓包命令今天要给大家介绍的一个Unix下的一个网络数据采集分析工具,也就是我们常说的抓包工具。与它功能类似的工具有wireshark,不同的是,wireshark有图形化界面,而tcpdump则只有命令行。由于我本人更习惯使用命令行的方式进行抓包,因此今天先跳过wireshark,直接给大家介绍这个tcpdump神器。这篇文章,我肝了好几天,借助于Linux的man帮助命令,我把tcpdump的用法全部研究了个遍,才形成了本文,不夸张的说,应该可以算是中文里把tcpdump.

    2022年8月20日
    17
  • springboot实现拦截器_spring拦截器和过滤器

    springboot实现拦截器_spring拦截器和过滤器集成拦截器登录验证为例添加拦截器public class LoginInterceptor implements HandlerInterceptor { private Logger log = LoggerFactory.getLogger(getClass()); //Controller逻辑执行之前 @Override public boolean preHandle(HttpServletRequest request, HttpServletRe

    2022年8月9日
    0
  • bc04蓝牙模块_戴尔蓝牙鼠标怎么打开

    bc04蓝牙模块_戴尔蓝牙鼠标怎么打开一、简介BT401支持双模蓝牙,所以可以很轻松的支持蓝牙BLE。因为支持了BLE,所有就支持了BLE的HID。也就是蓝牙的键盘、鼠标设备注意,这里BLE的HID是可以回连手机的2.1串口指令和测试的效果1、AT+HD123456789aBcS其中:AT+HD是命令,123456789aBcS是需要发送的数据2、其他所有的指令参考标准的即可,包括设置波…

    2025年5月24日
    0
  • Java的Volatile关键字的作用

    Java的Volatile关键字的作用VolatileVolatile概念是Java特有的。如果你理解它解决的问题,会更容易理解它。如果一个变量,例如一个计数器正在被一个线程使用,有可能计数器的一个副本放在CPU高速缓存里,并且每次修改时,仅修改高速缓存的内容,而不是写到主存。JVM会决定什么时候更新主存。甚至当其他线程从主存里读取计数器的值时,有可能读到过期的值。如果一个变量用volatile修饰,不论一个线程读还是写此变量,总是从主存里读写。作为进一步的保证,当一个写线程写一个volatile修饰的变量时,写线程能看到的所有变

    2022年5月16日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号