From 9e262baf2c6cd552b7249136ea9d43504c3e24f9 Mon Sep 17 00:00:00 2001 From: Trisolaris HD <36555123+TrisolarisHD@users.noreply.github.com> Date: Sat, 27 Jul 2019 18:59:14 +0800 Subject: [PATCH] Update hill-climbing.md --- docs/misc/hill-climbing.md | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/docs/misc/hill-climbing.md b/docs/misc/hill-climbing.md index c4569962..d6541291 100644 --- a/docs/misc/hill-climbing.md +++ b/docs/misc/hill-climbing.md @@ -13,7 +13,7 @@ 认真地说,爬山算法的优势在于当正解的写法你并不了解(常见于毒瘤计算几何和毒瘤数学题),或者本身状态维度很多,无法容易地写分治(例 2 就可以用二分完成合法正解)时,可以通过非常暴力的计算得到最优解。 -但是对于多数需要求解的函数中,爬山算法很容易进入一个局部最优解,如下图(最优解为 $\color{green}{\Uparrow}$ ,而爬山算法可能找到的最优解为 $\color{red}{\Downarrow}$ )。 +但是对于多数需要求解的函数,爬山算法很容易进入一个局部最优解,如下图(最优解为 $\color{green}{\Uparrow}$ ,而爬山算法可能找到的最优解为 $\color{red}{\Downarrow}$ )。 ![](./images/hill-climbing.png) @@ -21,25 +21,23 @@ ## 具体实现 -爬山算法一般会引入类似模拟退火的温度解决。类比地说,爬山算法就是一只兔子喝醉了在山上跳,它每次都会朝着它以为更高的地方(这往往只是个不准确的趋势)跳,显然它有可能一把跳到山顶,也可能跳过头翻到对面去了,不过没有关系,兔子翻过去之后还会跳回来。显然这个过程很没有用,兔子永远都找不到出路,所以在这个过程中兔子冷静下来并每次跳的时候更加谨慎,少跳一点,以到达合适的最优点。 +爬山算法一般会引入温度参数(类似模拟退火)。类比地说,爬山算法就像是一只兔子喝醉了在山上跳,它每次都会朝着它所认为的更高的地方(这往往只是个不准确的趋势)跳,显然它有可能一次跳到山顶,也可能跳过头翻到对面去。不过没关系,兔子翻过去之后还会跳回来。显然这个过程很没有用,兔子永远都找不到出路,所以在这个过程中兔子冷静下来并在每次跳的时候更加谨慎,少跳一点,以到达合适的最优点。 -兔子清醒的过程就是降温过程,在爬山的时候会不断减小之。 +兔子逐渐变得清醒的过程就是降温过程,即温度参数在爬山的时候会不断减小。 关于降温:降温参数是略小于 $1$ 的常数,一般在 $[0.985, 0.999]$ 中选取。 -### 例 1 球形空间产生器 +### 例 1 [「JSOI2008」球形空间产生器](https://www.luogu.org/problem/P4035) -这里以一道(其实正解是高斯消元)适合爬山的好题[「JSOI2008」球形空间产生器](https://www.luogu.org/problem/P4035)为例。 - -题意:给出 $n$ 维空间中的 $n$ 个点,已知他们在同一个 $n$ 维球面上,求出球心。 $n \leq 10$ ,坐标绝对值不超过 $10000$ 。 +题意:给出 $n$ 维空间中的 $n$ 个点,已知它们在同一个 $n$ 维球面上,求出球心。 $n \leq 10$ ,坐标绝对值不超过 $10000$ 。 很明显的单峰函数,可以使用爬山解决。本题算法流程: -1. 初始化球心为各个维度平均值,减少枚举量 +1. 初始化球心为各个给定点的重心(即其各维坐标均为所有给定点对应维度坐标的平均值),以减少枚举量。 2. 对于当前的球心,求出每个已知点到这个球心欧氏距离的平均值。 3. 遍历所有已知点。记录一个改变值 cans(分开每一维度记录)对于每一个点的欧氏距离,如果大于平均值,就把改变值加上差值,否则减去。实际上并不用判断这个大小问题,只要不考虑绝对值,直接用坐标计算即可。这个过程可以形象地转化成一个新的球心,在空间里推来推去,碰到太远的点就往点的方向拉一点,碰到太近的点就往点的反方向推一点。 4. 将我们记录的 cans 乘上温度,更新球心,回到步骤 2 -5. 在温度非常小的时候结束。 +5. 在温度小于某个给定阈值的时候结束。 因此,我们在更新球心的时候,不能直接加上改变值,而是要加上改变值与温度的乘积。 @@ -92,9 +90,9 @@ * * * -### 例 2 吊打 XXX +### 例 2 [「BZOJ 3680」吊打 XXX](https://www.lydsy.com/JudgeOnline/problem.php?id=3680) -此处代码以[「BZOJ 3680」吊打 XXX](https://www.lydsy.com/JudgeOnline/problem.php?id=3680)(求 $n$ 个点的带权类费马点)为例。 +题意:求 $n$ 个点的带权类费马点。 框架类似,用了点物理知识。 -- 2.11.0