Loading docs/misc/hill-climbing.md +3 −2 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ 这种算法对于单峰函数显然可行。 > Q:你都知道是单峰函数了为什么不三分呢 > A:在多年的 OI 生活中,我意识到了,人类是有极限的,无论多么工于心计,绞尽脑汁,状态总是表示不出来的,出题人的想法总是猜不透的,边界总是写不对的——所以——我不三分了 JOJO! 认真地说,爬山算法的优势在于当正解的写法你并不了解(常见于毒瘤计算几何和毒瘤数学题),或者本身状态维度很多,无法容易地写分治(例 2 就可以用二分完成合法正解)时,可以通过非常暴力的计算得到最优解。 Loading @@ -35,8 +36,8 @@ 1. 初始化球心为各个给定点的重心(即其各维坐标均为所有给定点对应维度坐标的平均值),以减少枚举量。 2. 对于当前的球心,求出每个已知点到这个球心欧氏距离的平均值。 3. 遍历所有已知点。记录一个改变值 cans(分开每一维度记录)对于每一个点的欧氏距离,如果大于平均值,就把改变值加上差值,否则减去。实际上并不用判断这个大小问题,只要不考虑绝对值,直接用坐标计算即可。这个过程可以形象地转化成一个新的球心,在空间里推来推去,碰到太远的点就往点的方向拉一点,碰到太近的点就往点的反方向推一点。 4. 将我们记录的 cans 乘上温度,更新球心,回到步骤 2 3. 遍历所有已知点。记录一个改变值 $\textit{cans}$(分开每一维度记录)对于每一个点的欧氏距离,如果大于平均值,就把改变值加上差值,否则减去。实际上并不用判断这个大小问题,只要不考虑绝对值,直接用坐标计算即可。这个过程可以形象地转化成一个新的球心,在空间里推来推去,碰到太远的点就往点的方向拉一点,碰到太近的点就往点的反方向推一点。 4. 将我们记录的 $\textit{cans}$ 乘上温度,更新球心,回到步骤 2 5. 在温度小于某个给定阈值的时候结束。 因此,我们在更新球心的时候,不能直接加上改变值,而是要加上改变值与温度的乘积。 Loading Loading
docs/misc/hill-climbing.md +3 −2 Original line number Diff line number Diff line Loading @@ -9,6 +9,7 @@ 这种算法对于单峰函数显然可行。 > Q:你都知道是单峰函数了为什么不三分呢 > A:在多年的 OI 生活中,我意识到了,人类是有极限的,无论多么工于心计,绞尽脑汁,状态总是表示不出来的,出题人的想法总是猜不透的,边界总是写不对的——所以——我不三分了 JOJO! 认真地说,爬山算法的优势在于当正解的写法你并不了解(常见于毒瘤计算几何和毒瘤数学题),或者本身状态维度很多,无法容易地写分治(例 2 就可以用二分完成合法正解)时,可以通过非常暴力的计算得到最优解。 Loading @@ -35,8 +36,8 @@ 1. 初始化球心为各个给定点的重心(即其各维坐标均为所有给定点对应维度坐标的平均值),以减少枚举量。 2. 对于当前的球心,求出每个已知点到这个球心欧氏距离的平均值。 3. 遍历所有已知点。记录一个改变值 cans(分开每一维度记录)对于每一个点的欧氏距离,如果大于平均值,就把改变值加上差值,否则减去。实际上并不用判断这个大小问题,只要不考虑绝对值,直接用坐标计算即可。这个过程可以形象地转化成一个新的球心,在空间里推来推去,碰到太远的点就往点的方向拉一点,碰到太近的点就往点的反方向推一点。 4. 将我们记录的 cans 乘上温度,更新球心,回到步骤 2 3. 遍历所有已知点。记录一个改变值 $\textit{cans}$(分开每一维度记录)对于每一个点的欧氏距离,如果大于平均值,就把改变值加上差值,否则减去。实际上并不用判断这个大小问题,只要不考虑绝对值,直接用坐标计算即可。这个过程可以形象地转化成一个新的球心,在空间里推来推去,碰到太远的点就往点的方向拉一点,碰到太近的点就往点的反方向推一点。 4. 将我们记录的 $\textit{cans}$ 乘上温度,更新球心,回到步骤 2 5. 在温度小于某个给定阈值的时候结束。 因此,我们在更新球心的时候,不能直接加上改变值,而是要加上改变值与温度的乘积。 Loading