差分进化算法python_差分进化算法DE-python实现

本文介绍了差分进化算法的原理,并提供了Python代码实现,包括种群初始化、变异、交叉、选择等步骤,用于解决Rastrigrin函数优化问题。最终展示了算法的输出结果和迭代过程的图像。
摘要由CSDN通过智能技术生成

算法原理请看https://blog..net/ztf312/article/details/78432711

下面是python 实现

# -*- coding: cp936 -*-

import numpy as np

import matplotlib.pyplot as plt

import math

import random

# Rastrigr 函数

def object_function(x):

f = 0

for i in range(0,len(x)):

f = f + (x[i] ** 2 - (10 * math.cos(2 * np.pi * x[i])) + 10)

return f

# 参数

def initpara():

NP = 100 # 种群数量

F = 0.6 # 缩放因子

CR = 0.7 # 交叉概率

generation = 2000 # 遗传代数

len_x = 10

value_up_range = 5.12

value_down_range = -5.12

return NP, F, CR, generation, len_x, value_up_range, value_down_range

# 种群初始化

def initialtion(NP):

np_list = [] # 种群,染色体

for i in range(0,NP):

x_list = [] # 个体,基因

for j in range(0,len_x):

x_list.append(value_down_range + random.random() * (value_up_range - value_down_range))

np_list.append(x_list)

return np_list

# 列表相减

def substract(a_list,b_list):

a = len(a_list)

new_list = []

for i in range(0,a):

new_list.append(a_list[i]-b_list[i])

return new_list

# 列表相加

def add(a_list,b_list):

a = len(a_list)

new_list = []

for i in range(0,a):

new_list.append(a_list[i]+b_list[i])

return new_list

# 列表的数乘

def multiply(a,b_list):

b = len(b_list)

new_list = []

for i in range(0,b):

new_list.append(a * b_list[i])

return new_list

# 变异

def mutation(np_list):

v_list = []

for i in range(0,NP):

r1 = random.randint(0,NP-1)

while r1 == i:

r1 = random.randint(0,NP-1)

r2 = random.randint(0,NP-1)

while r2 == r1 | r2 == i:

r2 = random.randint(0,NP-1)

r3 = random.randint(0,NP-1)

while r3 == r2 | r3 == r1 | r3 == i:

r3 = random.randint(0,NP-1)

v_list.append(add(np_list[r1], multiply(F, substract(np_list[r2],np_list[r3]))))

return v_list

# 交叉

def crossover(np_list,v_list):

u_list = []

for i in range(0,NP):

vv_list = []

for j in range(0,len_x):

if (random.random() <= CR) | (j == random.randint(0,len_x - 1)):

vv_list.append(v_list[i][j])

else:

vv_list.append(np_list[i][j])

u_list.append(vv_list)

return u_list

# 选择

def selection(u_list,np_list):

for i in range(0,NP):

if object_function(u_list[i]) <= object_function(np_list[i]):

np_list[i] = u_list[i]

else:

np_list[i] = np_list[i]

return np_list

# 主函数

NP, F, CR, generation, len_x, value_up_range, value_down_range = initpara()

np_list = initialtion(NP)

min_x = []

min_f = []

for i in range(0,NP):

xx = []

xx.append(object_function(np_list[i]))

min_f.append(min(xx))

min_x.append(np_list[xx.index(min(xx))])

for i in range(0,generation):

v_list = mutation(np_list)

u_list = crossover(np_list,v_list)

np_list = selection(u_list,np_list)

for i in range(0,NP):

xx = []

xx.append(object_function(np_list[i]))

min_f.append(min(xx))

min_x.append(np_list[xx.index(min(xx))])

# 输出

min_ff = min(min_f)

min_xx = min_x[min_f.index(min_ff)]

print('the minimum point is x ')

print(min_xx)

print('the minimum value is y ')

print(min_ff)

# 画图

x_label = np.arange(0,generation+1,1)

plt.plot(x_label,min_f,color = 'blue')

plt.xlabel('iteration')

plt.ylabel('fx')

plt.savefig('./iteration-f.png')

plt.show()

下面是输出结果:

he minimum point is x

[6.571458044073247e-10, -1.6132099500206647e-09, 5.479208933390588e-10, 1.4316602937984918e-10, -1.0300811905852257e-09, -9.4552825214611e-11, 7.820675729557053e-10, -1.0017881437355374e-09, 7.502751928050157e-11, 8.595546094079207e-10]

the minimum value is y

0.0

c9f57a56bcba7e77d717527bb1d169d2.png

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值