宿营地问题贪心算法思想及证明

一、问题描述

有一个考察队到野外考察,在考察的路线上有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也是最少的露营天数,也就是最优解.

猜你喜欢

转载自blog.csdn.net/qq_52913088/article/details/125057701