算法分析与设计——近似算法
一、近似算法的概念
1、为啥要研究近似算法?
\quad目前大规模的NPC问题我们无法通过计算得到,因此我们需要通过损失一部分精度的做法来找到多项式的近似算法。
2、近似算法精度的评价
\quad用近似算法得到的解与原问题的最优解比值不超过ρρρ,则称该算法是ρ−近似算法ρ-近似算法ρ−近似算法。难点在于在不知道最优解的情况下证明近似解与最优解的近似程度。
二、几个经典的近似问题
1、负载均衡问题
\quad负载均衡问题:给出mmm个机器,nnn个任务,设任务jjj处理时长为tjt_jtj。要求如下:
- 每个任务只能在一个机器上不间断的完成
- 每个机器不能同时处理多个任务
\quad设S[i]S[i]S[i]表示给机器iii处理的任务集合,则机器iii的处理时长为L[i]=∑j∈S[i]tjL[i]=\sum_{j\in S[i]}t_jL[i]=∑j∈S[i]tj。负载均衡问题的目标就是 找到一种任务分配方案使得min(max(L[i]))min(max(L[i]))min(max(L[i])),即让每个机器处理的任务的时长尽可能均衡。
\quad这个问题是NPC问题,因为Partiton问题≤P负载均衡问题Partiton问题 \le_P 负载均衡问题Partiton问题≤P负载均衡问题。
近似策略1
\quad贪心策略:每次在机器中选出当前处理时长最短的机器处理下一个任务。时间复杂度为O(nlogm)O(nlogm)O(nlogm),对于每个任务都需要从mmm个机器中选出处理时长最短的机器,这个用优先队列维护即可。这个近似算法是2-近似的,证明如下:
- 引理1:设最优解为L∗L^*L∗,则L∗≥maxjtjL^*\geq max_jt_jL∗≥maxjtj,因为至少一个机器要处理一个任务,所有任务中花费时间最长的任务所需时间为maxjtjmax_jt_jmaxjtj,故得到此不等式。
- 引理2:L∗≥1m∑jtjL^* \geq \frac{1}{m}\sum_jt_jL∗≥m1∑jtj。当每个机器处理任务的时长相同时L∗=1m∑jtjL^* = \frac{1}{m}\sum_jt_jL∗=m1∑jtj,显然其他情况下L∗>1m∑jtjL^* > \frac{1}{m}\sum_jt_jL∗>m1∑jtj。
- 假设最后一个任务jjj给了机器iii,说明在此之前,机器iii的负载时长最小,即L[i]−tj≤L[k](对任意k满足1≤k≤m)L[i]-t_j\le L[k](对任意k满足1 \le k \le m)L[i]−tj≤L[k](对任意k满足1≤k≤m)。
- 因为对任意一个机器kkk都满足L[i]−tj≤L[k]L[i]-t_j\le L[k]L[i]−tj≤L[k],因此m(L[i]−tj)≤∑kL[k]m(L[i]-t_j)\le \sum_kL[k]m(L[i]−tj)≤∑kL[k],即L[i]−tj≤1m∑kL[k]=1m∑jtj≤L∗(引理2)L[i]-t_j\le \frac{1}{m}\sum_kL[k]=\frac{1}{m}\sum_j t_j \le L^*(引理2)L[i]−tj≤m1∑kL[k]=m1∑jtj≤L∗(引理2)
- 到这里,该近似算法求解的结果L=L[i]=(L[i]−tj)+tj≤L∗+L∗=2L∗L=L[i]=(L[i]-t_j)+t_j \le L^*+L^*=2L^*L=L[i]=(L[i]−tj)+tj≤L∗+L∗=2L∗,即L≤2L∗L\le 2L^*L≤2L∗,该贪心策略是该问题的2-近似算法。
\quad该近似算法能达到最优解的2倍吗,即上述不等式是紧的吗?是紧的!
近似策略2
\quad策略2:将任务按照处理时长tjt_jtj从大到小排序,之后再每次在机器中选出当前处理时长最短的机器处理下一个任务。时间复杂度为O(nlogn+nlogm)O(nlogn+nlogm)O(nlogn+nlogm)。这个近似算法是32−近似\frac{3}{2}-近似23−近似的,证明如下:
- 引理3:假设有mmm个机器,超过mmm个任务,这些任务按照处理时长排好序,t1≥t2≥⋯≥tm+1≥⋯t_1\ge t_2 \ge \cdots \ge t_{m+1} \ge \cdotst1≥t2≥⋯≥tm+1≥⋯,则显然某个机器上至少要处理两个任务,则最优解L∗≥2tm+1L^*\ge 2t_{m+1}L∗≥2tm+1。
- 从近似策略1的推导可以得到L=L[i]=(L[i]−tj)+tjL=L[i]=(L[i]-t_j)+t_jL=L[i]=(L[i]−tj)+tj,假设机器iii上至少有2个任务,则利用引理3可得tj≤12L∗t_j\le \frac{1}{2}L^*tj≤21L∗,故L≤32L∗L\le \frac{3}{2}L^*L≤23L∗,该策略是该问题的32−近似\frac{3}{2}-近似23−近似算法。
\quad该近似算法能达到最优解的32\frac{3}{2}23倍吗,即上述不等式是紧的吗?不是紧的!
2、中心点选择问题
\quad问题描述:给出nnn个点s1,⋯,sns_1,\cdots,s_ns1,⋯,sn,从中选出kkk个点CCC,设每个点到最近的中心点CCC的距离为did_idi,问采取何种策略选出这kkk个点使得r(C)=max(di)r(C)=max(d_i)r(C)=max(di)最小。这个问题是NPH问题。
\quad贪心策略:初始时随机选一个点作为中心点,之后的k−1k-1k−1次,每次遍历除已选做中心点的其他点,找出与该点距离最近的某个中心点计算出距离djd_jdj。最后在这些点中找出maxjdjmax_j d_jmaxjdj对应的点作为下一个中心点。这个近似算法是2-近似的,证明如下:
- 设C∗C^*C∗是最优解对应的中心点,CCC是用上述贪心算法选出的中心点,则r(C)≤2r(C∗)r(C)\le 2r(C^*)r(C)≤2r(C∗)。
3、带权顶点覆盖问题
\quad图的每个顶点都有权重,找一个图的顶点集合能覆盖所有的边,问如何选择顶点使得这些顶点的权重和最小。用竞价法去近似求解。
- 对于某个顶点iii,其权重为wiw_iwi,与该顶点相连的边记为ppp,给这些边赋值权重,使得∑e=(i,j)pe≤wi\sum_{e=(i,j)}p_e \le w_i∑e=(i,j)pe≤wi。
- 设SSS为任意一个集合覆盖,则∑epe≤∑i∈S∑e=(i,j)pe≤∑i∈Swi=w(S)\sum_ep_e\le \sum_{i\in S}\sum_{e=(i,j)}p_e\le \sum_{i\in S}w_i=w(S)∑epe≤∑i∈S∑e=(i,j)pe≤∑i∈Swi=w(S),故∑epe≤w(S)\sum_ep_e\le w(S)∑epe≤w(S)。
- 算法流程:对于图中任意一条边e=(i,j)e=(i,j)e=(i,j),令pe=0p_e=0pe=0,当i,ji,ji,j顶点的∑e=(i,j)pe<wi,∑e=(i,j)pe<wj\sum_{e=(i,j)}p_e<w_i,\sum_{e=(i,j)}p_e<w_j∑e=(i,j)pe<wi,∑e=(i,j)pe<wj时,增加pep_epe直到满足∑e=(i,j)pe=wi或者∑e=(i,j)pe=wj\sum_{e=(i,j)}p_e=w_i或者\sum_{e=(i,j)}p_e=w_j∑e=(i,j)pe=wi或者∑e=(i,j)pe=wj。这时候相等的那个顶点放入SSS中。
- 竞价法是2-近似算法,证明如下:
算法分析与设计——近似算法相关推荐
- 《算法分析与设计》学习心得
在学习了<算法分析与设计>这门课后,我对常见的算法有了一个基本的了解.本书主要从算法概述.递归与分治策略.动态规划.贪心算法.回溯法.分支限界法.随机化算法.线性规划与网络流.NP完全性理 ...
- 程振波 算法设计与分析_算法分析与设计之动态规划
动态规划同样是一种将问题分解为求解子问题的方法,不过与分治不同的是,动态规划算法的子问题不是相互独立的,而是有公共的部分,即有重叠子问题,这个时候使用分治算法,将会重复计算公共的子问题,效率很低!而用 ...
- 一本好的教辅,可以少走很多弯路:算法分析和设计 王晓东
算法分析和设计 王晓东 我觉得第三版JAVA版本最好,第4版是C++版本,删减了几章. 可以配合北大屈婉玲教授的视频课程一起看 自己走了一些弯路,希望后续的可以避免以下 下载地址如下,也可以淘宝买本二 ...
- 非计算机专业教学改革,非计算机专业算法分析与设计教学改革论文
非计算机专业算法分析与设计教学改革论文 [摘要]算法分析与设计不仅是计算机专业的核心课程,同时也是与计算机有关的非计算机专业的专业课.本人针对非计算机专业学生在学习过程中存在的若干问题,就教学内容.教 ...
- 《算法分析与设计》课程任务
<算法分析与设计>课程任务 内容包括以下8个部分,建议将任务按以下方式分解:其中1-6的每个部分的简介.适用条件.基本思想.基本步骤.复杂度分析等由1人讲解,实例分析由1人讲解(注:至少一 ...
- 用c语言验证装载问题 回溯法,《算法分析与设计》期末考试复习题纲(完整版)...
<算法分析与设计>期末复习题 一.选择题 1. 算法必须具备输入.输出和( D )等4个特性. A.可行性和安全 性 B .确定性和易读性 C.有穷性和安全 性 D .有穷性和确定性 2. ...
- 东师19年春计算机在线作业,东师算法分析与设计20春在线作业1【标准答案】
算法分析与设计20春在线作业1题目 试卷总分:100 得分:100 一.单选题 (共 20 道试题,共 40 分) 1.按F5开始调试,程序便会直接运行到断点处.接下来可以逐行来运行程序,查看各个变 ...
- 算法分析与设计实验报告 ——二分搜索程序算法的实现
算法分析与设计实验报告 --二分搜索程序算法的实现 实验目的及要求 1.理解分治算法的概念和基本要素: 2.理解递归的概念: 3.掌握设计有效算法的分治策略: 4.通过二分搜索技术学习分治策略设计技巧 ...
- 算法分析与设计实验报告——实现汽车加油问题
算法分析与设计实验报告--实现汽车加油问题 目录: 算法分析与设计实验报告--实现汽车加油问题 一. 实验目的 二.实验要求 三. 实验原理 四. 实验过程(步骤) 五. 运行结果 六.实验分析与讨论 ...
最新文章
- JDBC 此驱动程序不支持 Java Runtime Environment (JRE) 1.6 版
- python基础教程:3种控制流语句(if,for,while)
- GDB调试带参数argc argv的程序
- 如何在 Windows 2000 中安装 Microsoft 环回适配器
- ZigBee网络数据传递流程_Zigbee网络架构解析
- 零基础学python还是c语言-入门是不是应该选择C而不是直接学Python?
- 少和这种人在一起,不管你是谁!
- 点击编辑,进入编辑页面并把值渲染到页面上
- 计算机控制实验室装置,自控/计控原理实验箱
- ACDSee 15/ACDSee Pro 6简体中文版破解注册机
- matlab 求隐含波动率,Matlab求解資产隐含波动率及无风险利率初探.doc
- windows7 优化:readyboost总结
- 如何保证战略落地_如何保障企业战略落地实施
- XXL之整合SpringBoot
- 海洋地震设备与采集的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
- 消费者群划分——利用青少年在社交网络平台的行为进行市场细分(Python)
- U68464 滑稽树上滑稽果(guo)
- 用C语言中的结构体实现简单的学生成绩管理系统
- 数据量太大,内存不够怎么办?
- 关于http的Authorization