一、近似算法的概念

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∗≥maxj​tj​,因为至少一个机器要处理一个任务,所有任务中花费时间最长的任务所需时间为maxjtjmax_jt_jmaxj​tj​,故得到此不等式。
  • 引理2:L∗≥1m∑jtjL^* \geq \frac{1}{m}\sum_jt_jL∗≥m1​∑j​tj​。当每个机器处理任务的时长相同时L∗=1m∑jtjL^* = \frac{1}{m}\sum_jt_jL∗=m1​∑j​tj​,显然其他情况下L∗>1m∑jtjL^* > \frac{1}{m}\sum_jt_jL∗>m1​∑j​tj​。
  • 假设最后一个任务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​)≤∑k​L[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​∑k​L[k]=m1​∑j​tj​≤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​≤21​L∗,故L≤32L∗L\le \frac{3}{2}L^*L≤23​L∗,该策略是该问题的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_jmaxj​dj​对应的点作为下一个中心点。这个近似算法是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)∑e​pe​≤∑i∈S​∑e=(i,j)​pe​≤∑i∈S​wi​=w(S),故∑epe≤w(S)\sum_ep_e\le w(S)∑e​pe​≤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-近似算法,证明如下:

算法分析与设计——近似算法相关推荐

  1. 《算法分析与设计》学习心得

    在学习了<算法分析与设计>这门课后,我对常见的算法有了一个基本的了解.本书主要从算法概述.递归与分治策略.动态规划.贪心算法.回溯法.分支限界法.随机化算法.线性规划与网络流.NP完全性理 ...

  2. 程振波 算法设计与分析_算法分析与设计之动态规划

    动态规划同样是一种将问题分解为求解子问题的方法,不过与分治不同的是,动态规划算法的子问题不是相互独立的,而是有公共的部分,即有重叠子问题,这个时候使用分治算法,将会重复计算公共的子问题,效率很低!而用 ...

  3. 一本好的教辅,可以少走很多弯路:算法分析和设计 王晓东

    算法分析和设计 王晓东 我觉得第三版JAVA版本最好,第4版是C++版本,删减了几章. 可以配合北大屈婉玲教授的视频课程一起看 自己走了一些弯路,希望后续的可以避免以下 下载地址如下,也可以淘宝买本二 ...

  4. 非计算机专业教学改革,非计算机专业算法分析与设计教学改革论文

    非计算机专业算法分析与设计教学改革论文 [摘要]算法分析与设计不仅是计算机专业的核心课程,同时也是与计算机有关的非计算机专业的专业课.本人针对非计算机专业学生在学习过程中存在的若干问题,就教学内容.教 ...

  5. 《算法分析与设计》课程任务

    <算法分析与设计>课程任务 内容包括以下8个部分,建议将任务按以下方式分解:其中1-6的每个部分的简介.适用条件.基本思想.基本步骤.复杂度分析等由1人讲解,实例分析由1人讲解(注:至少一 ...

  6. 用c语言验证装载问题 回溯法,《算法分析与设计》期末考试复习题纲(完整版)...

    <算法分析与设计>期末复习题 一.选择题 1. 算法必须具备输入.输出和( D )等4个特性. A.可行性和安全 性 B .确定性和易读性 C.有穷性和安全 性 D .有穷性和确定性 2. ...

  7. 东师19年春计算机在线作业,东师算法分析与设计20春在线作业1【标准答案】

    算法分析与设计20春在线作业1题目 试卷总分:100  得分:100 一.单选题 (共 20 道试题,共 40 分) 1.按F5开始调试,程序便会直接运行到断点处.接下来可以逐行来运行程序,查看各个变 ...

  8. 算法分析与设计实验报告 ——二分搜索程序算法的实现

    算法分析与设计实验报告 --二分搜索程序算法的实现 实验目的及要求 1.理解分治算法的概念和基本要素: 2.理解递归的概念: 3.掌握设计有效算法的分治策略: 4.通过二分搜索技术学习分治策略设计技巧 ...

  9. 算法分析与设计实验报告——实现汽车加油问题

    算法分析与设计实验报告--实现汽车加油问题 目录: 算法分析与设计实验报告--实现汽车加油问题 一. 实验目的 二.实验要求 三. 实验原理 四. 实验过程(步骤) 五. 运行结果 六.实验分析与讨论 ...

最新文章

  1. JDBC 此驱动程序不支持 Java Runtime Environment (JRE) 1.6 版
  2. python基础教程:3种控制流语句(if,for,while)
  3. GDB调试带参数argc argv的程序
  4. 如何在 Windows 2000 中安装 Microsoft 环回适配器
  5. ZigBee网络数据传递流程_Zigbee网络架构解析
  6. 零基础学python还是c语言-入门是不是应该选择C而不是直接学Python?
  7. 少和这种人在一起,不管你是谁!
  8. 点击编辑,进入编辑页面并把值渲染到页面上
  9. 计算机控制实验室装置,自控/计控原理实验箱
  10. ACDSee 15/ACDSee Pro 6简体中文版破解注册机
  11. matlab 求隐含波动率,Matlab求解資产隐含波动率及无风险利率初探.doc
  12. windows7 优化:readyboost总结
  13. 如何保证战略落地_如何保障企业战略落地实施
  14. XXL之整合SpringBoot
  15. 海洋地震设备与采集的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  16. 消费者群划分——利用青少年在社交网络平台的行为进行市场细分(Python)
  17. U68464 滑稽树上滑稽果(guo)
  18. 用C语言中的结构体实现简单的学生成绩管理系统
  19. 数据量太大,内存不够怎么办?
  20. 关于http的Authorization

热门文章

  1. java ascii码转字符_java中char对应的ASCII码的转化操作
  2. PHPExcel对excel的一些操作
  3. idea中JD-Intellij插件如何使用以及Luyten的使用
  4. Python实战:如何生成正态分布数据?
  5. AQL及抽样流程和计划系列标准
  6. svn 合并分支到主干
  7. JRtplib开发笔记(四):JRtplib的VS开发环境搭建以及Demo
  8. 青龙面板的使用方法最新版
  9. 不借助软件的电脑远程链接
  10. java正则表达式语法(java正整数正则表达式)