优化算法
2010-11-20
POJ 2714
最近又在 POJ 上做题,碰上2714,题意是:
输入 N,和 N 个点 (x,y),从原点开始一共可以走 N 步,每一步可以随机选择移动 (x,y),或者 (-x,-y)。N 的范围为 1-100。
输出最远能走到离开原点多远的地方,输出其距离。
分析一下,用迭代肯定可以,不过 2^N 的复杂度肯定太高了。每步有两种选择,其本质是求一个长度为 N 的 0、1 序列使得最后的值最大,为一个优化问 题。这里贪心不能求到最优解,稍微证明一下就能得出。如果不贪心,或者把贪心的范围扩大一点,求出每一步完后的凸包呢,然后再在这步的基础上继续扩展下一 些节点,再求凸包,继续如此,最后求得凸包中距离最远的。求凸包的复杂度位 O(nlgn),即最后的复杂度为 O(N^2lgN),是可以接受的。
随机搜索
以前看过《集体智慧编程》这本书,这里有一章是说的优化。稍微回顾一下其中的几个算法。对于优化问题,首先得找到一个评价函数,对于其某个方案评价函数能给出某个值评估方案的优劣。至于返回值越大还是越好没有规定,对于特定的问题选择特定的评价函数。随机搜索不是一种好的优化算法,但是却是后面的算法的根源。其基本思想是,我们随机长生一些解,看是否好,如果比当前更好,替换当前最优解,直到收敛了,或者猜测了足够的次数了。
do{
solution=rand_solution;
value=eval(solution);
if(value>best)
best=value;
times++;
//测试是否收敛
}while(times<max_iter&&(!limit_flag));
这种盲目的猜测虽然有机会在某一次猜中最优解,但是效率肯定不怎么好。随机算法还是有一些问题可以适用,比如素数判定,如果能保证错误率很低很低也是可行的算法。