第6名解决方案 (模拟退火方法)
第6名解决方案 (模拟退火方法)
作者: Shun_PI | 比赛排名: 第6名
首先,感谢主办方并祝贺获奖者。
我很高兴能在这次比赛中赢得我的第一枚单人金牌!
我的解决方案基于模拟退火(Simulated Annealing,简称SA),这是一种常用于优化问题的技术。它不是基于机器学习/深度学习/数据生成的方法。
预处理
对 H1 和 L1 分别执行以下过程,并将结果相加,生成一张 360*256 的图像。
计算振幅的平方
去除水平线噪声(仅针对真实噪声)
- 计算每一行的总和,创建一个包含 360 个元素的列表。然后对该列表进行差分。如果在短间隔内出现一系列大的正值和大的负值,则假设存在水平线噪声。然后将这些行的值替换为每一列的平均值。此操作重复进行,直到无法再操作为止。
- 这几乎消除了所有的真实噪声,并将分数提高了约 0.005。
- 下面是去除水平线噪声前后的一些示例图像。


去除垂直条纹噪声
- 对每一列减去均值,除以 std^2,并进行校正,使所有列的 std 总和为常数。
- 通过除以 std 的平方而不是 std,原本方差较大的列最终的方差会变小。其思想是减少原本方差较大的列的贡献,因为它们不可靠。这种方法略微提高了分数。
填补时间空隙
- 计算时间戳的差值记为 d,并重复插入全零列 round(d / 1800 - 1) 次。
在时间方向上取平均,并将列大小缩减至 256
使用 SA 进行波检测
我将解释我解决方案的核心部分:模拟退火(SA)。
首先,假设信号是完全正弦的,并遵循以下方程:
f(x) = Asin(vx+θ) + h
其中 A 是振幅,v 是频率,θ 是相位,h 是频率方向上的位置。
根据实验结果,各参数的搜索范围设定如下:
- A: [-100, 100]。
- v: 固定为 0.31(固定频率略微提高了分数)
- θ: 任意实数
- h: 任意实数
然后我们要搜索能产生最清晰波形的参数。
为此,我使用了 SA,过程如下:
- 随着温度的降低,重复以下操作数万次。
- 稍微改变上述参数,并计算沿波形的振幅平方和作为分数(如果引用超出图像范围则进行惩罚)。如果分数大于上一次的分数,则接受更改。即使分数小于上一次的分数,也根据分数差异和退火温度概率性地接受更改。否则拒绝更改。
- 此外,为了防止陷入局部最优,上述整个过程重复大约几百次,并使用第 k 百分位的值(k 选在 90~100 左右)作为最终分数。
- 在我的 CPU(Core i9-9900K)上计算所有测试数据的分数需要几个小时到一天的时间(取决于迭代次数)。
- 对此进行后处理并提交,只需几个小时的计算即可使 LB 分数超过 0.79。
以下是一些困难测试用例的检测波形示例图像。
同比赛其他方案