Python面试题整理,智能优化算法—(1),【秋招面试专题解析
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)
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Python工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Python开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。






既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)

.cn/img_convert/46506ae54be168b93cf63939786134ca.png)



既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Python开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注Python)
[外链图片转存中…(img-7zqC2BmK-1712442984537)]
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐
的最大值,其中x的取值为- 100~ 100之间的整数, y的取值为一100~ 100之间的整数。


所有评论(0)