POJ 2420解题报告

好吧。这道题最大的收获是发现模拟退火算法好简单啊。还是很容易写出来的。这道题我看大牛们用的是牛顿近似解或者模拟退火算法。

可以移步这里:http://blog.sina.com.cn/s/blog_64675f540100sehz.html

提交到POJ后WA,于是自己的程序改得越来越像上面链接中的程序了。于是不贴代码了。收获是最终发现错误还是出在逻辑上面,自己有个变量没注意,导致虽然能过样例点,但是过不了测试点。所以下次在出现这种情况还是要检查程序,不要太关注那些很诡异的地方。比如输出时printf("%lf\n", f)中有没有l等。

这道题用一个candidates[Nr]的数组不断逼近最优解。

生成过程如下:

首先,求出所有的点的坐标的最大范围,记为T,在这个范围内生成Nr个随机点。我看到有直接用输入点作为起始点的,在这个测试数据下也可以通过。

然后,对这Nr个随机点,每次再随机产生Nr(或别的数目)个随机点,如果生成的随机点的更逼近最优点(即距离和最小),则用新的随机点代替之前的。每次生成随机点的范围为该点T*belta以内(belta在0~1之间)。也就是说范围T每次缩小为原来的0.8(或别的数值)。

循环结束的条件是T小于最小的粒度,比如0.1或是随机点有特别接近最优点的。

大致思路如此,写起来其实也很简单,不要有畏难情绪就好。wikipedia上有模拟退火算法的挺清楚的描述:http://en.wikipedia.org/wiki/Simulated_annealing

最后感慨一句。早这样写POJ程序估计我早成大牛或是资深码农了。唉。


你可能感兴趣的:(POJ 2420解题报告)