贪心算法交换证明算法设计,第 4、6E 章

如何解决贪心算法交换证明算法设计,第 4、6E 章

正在阅读本书,遇到了这个问题:

6. Your friend is working as a camp counselor,and he is in charge of 
organizing activities for a set of junior-high-school-age campers. One of 
his plans is the following mini-triathalon exercise: each contestant must 
swim 20 laps of a pool,then bike 10 miles,then run 3 miles. The plan is 
to send the contestants out in a staggered fashion,via the following rule: 
the contestants must use the pool one at a time. In other words,first one 
contestant swims the 20 laps,gets out,and starts biking. As soon as this 
first person is out of the pool,a second contestant begins swimming the 
20 laps; as soon as he or she is out and starts biking,a third contestant 
begins swimming . . . and so on.) 

Each contestant has a projected swimming time (the expected time it 
will take him or her to complete the 20 laps),a projected biking time (the 
expected time it will take him or her to complete the 10 miles of bicycling),and a projected running time (the time it will take him or her to complete 
the 3 miles of running). Your friend wants to decide on a schedule for the 
triathalon: an order in which to sequence the starts of the contestants. 
Let’s say that the completion time of a schedule is the earliest time at 
which all contestants will be finished with all three legs of the triathalon,assuming they each spend exactly their projected swimming,biking,and 
running times on the three parts. (Again,note that participants can bike 
and run simultaneously,but at most one person can be in the pool at 
any time.) What’s the best order for sending people out,if one wants the 
whole competition to be over as early as possible? More precisely,give 
an efficient algorithm that produces a schedule whose completion time 
is as small as possible. 

只要摆弄数字就很明显了,答案是一种贪心算法,按骑车时间+运行时间的降序排序。

让我苦恼的是,我的老师提到这是使用交换论证/证明的良好做法,但我不知道如何使用它(或其他任何东西)来证明这个答案是正确的。

这个问题在网上的其他地方得到了回答(我在几个地方看到了这个变体),但据我所知答案是错误的

注意:bi/ri代表选手i的自行车/骑行时间

我们通过交换论证来证明这一点。考虑任何最优解,并假设它不使用这个 命令。那么最优解必须包含两个参赛者i和j,这样j就直接送出去了 在 i 之后,但是 bi + rij + rj 。我们将这样的一对 (i,j) 称为反演。考虑通过交换 i 和 j 的阶而获得的解。在这个交换的时间表中,j 比他/她以前完成得更早。此外,在交换的时间表中,当 j 之前离开池时,i 离开池;但是由于 bi + rij + rj , i 在交换的时间表中完成得比j 在之前的日程中完成。

我的问题是粗体,没有理由假设 i 和 j 的游泳时间相同,因此当 j 离开便便时我不会离开游泳池;

我错了,这个答案在某种程度上是正确的吗?如果是为什么?如果不是,正确的证明/论证会是什么样的?

解决方法

我同意你的看法,这个答案超出了你用粗体提到的内容。我只能在 https://www.coursehero.com/file/9692310/HW4S12sol1/ 上找到这篇文章及其镜像。幸运的是,我们不需要这个假设来证明贪心算法对于交换参数是最优的。

为了证明这一点,我们将计算每个参赛者在每种情况下花费的时间,并表明交换只会减少 ij的最后一个时间> 完成。

我们可以假设 WLOG 的第一个 ij 从时间 0 开始。

在具有反转的最佳时间表中(我先行):

参赛者 时间结束
toi = si + bi + ri
j toj = si + sj + bj + rj子>

由于 bi + rij + rj,显然 toi oj 这意味着 j 在这种情况下最后完成。

在交换的时间表中(j 先行):

参赛者 时间结束
tsi = si + sj + bi + ri子>
j tsj = sj + bj + rj

我们不知道两个完成中的哪一个最后,但我们可以证明 tsioj 和 tsjoj 这意味着无论哪种方式,最后一位参赛者完成的时间都减少了。

因此,交换这个反演只会提高 ij 的最后一个参赛者的完成时间,并且继续将最优解交换到贪婪解不会导致次优解。因此贪心解是最优的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res