Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: 5.智能搜索技术,补充剩下两个复习 PPT #59

Merged
merged 1 commit into from
Dec 31, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
263 changes: 260 additions & 3 deletions 人工智能基础与应用/5.智能搜索技术.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,14 @@
<details>

<summary>智能搜索类型</summary>

- 基于搜索空间的类型
- 状态空间 (A 算法、A-star 算法)
- 与或树 (问题规约法)
- 博弈树 (极大/极小算法、$\alpha-\beta 剪枝$)
- 博弈树 (极大/极小算法、 $\alpha-\beta$ 剪枝)
- 基于随机算法的类型
- 演化机制 (遗传算法)
- 种群寻优 (蚁群算法、粒子群算法
)
- 种群寻优 (蚁群算法、粒子群算法)

</details>

Expand Down Expand Up @@ -501,3 +501,260 @@ $$
## 遗传算法

### 遗传算法的思路与特点

遗传算法的一般步骤:
1. 随机产生种群
2. 根据策略判断个体的适应度,是否符合优化准则,若符合,输出最佳个体及其最
优解,结束。否则,进行下一步
3. 依据适应度选择父母,适应度高的个体被选中的概率高,适应度低的个体被淘汰
4. 用父母的染色体按照一定的方法进行交叉,生成子代
5. 对子代染色体进行变异
6. 由交叉和变异产生新一代种群,返回步骤 2,直到最优解产生

### 遗传算法的基本操作

- 产生初始种群
- 计算适应度
- 选择,在 $[0,1]$ 之中产生随机数,将其用轮盘赌的方式选择,适应度高的个体选择的概率高
- 采用累积概率和选择概率的方式实现
- 没选到的个体进行淘汰
- 交叉
- 随机把其中几个位于同一位置的编码进行交换,产生新的个体
- 变异
- 将个体染色体编码串中的某些基因座上的基因值用该基因座上的其它等位基因来替换,从而形成新的个体
- 至下一代,适应度计算 $\rightarrow$ 选择 $\rightarrow$ 交叉 $\rightarrow$ 变异,直至满足终止条件

> [!NOTE]
> 适应度依据特定条件得出
>
> 选择概率=该个体的适应度值/总的适应度值
>
> 累计误差=上一个个体的累计概率 + 该个体的选择概率

## 遗传算法优化函数应用

简单的函数优化 (函数求最大值)

数学方法:求微分,导数为 0

### 编码

表现型:x

基因型:二进制编码 (串长取决于求解精度)

串长与精度之间的关系:区间分成的等份,由等份数向上取最小的二进制位串长

<details>

<summary>例题</summary>

若要求求解精度到 6 位小数, $10^6$ ,区间长度为 3

分成了 3000000 份,小于二的二十二次方,大于二的二十一次方

二进制位串长为 22

</details>

### 产生初始种群

产生的方式:随机

产生的结果:长度为 22 的二进制串

产生的数量:种群的大小 (规模)

### 计算适应度

不同的问题有不同的适应度计算方法

本例:直接用目标函数作为适应度函数
- 某个体转化为 $[-1,2]$ 区间的实数
- 计算 x 的函数值 (适应度)
- 二进制与十进制之间的转换
- 二进制串转化为 10 进制数
- 对应的区间 $[-1,2]$ 内的实数

### 遗传操作

选择:轮盘赌选择法

交叉:单点交叉

变异:小概率变异

### 模拟结果

- 设置的参数
- 种群大小 50;交叉概率 0.75;变异概率 0.05;最大代数 200
- 得到的最佳个体

## 遗传操作——选择

### 轮盘赌选择法 (roulette wheel selection)

首先将个体适应度值映射到轮盘中,个体的适应度值越大,其在轮盘中分配
到的角度就越大,因此被选中的概率就越大

### 随机遍历抽样法 (stochastic universal sampling)

如果需要选择 N 个个体,则只需一次生成 N 个等间距的标记指针位置,即可
选择出 N 个个体

- 截断选择法 (truncation selection)
- 个体按适应度排列,只有优秀个体能够成为父个体,参数为截断阈值(被选作父个体的百分比)

- 锦标赛选择法 (tournament selection)
- 随机从种群中挑选一定数目个体(竞赛规模),其中最好的个体作为父个体,此过程重复进行完成个体的选择

## 遗传操作——交叉/基因重组

- 实值重组
- 离散重组
- 子个体的每个变量可以按等概率随机地挑选父个体
- 中间重组
- 子个体=父个体 1+ $\alpha$ ×(父个体 2−父个体 1)
- $\alpha$ 是比例因子,由 $[-d,1+d]$ 上均匀分布地随机数产生
- $d=0$ 时为中间重组,一般取 $d=0.25$
- 子代的每个变量均产生一个 $\alpha$
- 首先生成每一个子代个体的 $\alpha$ ,再根据上面的公式进行子代的个体
- 线性重组
- 用一个个体用同一组 $\alpha$
- 首先生成每一个子代个体的 $\alpha$ ,再根据上面的公式进行子代的个体
- 二进制交叉
- 单点交叉
- 单点交叉也称简单交叉,它是先在两个父代个体的编码串中随机设定一个交叉点,然后对这两个父代个体交叉点前面或后面部分的基因进行交换,并生成子代中的两个新的个体
- 多点交叉
- 多点交叉是指先在两个父代个体的编码串中随机设定多个交叉点,然后再按这些交叉点进行部分基因交换,生成子代中的两个新的个体
- 均匀交叉
- 均匀 (一致) 交叉,随机产生 ${0,1}$ 位串,长度与个体的相等,称屏蔽模板
- 在其“1”的基因座上,将父代 1、2 的基因分别传到子个体 1、2
- 在其“0”的基因座上,将父代 1、2 的基因分别交叉传到子代 2、1

## 遗传操作——变异

一般采用:

$$
X' = X ± 0.5L\Delta
$$

其中
$$
\Delta = \sum_{i=0}^{m} \frac{a(i)}{2^i}
$$

$a(i)$ 以概率 $\frac{1}{m}$ 取值 1,以概率 $1 - \frac{1}{m}$ 取值 0,通常 m = 20; $L$ 为变量的取值范围

# 粒子群优化算法

## 基本粒子群优化算法

### 粒子速度和位置的更新

假设在 $D$ 维搜索空间中,有 $m$ 个粒子;

- 其中第 $i$ 个粒子的位置为矢量 $\vec{X_i} = (X_{i1}, X_{i2}, \dots, X_{iD})$
- 其飞翔速度也是一个矢量,记为 $\vec{V_i} = (V_{i1}, V_{i2}, \dots, V_{iD})$
- 第 $i$ 个粒子搜索到的最优位置为 $\vec{p_i} = (p_{i1}, p_{i2}, \dots, p_{iD})$
- 整个粒子群搜索到的最优位置为 $\vec{p_{gbest}} = (p_{gbest1}, p_{gbest2}, \dots, p_{gbestD})$

第 $i$ 个粒子的位置和速度更新为:

$$
V_{id}^{k+1} = wV_{id}^{k} + c_1 rand() (p_{id} - X_{id}^{k}) + c_2 rand() (p_{gbest} - X_{id}^{k})
$$

$$
X_{id}^{k+1} = X_{id}^{k} + V_{id}^{k+1}
$$

$$
i = 1, 2, \dots, m; \quad d = 1, 2, \dots, D
$$

其中,

$w$ 称为惯性权重, $c1$ 和 $c2$ 为两个正常数,称为加速因子
将 $v_{id}^k$ 限制在一个最大速度 $v_{max}$ 内

解释,

$wV_{id}^{k}$ ,“惯性部分”,对其自身运动状态的信任

$c_1 rand() (p_{id} - X_{id}^{k})$ ,“认知部分”,对微粒本身的思考,即来源于自己经验的部分

$c_2 rand() (p_{gbest} - X_{id}^{k})$ ,“社会部分”,微粒间的信息共享,来源于群体中的其它优秀微粒的经验

算法流程

开始
1. 用随机位置和速度向量初始化粒子
2. 循环直到所有粒子耗尽
3. 对每个粒子的位置 (xi) 评估适应度
4. 如果 fitness(xi) 比 fitness(p) 好,则 p = xi
5. 将 ps 中的最佳值设为 $gBest$
6. 更新粒子的速度和位置
循环直到最大迭代次数

停止:给出 $gBest$,即最优解

### 求解 TSP 问题

#### 符号的定义

若干个交换序可以合并成一个新的交换序,定义 $\oplus$ 为两个交换序的合并算子

设两个交换序 $SS1$ 和 $SS2$ 按先后顺序作用于解 $S$ 上,得到新解 $S’$ 。假设另外有一个交换序 $SS’$ 作用于同一解 $S$ 上,能够得到相同的解 $S’$ ,可定义

$$
SS' = SS1 \oplus SS2
$$

$SS'$ 和 $SS1 \oplus SS2$ 属于同一等价集,在交换序等价集中,拥有最少交换子的交换序称为该等价集的基本交换序

#### 解决 TSP 问题的速度算式定义

$$
\begin{cases}
V_{id}' = V_{id} \oplus \alpha (p_{id} - x_{id}) \oplus \beta (p_{gd} - x_{id}) \\
X_{id}' = X_{id} + V_{id}'
\end{cases}
$$

$\alpha, \beta$ 为 $[0,1]$ 上的随机数。$V_{id}$ 表示交换算符,$X_{id}$ 表示路径序列 (解)

#### 算法流程

1. 初始化粒子群,给每个粒子一个初始解 ( $x_{id}$ ) 和随机的交换序 ( $v_{id}$ )
2. 如果满足结束条件,转步骤 5
3. 根据粒子当前位置 $x_{id}$ 计算下一新解 $x_{id'}$
4. 如果整个群体找到一个更好的解,更新 $P_{gd}$ ,转步骤 2
5. 显示结果

- 根据粒子当前位置 $x_{id}$ 计算下一新解 $x'_{id}$
- 计算 $A = P_{id} - X_{id}$ , $A$ 是一个基本交换序,表示 $A$ 作用于 $X_{id}$ 得到 $P_{id}$
- 计算 $B = P_{gd} - X_{id}$ , $B$ 也是一个基本交换序
- 更新速度 $V'_{id} = V_{id} \oplus \alpha (P_{id} - X_{id}) \oplus \beta (P_{gd} - X_{id})$ 并将其转换成一个基本交换序
- 更新解 $X'_{id} = X_{id} + V'_{id}$
- 如果找到一个更优解,更新 $P_{id}$

#### 与遗传算法比较

- 共性
- 都属于仿生算法
- 都属于全局优化方法
- 都属于随机搜索算法
- 都隐含并行性
- 根据个体的适配信息进行搜索,因此不受函数约束条件的限制,如连续性、可导性等
- 对高维复杂问题,往往会遇到早熟收敛和收敛性能差的缺点,都无法保证收敛到最优点
- 差异
- PSO 有记忆,所有粒子都保存较优解的知识,而 GA,以前的知识随着种群的改变被改变
- PSO 中的粒子是一种单向共享信息机制。而 GA 中的染色体之间相互共享信息,使得整个种群都向最优区域移动
- GA 需要编码和遗传操作,而 PSO 没有交叉和变异操作,粒子只是通过内部速度进行更新,因此原理更简单、参数更少、实现更容易

> [!NOTE]
> 遗传算法 (Genetic Algorithm , GA)
>
> 粒子群优化算法 (Particle Swarm optimization,PSO)
Loading