一、问题描述
有一个考察队到野外考察,在考察的路线上有n个地点可以作为宿营地.已知宿营地到出发点的距离依次为x1,x2......xn,且满足x1<x2<......<xn.每天他们只能前进30KM,在每个宿营地只住一天.他们希望找到一个行动计划,使得总的宿营天数最少.请设计一个算法求解这个问题,并且证明他的正确性.
二、算法解析
为了尽量地减少宿营的天数,先尽可能的选择较远的宿营地去考察,但是由于考察队每天的行程均有限制,因此必须选择在30km范围内尽可能远的宿营地进行考察和住宿.
伪码如下:
while (y < end) {
if (camparea[i] - start <= 30) {
if (s < camparea[i] - start) {
s = camparea[i] - start;
}
i++;
}
else {
k = k + 1;
T[i - 1] = 1;
y = camparea[i];
start = camparea[i - 1];
}
三、实验的正确性证明
在本实验当中使用了一个较为简单的方法证明,整体证明思路经过我的推敲应该没有大的问题,但证明方法待仔细研究。
本算法正确性证明:
命题:对任何的K,在贪心算法中都能找到K个选择的宿营地使得他们考察的天数最少.
证明: 用归纳法
当K=1时,此时从起点到终点选择离起点最远宿营地,此时选择最远的露营点一定是最优解,此时露营天数最小为1;
假设在k时成立,那么对于算法来说,在前k步骤的贪心算法选取中,每次选取的结果均得出最少的露营天数Tk,现证明当K+1时贪心算法得出的Tk+1也是最少的露营天数,也就是最优解.
使用反证法:
假设:第k+1步骤选取时,得出的结果Tk+1不是最优解.
根据假设可以得出存在一个比Tk+1更小的T’k+1
即
Tk+1=Tk+Txk+1 > T’k+1=T’k+Tx’k+1 (1)
而
Txk+1=T’xk+1=1 (2)
因此可以得出
Tk > T’k (3)
但根据归纳法条件,在前k步骤的贪心算法选取中,每次选取的结果均得出最少的露营天数Tk,即
TK+1=Tk +1 <= T’k+1=T’k+1 (4)
这与假设推断出的结果矛盾,因此假设不成立,因此证得原命题成立,因此可以证得当K+1时贪心算法得出的Tk+1也是最少的露营天数,也就是最优解.