假设我们在一条长街的一边有一套房子供电 可以将房屋连接到距离d的配电箱。我们需要使用 最小盒子数。展示如何定位配电箱。
答案 0 :(得分:0)
为了证明贪婪算法的正确性,我们必须证明它产生了有效的答案,具有贪婪选择属性,并且问题具有最优的子结构。贪婪选择属性指出,算法做出的第一个决策始终可以是最佳解决方案中的选择。最优子结构意味着给定问题的最优解包含每个子问题的最优解。
对于这个答案,我将假设您只能将配电箱放在房屋上,而不能放在它们之间。我还要假设每个房屋最多距离与其相邻的房屋。
让current_distance为距上一个方框的距离(或距算法开始时的街道上第一栋房屋的距离)
有些房子没有电 虽然(current_distance <= d) 如果我们能在离上一个盒子不远的地方搬到下一所房子 (即current_distance + distance_to_next_house <= d),然后移至下一个 屋 否则在当前房子放一个盒子
本质上,此算法的作用是从上一个框尽可能远地移开,然后放置一个新框。然后,它从最后一个盒子尽可能远地重复,直到所有房屋都在配电箱的d之内。
首先让我们确保我们的解决方案有效,并为每所房屋供电。假定这是无效的,并且至少有一个房屋hi,其距离位于hk的配电箱x远,其中x> d。 因为hi和hk之间的距离大于d,所以我们知道它们之间必须至少有一个房屋hj,使得hi和hj之间的距离<= d。因为我们的算法只会将一个盒子放在距离前一个盒子<= d的房屋上,所以我们知道这是不可能的,并且我们的算法将始终产生有效的解决方案。
接下来,让我们证明贪婪的选择属性。假设O是放置盒子的房屋的最佳解决方案集,以使size(O)最小。假设O中的第一个方框o1与我们的算法选择的房子不在h1。我们知道h1比o1在街上更远,因为我们的算法总是选择最远的房子来放置盒子。我们也知道从o1到o2的距离小于或等于d,我们称这个距离为d0。因为h1比o1更靠近街道,所以我们知道h1和o2之间的距离(称为dh)小于du。这意味着dh 最后,我们证明此问题具有最佳子结构。我们可以通过证明,对于任何放置的盒子,我们的算法将与任何最佳解决方案一起位于街道下方或位于同一位置。证明了这一点之后,我们必须证明算法解决方案的大小与最佳解决方案的大小相同。令最优解称为O(其中为一个盒子选择的每栋房屋为01,o2,...,on),而由我们的算法创建的解为H(其中每所房子为h1,h2,...。 ,hn)。 我们知道我们的第一选择总是可以作为最优解决方案的一部分,因此h1必须始终比o1远,或者与o1处于同一屋子。
假设hk比ok更远,或与ok位于同一屋子。
现在,让我们证明hk + 1必须与ok + 1距离更远或在同一地点。
假设这是不正确的,并且ok + 1比hk + 1还要远。令dx代表ok和ok + 1之间的距离,dy代表hk和hk + 1之间的距离,dz代表hk + 1和ok + 1之间的距离。我们知道dx <= d。我们还知道dy + dz <= dx,因此dy + dz <= d,因此我们的算法不会在hk + 1处停止,并且至少会持续到ok + 1。因此,hk + 1必须与ok + 1在同一点,或者比ok + 1更远。 我们知道size(H)不能小于size(O),因为O是最佳解决方案。为了证明size(O)= size(H),首先假定size(O) 在这里,我们证明了我们的算法产生有效的答案,具有贪婪的选择属性,并且具有最佳的子结构。因此,我们针对此问题提出了正确的算法。