loading...
群智能算法
发表于:2023-07-05 | 分类: 技术

智能优化算法

讲在前面

基于蚁群算法的共享快递盒配送回收网络优化研究

基于改进马群算法的进场航班规划

粒子群算法PSOGA

这些群智能算法可用于机器学习中的参数调节

或者是为了找到全局最优点

非凸函数的选择

  1. 连续变量_粒子群算法
  2. 离散变量_遗传算法
  3. 维度低_模拟退火算法

这些都是比较老的算法,不建议使用

人工免疫算法

1986年首次提出
借鉴了生物免疫功能,在原有进化算法理论框架的基础上引入了免疫系统

求解过程

  1. 初始抗体群的产生

每个选址方案形成一个长度为P的抗体

例如抗体[5 16 30]表示需求点5 16 30被选为配送中心

  1. 抗体与抗原间的亲和力:抗体与抗原的亲和力用于表示抗体对于抗原的识别程度

$$
A(a) = 1/F(a)
$$

亲和力变小就意味着会受到惩罚

  1. 抗体与抗体之间的亲和力:反映了抗体间的相似程度

  2. 抗体浓度:群里中相似抗体所占的比例

这个是相对于 3而言的,比如我们规定S(a)>0.5就意味着相似

那么C(a)就等于1,否则等于0,其中0.5是一个阈值

  1. 期望繁殖概率:由抗体抗原间亲和力与抗体浓度两部分共同决定

只需要排序关系

精英保留策略

每次更新记忆库时候保留最优解

免疫操作

  1. 选择

按照轮盘赌选择机制进行选择,个体被选择的概率即为上述期望繁殖概率

在真正的运行时候,我们是在0-1的区间上,某个数字随机落在区间上的个体,并不是赌盘

  1. 交叉

类似于染色体交叉,互换一部分

  1. 变异

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from mpl_toolkits.mplot3d import Axes3D


G = 100 #迭代次数
fun = '5 * sin(x * y) + x ** 2 + y ** 2' #目标函数
choice = 'max'
dim = 2 #维度
limit_x = [-4,4] #x取值范围
limit_y = [-4,4] #y取值范围
pop_size = 10 #种群规模
mutate_rate = 0.7 #变异概率
delta = 0.2 #相似度阈值
beta = 1 #激励度系数
colone_num = 10 #克隆份数
if choice == 'max':
alpha = 2 #激励度系数,求最大值为正,最小值为负
else:
alpha = -2

def f(fun,x,y):
return eval(fun)

#初始化种群
def init_pop(dim,pop_size,*limit):
pop = np.random.rand(dim,pop_size)
for i in range(dim):
pop[i,:] *= (limit[i][1] - limit[i][0])
pop[i,:] += limit[i][0]

return pop

#计算浓度
def calc_density(pop,delta):
density = np.zeros([pop.shape[1],])
for i in range(pop.shape[1]):
density[i] = np.sum(len(np.ones([pop.shape[1],])[np.sqrt(np.sum((pop - pop[:,i].reshape([2,1])) ** 2,axis = 0)) < delta]))
return density / pop.shape[1]

#计算激励度
def calc_simulation(simulation,density):
return (alpha * simulation - beta * density)


#变异,随着代数增加变异范围逐渐减小
def mutate(x,gen,mutata_rate,dim,*limit):
for i in range(dim):
if np.random.rand() <= mutata_rate:
x[i] += (np.random.rand() - 0.5) * (limit[i][1] - limit[i][0]) / (gen + 1) #加上随机数产生变异
if (x[i] > limit[i][1]) or (x[i] < limit[i][0]): #边界检测
x[i] = np.random.rand() * (limit[i][1] - limit[i][0]) + limit[i][0]


pop = init_pop(dim,pop_size,limit_x,limit_y)
init_simulation = f(fun,pop[0,:],pop[1,:])
density = calc_density(pop,delta)
simulation = calc_simulation(init_simulation,density)
# print(pop)
# print(init_simulation)
# print(calc_density(pop,delta))
#进行激励度排序
index = np.argsort(-simulation)
pop = pop[:,index]
new_pop = pop.copy() #浅拷贝
simulation = simulation[index]


#免疫循环
for gen in range(G):
best_a = np.zeros([dim,int(pop_size / 2)]) #用于保留每次克隆后亲和度最高的个体
best_a_simulation = np.zeros([int(pop_size / 2),]) #保存激励度
#选出激励度前50%的个体进行免疫
for i in range(int(pop_size / 2)):
a = new_pop[:,i].reshape([2,1])
b = np.tile(a,(1,colone_num)) #克隆10份
for j in range(colone_num):
mutate(a,gen,mutate_rate,dim,limit_x,limit_y)
b[:,0] = pop[:,i] #保留克隆源个体
#保留亲和度最高的个体
b_simulation = f(fun,b[0,:],b[1,:])
index = np.argsort(-b_simulation)
best_a_simulation = b_simulation[index][0] #最佳个体亲和度
best_a[:,i] = b[:,index][:,0] #最佳个体
#计算免疫种群的激励度
a_density = calc_density(best_a,delta)
best_a_simulation = calc_simulation(best_a_simulation,a_density)
#种群刷新
new_a = init_pop(2,int(pop_size / 2),limit_x,limit_y)
#新生种群激励度
new_a_simulation = f(fun,new_a[0,:],new_a[1,:])
new_a_density = calc_density(new_a,delta)
new_a_simulation = calc_simulation(new_a_simulation,new_a_density)
#免疫种群与新生种群合并
pop = np.hstack([best_a,new_a])
simulation = np.hstack([best_a_simulation,new_a_simulation])
index = np.argsort(-simulation)
pop = pop[:,index]
simulation = simulation[index]
new_pop = pop.copy()


# 新建一个画布
figure = plt.figure(figsize = (10,8),dpi = 80)
# 新建一个3d绘图对象
ax = Axes3D(figure)
# 定义x,y 轴名称
plt.xlabel("x")
plt.ylabel("y")
for i in range(int(pop_size / 2)):
ax.scatter(pop[0,i],pop[1,i],f(fun,pop[0,i],pop[1,i]),color = 'red')
print('最优解:','x = ',pop[0,i],'y = ',pop[1,i],end = '\n')
print('结果:','z = ',f(fun,pop[0,i],pop[1,i]))
x = np.arange(limit_x[0],limit_x[1],(limit_x[1] - limit_x[0]) / 50)
y = np.arange(limit_y[0],limit_y[1],(limit_y[1] - limit_y[0]) / 50)
x,y = np.meshgrid(x,y)
z = f(fun,x,y)
ax.plot_surface(x,y,z, rstride=1, cstride=1, color = 'green',alpha = 0.5)
plt.show()

人工鱼群算法

  1. 觅食行为
  2. 聚群行为
  3. 追尾行为
  4. 随机行为

代码

1
2
3
4
5
6
7
8
9
10
11
12
def func(x):
x1, x2 = x
return 1 / x1 ** 2 + x1 ** 2 + 1 / x2 ** 2 + x2 ** 2


from sko.AFSA import AFSA

afsa = AFSA(func, n_dim=2, size_pop=50, max_iter=300,
max_try_num=100, step=0.5, visual=0.3,
q=0.98, delta=0.5)
best_x, best_y = afsa.run()
print(best_x, best_y)

帝国竞争算法

灰狼算法

多元宇宙算法

启发式算法的本质

尽量快尽量多的遍历,但是没办法同时满足

过度追求广度,那是枚举法

过度追求深度,容易陷入局部最优

我们需要在搜索的时候保持一个平衡!

书籍

matlab智能算法30个案例分析

智能优化算法及其matlab实例

上一篇:
这些建模的日子
下一篇:
六月总结与展望