当前位置: 首页 > news >正文

10.1.1 启用python达成第一个遗传算法

举例如下:

求函数的在x=[-3,3],y=[-3,3]上的最大值:

【思路】

1. 把DNA设为:48个bit的数组。 奇数为x,  偶数为y;就是说24个位组成x,24个位组成y。

如何得到x,y: 24个奇数位转换成数值比如b,  则 x =  b/(2^24-1)* (3 - (-3))  -3 

2.交叉因子:

        就是父的前一部分+母DNA的后一部分

3. 变异因子:

        就是某个位取反。

【代码】

代码如下,使用200条DNA,迭代100次,得到结果 (x,y)=(0,1.582), z=8.1.  结果比较稳定。

import numpy as np
import matplotlib.pyplot as plt
from jmespath.ast import projection
from matplotlib import  cm
from mpl_toolkits.mplot3d import Axes3D
DNA_SIZE=24
POP_SIZE=200
N_GENERATIONS=100
CROSSOVER_RATE=0.8
MUTATION_RATE=0.005
X_BOUND =[-3,3]
Y_BOUND =[-3,3]
def F(x,y):
# 2(3-x)^2 e( -x^2 - (y+1)^2) - 4 e(-(x+2)^2-y^2) - 6 e(-(x-2)^2-y(y-2)^2)
#return   2*(3-x)**2* np.exp(-x**2-(y+1)**2)-4*np.exp(-(x+2)**2-y**2)-6*np.exp(-(x-2)**2-(y-2)**2)
return 3*(1-x)**2*np.exp(-(x**2)-(y+1)**2)-10*(x/5-x**3-y**5)*np.exp(-x**2-y**2)-1/2*np.exp(-(x+1)**2-y**2)
#return 10-x**2-y**2
def plot_3d(ax):
x = np.linspace(*X_BOUND, 100)
y = np.linspace(*Y_BOUND, 100)
X, Y = np.meshgrid(x, y)
Z = F(X, Y)
surf = ax.plot_surface(X,Y,Z,rstride=1,cstride=1,cmap = cm.coolwarm)
# 添加颜色条
fig.colorbar(surf, ax=ax, shrink=0.5, aspect=10)
# 设置坐标轴标签
ax.set_zlim((-20,20))
ax.set_xlabel('X轴')
ax.set_ylabel('Y轴')
ax.set_zlabel('Z轴')
# 设置标题
ax.set_title(':z=f(x,y)')
plt.pause(3)
plt.show()
def translateDNA(pop):
x_pop = pop[:,1::2] #奇数列表示x
y_pop = pop[:,::2] #偶数列表示y
x = x_pop.dot(  2** np.arange(DNA_SIZE) [::-1]   )/float(2**DNA_SIZE-1)*(X_BOUND[1]-X_BOUND[0])+ X_BOUND[0]
y = y_pop.dot(  2** np.arange(DNA_SIZE) [::-1]   )/float(2**DNA_SIZE-1)*(Y_BOUND[1]-Y_BOUND[0])+ Y_BOUND[0]
return  x,y
def crossover_and_mutaion(pop,Crossover_rate=CROSSOVER_RATE):
halfpop = int(POP_SIZE/2)
fitness = get_fitness(pop)
indices = np.argpartition(fitness, -halfpop)[-halfpop:]  #得到前50%最好的样本进行保留
new_pop=[]
#保留原来比较好的50%.
for pepole in pop[indices]:
new_pop.append(pepole)
#其他的进行交叉以及变异
for father in pop:
child = father
if(np.random.rand()

【附录】

1.np.argpartition可以取数组中最大的k个值的序号;或者最小k个值的序号

最小3个值的序号: np.argpartition(arr, 3)[:3]

最大3个值的序号: np.argpartition(arr, -3)[-3:]

最小值序号举例如下:

arr = np.array([3, 1, 4, 1, 5, 9, 2, 6])   ---> [3, 1, 4, 1, 5, 9, 2, 6]    
indices = np.argpartition(arr, 3)           ---> [1 3   6  0  2  4  7  5]

np.argpartition(arr, 3)[:3]                   -----> array([1, 3, 6])
最大值序号举例如下:

np.argpartition(arr, -3)[-3:]               ----> array([4, 7, 5])

2.np.random.choice(a),从数组中选择,可指定概率,可放回/不放回

np.random.choice(a, size=None, replace=True, p=None)
参数说明默认值
a输入数组或整数必需
size输出形状None
replace是否允许重复抽样True
p每个元素的概率分布None

np.random.choice(data,7,replace=False)         --》  array([5, 6, 3, 2, 9, 0, 4])

np.random.choice(data,7,replace=True)         -》array([6, 4, 6, 9, 1, 7, 6])

data = np.arange(5)         ---》  array([0, 1, 2, 3, 4])
p=[0.1,0.1,0.2,0.3,0.3]

np.random.choice(data, size=8, p=p)    ----》 array([3, 1, 4, 4, 2, 1, 4, 3])

http://www.hskmm.com/?act=detail&tid=17949

相关文章:

  • [iOS] OC高级编程 - 引用计数 (1) - 详解
  • 实验1 C语言输入输出和简单程序编写
  • PySide6 之鼠标事件写字板
  • 深入解析:golang基础语法(三)常量、指针、别名、关键字、运算符、字符串类型转换
  • 单B细胞技术如何实现兔单抗高通量高特异制备
  • HP激光墨盒换墨粉
  • unordered_map性能被吊打!我用基数树让内存池性能暴涨几十倍的秘密
  • 详细介绍:《 Linux 点滴漫谈: 一 》开源之路:Linux 的历史、演进与未来趋势
  • 深入解析:TENGJUN“二合一(2.5MM+3.5MM)”耳机插座:JA10-BPD051-A;参数与材质说明
  • JAVA第一天
  • JUC:CompletableFuture详解
  • 平替Jenkins,推荐一款国产开源免费的CICD程序 - Arbess
  • Polar靶场-Web中等题目记录(9-16)
  • C# Avalonia 15- Animation- CustomEasingFunction
  • C#进阶
  • 包机制
  • Tensorboard的使用
  • 【Spring Boot】自定义starter
  • PrintNightmare漏洞仍未终结:深入解析PnP配置绕过与防护方案
  • Go 1.26 内置函数 new 新特性
  • 基于BP神经网络的激光焊接数据预测
  • 重要公式 - Emi
  • apt 还是 uv
  • 软件构造中的数据处理(sql) 6章
  • 树的重心(邻接表)
  • 语音芯片怎样接? 语音芯片有哪些常见接口类型?
  • 详细介绍:2025华为杯A题B题C题D题E题F题选题建议思路数学建模研研究生数学建模思路代码文章成品
  • Gitee vs. GitLab:中国开发者为何选择本土代码托管平台?
  • AtCoder Beginner Contest 424
  • ClkLog埋点分析系统-私有化部署+轻量灵活