我们先来看题目描述:
服务中心的最佳位置
一家快递公司希望在新城市建立新的服务中心。公司统计了该城市所有客户在二维地图上的坐标,并希望能够以此为依据为新的服务中心选址:使服务中心 到所有客户的欧几里得距离的总和最小。
示例 1:
这道题是运筹学里面中心选址问题的简化版本。
注意读题可以发现,题目中输入的“客户”坐标是整数,但要求输出的服务中心坐标可以是小数,并且说与真实值误差在 10e-5 之内的答案将被视作正确答案。为什么要特别添加这个说明呢?因为这是一道竞赛题,要求参赛者在一个半小时内给出答案,所以该说明是为了降低问题的难度。
因为解的类型是小数,所以解空间的边界是连续的,可以进一步猜测该问题是凸优化问题,我们可以尝试使用爬山算法来寻找最优解。
爬山算法的思想非常简单:首先在地图上面找一个位置作为初始解,有了初始解以后,按照一定的方向迭代搜索更优的解。 在选取初始解时,可以考虑所有客户坐标的几何中心,也可以随机选择一个点作为初始位置。在迭代时,算法只搜索当前解附近的位置,如果发现附近有一个更好的解,那么就将当前位置更新过去。算法的伪代码如下:
# 爬山算法伪代码 cur_sol = init() while not stop: for new_sol in neighbor(cur_sol): if obj(new_sol) < best_obj: cur_sol = new_sol break return best_obj这里面的 neighbor() 函数用来产生当前解附近的解,因为解空间是连续的,所以当前解附近必定有离最优解更近的解,我们只需要找到个这个解并继续做迭代即可。那么迭代的停止条件是什么呢?假如地图中只存在一个最优解,那么迭代的结果必然是让当前解无限的接近最优解,所以只需要设置一个阈值,并判断当前迭代步长是否小于该阈值即可(这里可以选择一个比题目中要求的误差更小的值作为阈值)。