收集整理了一份《2024年最新Python全套学习资料》免费送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Python知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来
如果你需要这些资料,可以添加V无偿获取:hxbc188 (备注666)
正文
#自适应变异算子=
lambda1 = np.exp(1 - G / (G + 1 - gen))
F = F0 * np.power(2, lambda1)
#=r1,r2,r3和m互不相同=
for m in range(NP): # 遍历每一个个体
r1=np.random.randint(0,NP,1)
while r1==m: #r1不能取m
r1 = np.random.randint(0, NP, 1)
r2=np.random.randint(0,NP,1)
while (r2m) or (r2r1): #r2不能取m 和r1
r2 = np.random.randint(0, NP, 1)
r3 = np.random.randint(0, NP, 1)
while (r3m) or (r3r2) or (r3==r1):#r3不能取m,r2,r1
r3 = np.random.randint(0, NP, 1)
v[m,:]=x[r1,:]+F*(x[r2,:]-x[r3,:]) #v.shape =(50, 10) 存放的是变异后的种群
#交叉操作===
r = np.random.randint(0, D, 1) #随机选择维度 (即选择x的一维)
for n in range(D):#遍历每一个维度
cr=np.random.random() #生成一个0-1之间的随机数
if (cr<CR) or (n==r):#如果随机数小于交叉算子 或者 当前维数 等于r
u[:,n]=v[:,n] #则选择群体个体维数 为变异后的维数
else:
u[:, n]=x[:,n] #为原始维度
#=边界条件处理===
for m in range(NP):#遍历每一个个体
for n in range(D): # 遍历每一个维度
if (u[m,n]<Xx) or (u[m,n]>Xs):#如果当前元素不处于最大值和最小值之间
u[m, n]=np.random.uniform(Xx, Xs)#则重新初始化该元素
#选择操作=
for m in range(NP):#遍历每一个个体
ob1[m]=func1(u[m,:]) #计算子代个体适应度值
for m in range(NP): # 遍历每一个个体
if ob1[m]<ob[m]:#如果子代个体适应度值小于父代个体适应度值
x[m,:]=u[m,:]#则替换个体
for m in range(NP): # 遍历每一个个体
ob[m]=func1(x[m,:]) #修改父代适应度值
trace.append(min(ob))#记录当代最优适应度值
index=np.argmin(ob)#取出最小值所在位置索引
print(‘最优值解\n’,x[index,:])
print(‘最优值\n’,func1(x[index,:]))
plt.plot(trace)
plt.title(‘迭代曲线’)
plt.show()
7.3 结果
最优值解
[-5.89325075e-04 7.66296863e-04 -8.03461860e-04 4.19070900e-04
5.02012066e-04 2.78923440e-04 6.83655920e-04 3.75556622e-04
-5.35755777e-05 3.49538162e-04]
最优值
2.81897616751295e-06
8 案例2
8.1 案例
求函数f(x, y) = 3cos(xy) +x +y的最小值,其中x的取值范围为[-4,4], y的取值范围为[-4, 4]。 这是一个有多个局部极值的函数。
8.2 代码
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
mpl.rcParams[‘font.sans-serif’] = [‘SimHei’]
mpl.rcParams[‘axes.unicode_minus’] = False
#=适应度函数=
def func2(x):
value = 3 * np.cos(x[0] * x[1]) + x[0] + x[1]
return value
#初始化
NP=20 #个体数目
D=2 #变量的维数
G=12 #最大进化代数
F=0.5 #变异算子
CR=0.1 #交叉算子
Xs=4 #上限
Xx=-4 #下限
ob = np.zeros(NP) # 存放个体目标函数值(父辈)
ob1 = np.zeros(NP) # 存放个体目标函数值(子代)
#赋初值====
x = np.zeros((NP, D)) # 初始种群 (个体数目,维数)
v = np.zeros((NP, D)) # 变异种群 (个体数目,维数)
u = np.zeros((NP, D)); # 选择种群 (个体数目,维数)
x = np.random.uniform(Xx, Xs, (NP, D)) # 赋初值 (xx-xs之间的随机数 ,(个体数目,维数)
trace = [] # 记录每次迭代的最小适应值
#=计算当前群体个体目标函数值
for i in range(NP): # 遍历每一个个体
ob[i] = func2(x[i, :])
trace.append(np.min(ob))
#==差分进化循环
for gen in range(G): # 遍历每一代
#=变异操作=
#=r1,r2,r3和m互不相同
for m in range(NP): # 遍历每一个个体
r1 = np.random.randint(0, NP, 1)
while r1 == m: # r1不能取m
r1 = np.random.randint(0, NP, 1)
r2 = np.random.randint(0, NP, 1)
while (r2 == m) or (r2 == r1): # r2不能取m 和r1
r2 = np.random.randint(0, NP, 1)
r3 = np.random.randint(0, NP, 1)
while (r3 == m) or (r3 == r2) or (r3 == r1): # r3不能取m,r2,r1
r3 = np.random.randint(0, NP, 1)
v[m, :] = x[r1, :] + F * (x[r2, :] - x[r3, :]) # v.shape =(20, 2) 存放的是变异后的种群
#交叉操作=
r = np.random.randint(0, D, 1) # 随机选择维度 (即选择x的一维)
for n in range(D): # 遍历每一个维度
cr = np.random.random() # 生成一个0-1之间的随机数
if (cr < CR) or (n == r): # 如果随机数小于交叉算子 或者 当前维数 等于r
u[:, n] = v[:, n] # 则选择群体个体维数 为变异后的维数
else:
u[:, n] = x[:, n] # 为原始维度
#=边界条件处理====
for m in range(NP): # 遍历每一个个体
for n in range(D): # 遍历每一个维度
if (u[m, n] < Xx) or (u[m, n] > Xs): # 如果当前元素不处于最大值和最小值之间
u[m, n] = np.random.uniform(Xx, Xs) # 则重新初始化该元素
#选择操作=
for m in range(NP): # 遍历每一个个体
ob1[m] = func2(u[m, :]) # 计算子代个体适应度值
for m in range(NP): # 遍历每一个个体
if ob1[m] < ob[m]: # 如果子代个体适应度值小于父代个体适应度值
x[m, :] = u[m, :] # 则替换个体
for m in range(NP): # 遍历每一个个体
ob[m] = func2(x[m, :]) # 修改父代适应度值
trace.append(min(ob)) # 记录当代最优适应度值
index=np.argmin(ob)#取出最小值所在位置索引
print(‘最优值解\n’,x[index,:])
print(‘最优值\n’,func2(x[index,:]))
plt.plot(trace)
plt.title(‘迭代曲线’)
plt.show()
8.3 结果
最优值解
[-3.92989959 -3.99847196]
最优值
-10.92832400647969
9 案例3——离散差分算法
9.1 案例
用离散差分进化算法求函数的最大值,其中x的取值为- 100~ 100之间的整数, y的取值为一100~ 100之间的整数。
9.2 Python实现
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
mpl.rcParams[‘font.sans-serif’] = [‘SimHei’]
mpl.rcParams[‘axes.unicode_minus’] = False
#=适应度函数=====
def func3(x):
value=-(np.power(x[0]*x[0]+x[1]-1,2)+np.power(x[0]+x[1]*x[1]-7,2)/200)+10
return value
#print(func3([-2,-3]))
#初始化=======
NP=20 #个体数目
D=2 #变量的维数
G=100 #最大进化代数
F=0.5 #变异算子
CR=0.1 #交叉算子
Xs=100 #上限
Xx=-100 #下限
ob = np.zeros(NP) # 存放个体目标函数值(父辈)
ob1 = np.zeros(NP) # 存放个体目标函数值(子代)
#赋初值===
x = np.zeros((NP, D)) # 初始种群 (个体数目,维数)
v = np.zeros((NP, D)) # 变异种群 (个体数目,维数)
u = np.zeros((NP, D)); # 选择种群 (个体数目,维数)
x = np.random.randint(Xx, Xs, (NP, D)) # 赋初值 (xx-xs之间的随机整数 ,(个体数目,维数)
trace = [] # 记录每次迭代的最大适应值
#======计算当前群体个体目标函数值
for i in range(NP): # 遍历每一个个体
ob[i] = func3(x[i, :])
trace.append(np.max(ob))
#==差分进化循环=
for gen in range(G): # 遍历每一代
#变异操作====
#===r1,r2,r3和m互不相同=
for m in range(NP): # 遍历每一个个体
r1 = np.random.randint(0, NP, 1)
while r1 == m: # r1不能取m
r1 = np.random.randint(0, NP, 1)
r2 = np.random.randint(0, NP, 1)
while (r2 == m) or (r2 == r1): # r2不能取m 和r1
r2 = np.random.randint(0, NP, 1)
r3 = np.random.randint(0, NP, 1)
while (r3 == m) or (r3 == r2) or (r3 == r1): # r3不能取m,r2,r1
r3 = np.random.randint(0, NP, 1)
v[m, :] = np.floor(x[r1, :] + F * (x[r2, :] - x[r3, :]))
v.shape =(20, 2) 存放的是变异后的种群 np.floor 向下取整
#交叉操作=
r = np.random.randint(0, D, 1) # 随机选择维度 (即选择x的一维)
for n in range(D): # 遍历每一个维度
cr = np.random.random() # 生成一个0-1之间的随机数
if (cr < CR) or (n == r): # 如果随机数小于交叉算子 或者 当前维数等于r
u[:, n] = v[:, n] # 则选择群体个体维数 为变异后的维数
else:
u[:, n] = x[:, n] # 为原始维度
#=边界条件处理==
for m in range(NP): # 遍历每一个个体
for n in range(D): # 遍历每一个维度
if (u[m, n] < Xx) or (u[m, n] > Xs): # 如果当前元素不处于最大值和最小值之间
u[m, n] = np.random.randint(Xx, Xs) # 则重新初始化该元素
#=选择操作
for m in range(NP): # 遍历每一个个体
ob1[m] = func3(u[m, :]) # 计算子代个体适应度值
for m in range(NP): # 遍历每一个个体
if ob1[m] > ob[m]: # 如果子代个体适应度值大于父代个体适应度值
x[m, :] = u[m, :] # 则替换个体
for m in range(NP): # 遍历每一个个体
ob[m] = func3(x[m, :]) # 修改父代适应度值
trace.append(max(ob)) # 记录当代最优适应度值
index = np.argmax(ob) # 取出最小值所在位置索引
print(‘最优值解\n’, x[index, :])
print(‘最优值\n’, func3(x[index, :]))
plt.plot(trace)
plt.title(‘迭代曲线’)
plt.show()
9.3 结果
最优解
[-2,-3]
最优值
10.0
10 案例4——求解复杂约束问题
10.1 案例
10.2 Python实现
import numpy as np
import matplotlib.pyplot as plt
from pylab import *
mpl.rcParams[‘font.sans-serif’] = [‘SimHei’]
mpl.rcParams[‘axes.unicode_minus’] = False
#=============分别是计算适应度函数和计算约束惩罚项函数=
def calc_f(X):
“”“计算群体粒子的目标函数值,X 的维度是 size * 2 “””
a = 10
pi = np.pi
x = X[0]
y = X[1]
return 2 * a + x ** 2 - a * np.cos(2 * pi * x) + y ** 2 - a * np.cos(2 * 3.14 * y)
def calc_e(X):
“”“计算群体粒子的目惩罚项,X 的维度是 size * 2 “””
ee = 0
“”“计算第一个约束的惩罚项”“”
e1 = X[0] + X[1] - 6
ee += max(0, e1)
“”“计算第二个约束的惩罚项”“”
e2 = 3 * X[0] - 2 * X[1] - 5
ee += max(0, e2)
return ee
#子代和父辈之间的选择操作
def update_best(parent,parent_fitness,parent_e,child,child_fitness,child_e):
“”"
判
:param parent: 父辈个体
:param parent_fitness:父辈适应度值
:param parent_e :父辈惩罚项
:param child: 子代个体
:param child_fitness 子代适应度值
:param child_e :子代惩罚项
:return: 父辈 和子代中较优者、适应度、惩罚项
“”"
规则1,如果 parent 和 child 都没有违反约束,则取适应度小的
if parent_e <= 0.0000001 and child_e <= 0.0000001:
if parent_fitness <= child_fitness:
return parent,parent_fitness,parent_e
else:
return child,child_fitness,child_e
规则2,如果child违反约束而parent没有违反约束,则取parent
if parent_e < 0.0000001 and child_e >= 0.0000001:
return parent,parent_fitness,parent_e
规则3,如果parent违反约束而child没有违反约束,则取child
if parent_e >= 0.0000001 and child_e < 0.0000001:
return child,child_fitness,child_e
规则4,如果两个都违反约束,则取适应度值小的
if parent_fitness <= child_fitness:
return parent,parent_fitness,parent_e
else:
return child,child_fitness,child_e
#初始化参数=====
NP=50 #种群数量
D=2 # 对应x,y
G=150 #最大遗传代数
F0=0.1 #变异算子
CR=0.1 #交叉算子
Xmax=2 #x上限
Xmin=1 #x下限
Ymax=0 #y上限
Ymin=-1 #y 下限
fit = np.zeros(NP) # 存放个体目标函数值(父辈)
fit1 = np.zeros(NP) # 存放个体目标函数值(子代)
ee=np.zeros(NP) # 存放个体惩罚项(父辈)
ee1=np.zeros(NP) # 存放个体惩罚项(子代)
fitness=np.zeros(NP) # 存放个体适应度值(父辈)
fitness1=np.zeros(NP) # 存放个体适应度值(子代)
#赋初值=
x = np.zeros((NP, D)) # 初始种群 (个体数目,维数)
v = np.zeros((NP, D)) # 变异种群 (个体数目,维数)
u = np.zeros((NP, D)); # 选择种群 (个体数目,维数)
x = np.random.uniform(-1, 2, (NP, D)) # 赋初值 (xx-xs之间的随机整数 ,(个体数目,维数)
trace = [] # 记录每次迭代的最小适应值
#=计算当前群体个体目标函数值
for i in range(NP): # 遍历每一个个体
fit[i]=calc_f(x[i, :])#目标函数值
ee[i]=calc_e(x[i, :]) #惩罚项
fitness[i] = fit[i]+ee[i] #适应度值
trace.append(np.min(fitness))
#差分进化循环=
for gen in range(G): # 遍历每一代
#变异操作===
for m in range(NP): # 遍历每一个个体
lambda1 = np.exp(1 - G / (G + 1 - gen))
F = F0 * np.power(2, lambda1)
#r1,r2,r3和m互不相同=
for m in range(NP): # 遍历每一个个体
r1 = np.random.randint(0, NP, 1)
感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
如果你需要这些资料,可以添加V无偿获取:hxbc188 (备注666)
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
G / (G + 1 - gen))
F = F0 * np.power(2, lambda1)
#r1,r2,r3和m互不相同=
for m in range(NP): # 遍历每一个个体
r1 = np.random.randint(0, NP, 1)
感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的:
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
如果你需要这些资料,可以添加V无偿获取:hxbc188 (备注666)
[外链图片转存中…(img-0AvA4ZUX-1713841927786)]
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!