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 案例

用离散差分进化算法求函数f(x,y)=-[(x{2}+y-1){2}+(x+y{2}-7){2}]/200+10的最大值,其中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)

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
img

.cn/img_convert/46506ae54be168b93cf63939786134ca.png)


既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
[外链图片转存中…(img-7zqC2BmK-1712442984537)]

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐