算法设计与分析--近似算法作业及答案

  • 近似算法作业
    • 题目 1 k-center 近似算法
      • 题目描述
      • 参考答案
      • 解答
    • 题目 2 均衡负载算法
      • 题目描述
      • 参考答案
      • 解答
    • 题目 3 多项式归约
      • 题目描述
      • 参考答案
      • 解答

近似算法–徐小华

近似算法作业

题目 1 k-center 近似算法

题目描述

问题 1:假设给定 n n n 个指定的城市在一个平面图上,想要在不同的城市选择 k k k 个城市建立 k k k 个仓库,目标是最小化每个城市到最近仓库的最大距离。这意味着找到一组 k k k 个顶点的集合,任意点到其集合中顶点的最大距离最小。给定一个算法来确定这 k k k 个顶点的位置,该算法最多是最优解的 3 3 3 倍,并且运行时间是 O ( n ) O(n) O(n)

参考答案

在这里插入图片描述

解答

【贪心算法】反复选择 离任何现有中心最远的 site 作为下一个中心,其中,Center 必须在 site 中选择

在这里插入图片描述

k = 1 k=1 k=1 时,即 第一个中心 Center随机 从所有 site 中选择。

【时间复杂度】这个算法的运行时间是 O ( n k ) O(nk) O(nk)

  • 因为每次选择新的中心需要遍历所有的点,计算它们到已有中心的距离,然后找出最大的一个。
  • 这个过程需要重复 k k k 次,所以总的时间复杂度是 O ( n k ) O(nk) O(nk)

如果 k k k 是一个常数,那么这个算法的运行时间就是 O ( n ) O(n) O(n)

【3-近似 证明】

假设 r ( C ∗ ) < 1 2 r ( C ) r(C^*) < \frac{1}{2}r(C) r(C)21r(C)

对于 C C C 中的每个site c i c_i ci,考虑其周围半径为 1 2 r ( C ) \frac{1}{2}r(C) 21r(C) 的球,

(1) 如果一个球里面没有 C ∗ C^* C 中的中心 c ∗ c^* c,那么 c i c_i ci 就不在 C ∗ C^* C 中任何中心的 1 2 r ( C ) \frac{1}{2}r(C) 21r(C) 内,这与 r ( C ∗ ) < 1 2 r ( C ) r(C^*)<\frac{1}{2}r(C) r(C)21r(C) 的假设相矛盾,因此每个球 至少有一个 c ∗ c^* c

(2) 这些球是不相交的,每个球至少包含一个 c ∗ c^* c,并且 ∣ c ∣ = ∣ c ∗ ∣ |c|=|c^*| c=c,所以每个球 至多有一个 c ∗ c^* c

由 (1)、(2) 可知,每个球正好有一个 c i ∗ c_i^* ci

c i c_i ci 为与 c i ∗ c^*_i ci 配对的 site,考虑 C ∗ C^* C 中的任何 site s s s 及其最近的中心 c i ∗ c_i^* ci

s s s c i c_i ci 的距离可以用 三角不等式 分解为 s s s c i ∗ c_i^* ci 的距离加上 c i ∗ c_i^* ci c i c_i ci 的距离,而这两个距离都不会超过 r ( C ∗ ) r(C^*) r(C),因为 c i ∗ c_i^* ci s s s c i c_i ci 最近的中心,因此

d i s t ( s , C ) ≤ d i s t ( s , c i ) ≤ d i s t ( s , c i ∗ ) + d i s t ( c i ∗ , c i ) ≤ 2 r ( C ∗ ) dist(s, C) ≤ dist(s, c_i) ≤ dist(s, c_i^*) + dist(c_i^*, c_i) ≤ 2r(C^*) dist(s,C)dist(s,ci)dist(s,ci)+dist(ci,ci)2r(C)

r ( C ) ≤ 2 r ( C ∗ ) r(C) ≤ 2r(C^*) r(C)2r(C),这与假设矛盾,因此 r ( C ∗ ) ≥ 1 2 r ( C ) r(C^*) ≥ \frac{1}{2}r(C) r(C)21r(C),即 r ( C ) ≤ 2 r ( C ∗ ) r(C) ≤ 2r(C^*) r(C)2r(C),那么 r ( C ) ≤ 3 r ( C ∗ ) r(C) ≤ 3r(C^*) r(C)3r(C)

所以贪心算法是 Center selection problem 的 2-近似 算法,也是 3-近似 算法。

题目 2 均衡负载算法

题目描述

问题 2:假设有一个由 m m m 个慢速机器和 k k k 个快速机器。快速机器在单位时间内执行的工作量是慢速机器的两倍。现在你有一组 n n n 个作业,每个作业 i i i 需要时间 t i t_i ti 在慢速机器上处理,在快速机器上处理时间只需要 t i / 2 t_i/2 ti/2。你想将每个作业分配给一台机器,目标是最小化完成时间。给出一种 O ( n ) O(n) O(n) 时间的 3 3 3 倍近似算法。

参考答案

在这里插入图片描述

解答

【算法】

当每个作业到达时,将其放在当前最快结束的机器(需要考虑机器的速度)上。这是一个3-近似 算法。

【近似因子证明】

为了证明该算法的近似度,首先证明最优 makespan T ∗ T^* T 的一些下界。

  • T ∗ ≥ 1 2 t i . \displaystyle T^*\geq \frac{1}{2} t_i. T21ti.

证明:必定存在一台机器处理最耗时的作业。

  • T ∗ ≥ ∑ i t i m + 2 k . \displaystyle T^*\geq\frac{\sum_it_i}{m+2k}. Tm+2kiti.

证明:所有作业的总时间为 ∑ i t i \sum_i t_i iti。设
t = ∑ i t i m + 2 k t=\frac{\sum_i t_i}{m+2k} t=m+2kiti
假设作业可以分配给所有机器,使得每台慢速机器都有一组求和小于 t t t 的作业,而每台快速机器都有一群求和小于 2 t 2t 2t 的作业,那么就会得到
∑ i t i < m t + 2 k t = ∑ i t i \sum_it_i<mt+2kt=\sum_it_i iti<mt+2kt=iti
矛盾。因此,一些机器至少运行 t t t 时间的作业,因此
T ∗ ≥ ∑ i t i m + 2 k T^*\geq\frac{\sum_it_i}{m+2k} Tm+2kiti
考虑瓶颈机器 j j j 的负载 T [ j ] T[j] T[j],令 k k k 是机器 j j j 上的最后一个作业,安排作业 k k k 时,机器 j j j 的负载是最小的,如果该机器为快机器,则安排作业 k k k 前的负载为
T [ j ] − t k 2 ≤ ∑ i t i m + 2 k ≤ T ∗ T[j]-\frac{t_k}{2} \leq \frac{\sum_i t_i}{m+2k}\leq T^* T[j]2tkm+2kitiT
那么,
T = T [ j ] = ( T [ j ] − t k 2 ) + t k 2 ≤ T ∗ + T ∗ = 2 T ∗ . \begin{aligned} T=T[j]&=(T[j]-\frac{t_k}{2})+\frac{t_k}{2}\\ &\leq T^*+T^*\\ &=2T^*. \end{aligned} T=T[j]=(T[j]2tk)+2tkT+T=2T.
如果该机器为慢机器,则安排作业 k k k 前的负载为
T [ j ] − t k ≤ ∑ i t i m + 2 k ≤ T ∗ T[j]-t_k \leq \frac{\sum_i t_i}{m+2k}\leq T^* T[j]tkm+2kitiT
那么,
T = T [ j ] = ( T [ j ] − t k ) + t k ≤ T ∗ + 2 T ∗ = 3 T ∗ . \begin{align*} T=T[j]&=(T[j]-t_k)+t_k\\ &\leq T^*+2T^*\\ &=3T^*. \end{align*} T=T[j]=(T[j]tk)+tkT+2T=3T.

【时间复杂度说明】

算法的时间复杂度是 O ( n l o g n ) O(nlogn) O(nlogn),这是因为每次作业到达时,需要找到当前最快结束的机器,这需 O ( l o g n ) O(logn) O(logn) 的时间(如果使用优先队列或堆来存储机器)。因此,对于 n n n 个作业,总的时间复杂度是 O ( n l o g n ) O(nlogn) O(nlogn)

题目 3 多项式归约

题目描述

问题 3:证明以下命题。

命题 1: T S P TSP TSP 问题是 N P − h a r d NP-hard NPhard 问题

命题 2:最大加权独立集问题是 N P − h a r d NP-hard NPhard 问题

参考答案

在这里插入图片描述
在这里插入图片描述

解答

命题 1 证明:

  • TSP 问题是指给定一系列城市和每对城市之间的距离,求解经过每一座城市一次并回到起始城市的最短回路。
  • 哈密顿回路问题是指给定一个无向图,判断是否存在一条经过每个顶点一次并回到起点的回路。

要证明 TSP 问题是 NP−hard 问题,利用归约,将哈密顿回路问题转化为 TSP 问题,从而说明 TSP 问题的难度不低于哈密顿回路问题。

具体步骤如下:

  • 首先,给定一个哈密顿回路问题的实例,即一个无向图 G = ( V , E ) G=(V,E) G=(V,E),其中 V V V 是顶点集, E E E 是边集。

  • 然后,构造一个 TSP 问题的实例,即一个城市集合 C = V C=V C=V ,和一个距离矩阵 D D D,其中 D i j D_{ij} Dij 表示城市 i i i 和城市 j j j 之间的距离,定义如下:

    • 如果 ( i , j ) ∈ E (i,j)∈E (i,j)E,则 D i j = 1 D_{ij}=1 Dij=1
    • 如果 ( i , j ) ∉ E (i,j) \notin E (i,j)/E,则 D i j = n + 1 D_{ij}=n+1 Dij=n+1,其中 n = ∣ V ∣ n=∣V∣ n=∣V 是顶点的个数。
  • 最后,证明这个转化是有效的,即如果 G G G 有一个哈密顿回路,那么 C C C 有一个长度为 n n n 的最短回路;反之,如果 C C C 有一个长度为 n n n 的最短回路,那么 G G G 有一个哈密顿回路。

  • 充分性证明:如果 G G G 有一个哈密顿回路,那么可以沿着这个回路访问每个城市一次,并返回出发城市,这样的回路的长度为 n n n,因为每条边的距离都是 1;

  • 必要性证明:如果 C C C 有一个长度为 n n n 的最短回路,那么可以根据这个回路构造一个哈密顿回路,这样的回路一定存在,因为如果有任何一条边的距离大于 1,那么回路的长度就会超过 n n n

可证,由于哈密顿回路是 N P − h a r d NP-hard NPhard 问题,所以 T S P TSP TSP 问题是 N P − h a r d NP-hard NPhard 问题。

命题 2 证明:

为了证明最大加权独立集是 NP-hard,我们将其约化为最大独立集(已知是 NP-hard 的问题)。

假设我们有一个图 G = ( V , E ) G = (V, E) G=(V,E) 和一个整数 k k k,定义权重函数 w : V → R w: V \rightarrow \mathbb{R} w:VR 如下:
∀ v ∈ V : w ( v ) = 1 , \forall v \in V:w(v)=1, vV:w(v)=1,
约化的结果是
⟨ G ′ = ( V , E , w ) , k ⟩ . \langle G'=(V,E,w),k\rangle. G=(V,E,w),k.
如果图 G G G有一个大小至少为 k k k 的独立集 S S S,那么 S S S是图 G ′ G' G上的独立集,并且
∑ v ∈ S w ( v ) = ∑ v ∈ S 1 = ∣ S ∣ ≥ k . \sum_{v \in S} w(v) = \sum_{v \in S}1 = |S| \geq k. vSw(v)=vS1=Sk.
因此, G ′ G' G 有一个顶点权重之和至少为 k k k 的独立集。

相反地,如果图 G ′ G' G 有一个独立集 S ′ S' S,满足
∑ v ∈ S ′ w ( v ) ≥ k , \sum_{v \in S'}w(v) \geq k, vSw(v)k,
那么,可以看出 S ′ S' S 也是图 G G G 上的独立集,并且
∣ S ′ ∣ = ∑ v ∈ S ′ 1 = ∑ v ∈ S ′ w ( v ) ≥ k . |S'|=\sum_{v \in S'}1 = \sum_{v \in S'}w(v)\geq k. S=vS1=vSw(v)k.
因此,图 G G G 有一个大小至少为 k k k 的独立集。

这样,我们证明了如果我们能解决最大加权独立集问题,就能解决最大独立集问题;反之亦然。因此,最大加权独立集问题是 NP-hard 的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/862524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue 无图片或者图片报错时显示默认图片

一个需求&#xff1a;无图片或者图片报错时显示默认图片 <template><img :src"inImgAddr" class"park-img" error"$event.target.src urlImage" /> </template> <script> import urlImage from /assets/emptyCar.png;…

大模型ReAct:思考与工具协同完成复杂任务推理

ReAct: Synergizing Reasoning and Acting in Language Models Github&#xff1a;https://github.com/ysymyth/ReAct 一、动机 人类的认知通常具备一定的自我调节&#xff08;self-regulation&#xff09;和策略制定&#xff08;strategization&#xff09;的能力&#xff0…

vue3里对Echarts进行封装形成公共组件

在我们使用图表echarts组件时&#xff0c;其实需要对echarts进行封装&#xff0c;形成一个全局公共组件&#xff0c;如果不选择封装成组件&#xff0c;那么按照echarts官方文档来写则每次需要获取实例&#xff0c;然后echarts.init(ref)去初始化图表&#xff0c;这样其实会很麻…

vue 代理

一、常用的发送一个ajax请求&#xff1a; 1、xhr new XMLHttpRequest(),真正开发中不常用 2、jq&#xff0c;jq主要功能是获取dom&#xff0c;周边才是请求接口 3、axios&#xff08;大名鼎鼎的&#xff09; axios.get("url").then(response>{},error>{} )4、…

Python应用开发——30天学习Streamlit Python包进行APP的构建(11)

st.bokeh_chart 显示互动式虚化图。 Bokeh 是 Python 的一个图表库。此函数的参数与 Bokeh 的 show 函数的参数非常接近。有关 Bokeh 的更多信息,请访问 https://bokeh.pydata.org。 要在 Streamlit 中显示 Bokeh 图表,请在调用 Bokeh 的 show 时调用 st.bokeh_chart。 Fu…

jsonata工具查询JSON和转换

jsonata工具查询JSON和转换 参考网址&#xff1a;http://docs.jsonata.org/1.7.0/date-time https://github.com/IBM/JSONata4Java 简介 JSONata是IBM的OPen Source项目&#xff0c;正是这样做的。它是一种用于查询和转换 JSON 数据结构的表达式语言。JSONata 是一种用于查询…

Android 系统设置中的休眠和屏保

简介 由于客户在Android 系统设置中发现Timeout设置项没有效果&#xff0c;因此我对此研究了一下。Timeout是定时屏幕亮度降低&#xff0c;而Dream则是进入屏幕保护。如果是机顶盒等设备的开发者发现这个设置项没用&#xff0c;别见外&#xff0c;因为这里的亮度调整对TV是没用…

二叉树的方法

目录 一、二叉树的定义 ​编辑 二、二叉树的创建 三、二叉树的遍历 1、前序遍历 2、中序遍历 3、后序遍历 4、层序遍历 四、二叉树遍历方法的使用 五、二叉树的操作 1、节点的个数 2、叶子节点的个数 3、第k层节点的个数 4、二叉树的高度 5、检查值为value的元素…

java生成excel,uniapp微信小程序接收excel并打开

java引包&#xff0c;引的是apache.poi <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>5.2.3</version></dependency> 写一个测试类&#xff0c;把excel输出到指定路径 public s…

一条SQL查询语句的执行流程

MySQL 中一条 SQL 查询语句的执行流程可以分为以下几个主要步骤&#xff1a; 客户端请求&#xff1a; 客户端通过 MySQL 客户端或应用程序向 MySQL 服务器发送 SQL 查询请求。 连接管理&#xff1a; MySQL 服务器接收到请求后&#xff0c;会首先检查客户端的身份验证信息&…

c++笔记容器详细介绍

C标准库提供了多种容器来存储和管理数据。这些容器属于<vector>, <list>, <deque>, <map>, <set>, <unordered_map>, <unordered_set>等头文件中。这些容器各有优缺点&#xff0c;适用于不同的场景。下面详细介绍几种主要的容器及其…

快20倍还便宜 NVIDIA GPU的“掘墓人”出现了?

芯片初创公司Etched近日宣布推出了一款针对 Transformer架构专用的AISC芯片 “Sohu”&#xff0c;并声称其在AI大语言模型&#xff08;LLM&#xff09;推理性能方面击败了NVIDIA最新的B200 GPU&#xff0c;AI性能达到了H100的20倍。这也意味着Sohu芯片将可以大幅降低现有AI数据…

【面试系列】C++ 高频面试题

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&#xff1a;详细讲解AIGC的概念、核心技术、…

精密机器中的交叉导轨负荷与容许负荷的差异!

交叉导轨的设计和制造过程中&#xff0c;负荷及容许负荷是至关重要的参数&#xff0c;只有准确计算出交叉导轨的载荷&#xff0c;才能保证交叉导轨的稳定性和使用寿命。 负荷和容许载荷是两个不同的参数&#xff0c;那这两者的有什么差异呢&#xff1f; 交叉导轨的负荷是指其承…

微信群被恶意举报封了加新群的看这里

由于近期太忙&#xff0c;有时候手机被儿子拿玩看动漫了&#xff0c;被误删或是误踢的朋友说声抱歉。 感谢大家的理解和支持。

JVM专题九:JVM分代知识点梳理

今天开始&#xff0c;咱们开始剖析JVM内存划分的原理细节&#xff0c;以及我们创建的那些对象在JVM中到底是如何分配&#xff0c;如何流动的&#xff0c;首先解决第一个问题&#xff1a;JVM内存的一个分代模型:年轻代、老年代、永久通过之前的专题我们知道&#xff0c;那就是我…

HarmonyOS Next开发学习手册——通过startAbilityByType拉起垂类应用

使用场景 开发者可通过特定的业务类型如导航、金融等&#xff0c;调用startAbilityByType接口拉起对应的垂域面板&#xff0c;该面板将展示目标方接入的垂域应用&#xff0c;由用户选择打开指定应用以实现相应的垂类意图。垂域面板为调用方提供统一的安全、可信的目标方应用&a…

REST API 中的 HTTP 请求参数

当我们在谈论现代 Web 开发时&#xff0c;REST API (Representational State Transfer Application Programming Interface) 扮演着至关重要的角色。它允许不同的系统以一种简洁且高效的方式进行通信。HTTP 请求参数是控制此通信流程中数据如何被发送和接收的重要组成部分。 H…

vue2使用wangEditor5搭建模拟文档的编辑器快速集成

如图 1、下载依赖 2、elm引入&#xff08;可省略&#xff09; main.js 或者 按需引入 3、cv <template><div style"background: #f1f3f4"><div style"width: 100%; height: 42px"><!-- 工具栏 --><Toolbarid"tool-conta…

Linux crontab中* * * * * /usr/local/run.sh这句话5个*号分别代表什么?

在 Linux crontab 中&#xff0c;* * * * * /usr/local/run.sh 这句话里的 5 个*号分别代表的含义如下&#xff1a; 第一个&#xff1a;表示分钟&#xff0c;取值范围是 0 到 59。这里的表示每分钟。 第二个&#xff1a;表示小时&#xff0c;取值范围是 0 到 23。表示每小时。…