近似算法的近似比
⑴ 如何设计近似算法
举一个例子:
解方程 lnx = x/5 (1)
这类方程没有精确解,只能采用数值方法近似求解:如迭代法等。
先建立迭代格式:
x1 = e^(x0 / 5) (2)
由 (1) 两边取 e 运算得来 ;x0为方程(2)根的初始近似值,可用观察法给出,
比如取: x0=0 ;将x0的值代入(2),算出(2)的新的近似根:x1=1,
X1=1 1.2214 1.2765 1.2908 1.2944 1.2953 1.2956 1.2957
迭代了8步,得到方程(1) 的近似解: X = 1.295 保留4位有效数字。注意(2)的解也是(1)的解。
为了提高精度可继续迭代下去。(用的是附件中的计算器)。这就是迭代近似算法的设计过程的一个简例。
⑵ 近似算法的基本概念
所有已知的解决NP-难问题算法都有指数型运行时间。但是,如果我们要找一个“好”解而非最优解,有时候多项式算法是存在的。
给定一个最小化问题和一个近似算法,我们按照如下方法评价算法:首先给出最优解的一个下界,然后把算法的运行结果与这个下界
进行比较。对于最大化问题,先给出一个上界然后把算法的运行结果与这个上界比较。
近似算法比较经典的问题包括:最小顶点覆盖、旅行售货员问题、集合覆盖等。
迄今为止,所有的NP完全问题都还没有多项式时间算法。
对于这类问题,通常可采取以下几种解题策略。
(1)只对问题的特殊实例求解
(2)用动态规划法或分支限界法求解
(3)用概率算法求解
(4)只求近似解
(5)用启发式方法求解
若一个最优化问题的最优值为c*,求解该问题的一个近似算法求得的近似最优解相应的目标函数值为c,
则将该近似算法的性能比定义为max(c/c*, c*/c)。在通常情况下,该性能比是问题输入规模n的一个函数
ρ(n),即 max(c/c*, c*/c) <= ρ(n)。
该近似算法的相对误差定义为Abs[(c-c*)/c*]。若对问题的输入规模n,有一函数ε(n)使得Abs[(c-c*)/c*] <= ε(n),则称ε(n)为该近似算法的相对误差界。近似算法的性能比ρ(n)与相对误差界ε(n)之间显然有如下
关系:ε(n)≤ρ(n)-1。
⑶ 数字的近似数怎么算法
根据要精确的小数位数四舍五入嘛。也可以用Matlab的“round()”函数,括号内放你要处理的数,按回车,它会输出你要的整数,也可以用format long这个代码,打在Matlab的common window编程框中回车。
这里有个相关教程,你参考一下:
求近似数(A)
福建省厦门市湖明小学 吴炯鹭、林齐丽师
教学内容:
教科书第14-15页例5、例6,“做一做”及练习二第3-5、7-8题。
教学目的:
1.会将整万的数改成用“万”作单位的数。
2.会用“四舍五入”法省略亿以内数万后面的尾数,求出它的近似数。
3.引导学生观察、体验数学与生活的密切联系,让学生体会数学知识来源于生活,服务于生活,培养学生主动探究的精神和用数学的意识。
教学重点、难点、关键:
1.重点:能把整万的数改写用“万”作单位的数。
2.难点:能正确地省略万后面的尾数写出它的近似数。
3.关键:把生活中的某些镜头带到学生面前,由果到因,让学生体会“近似值”在社会生活中的实际应用。
教学过程:
一、教学把整万的数改写成用“万”作单位的数。
1.投影出示白细胞和红细胞的图片,介绍白细胞:能消灭病菌,清洁血液;红细胞:能输送氧气。一小滴血液含有:红细胞:5000000个,白细胞:10000个。
2.让学生把红细胞 和白细胞的个数读出来。
①按照四位分级的方法把上面三个数表示成下面形式:
500 0000 1 0000
②让学生读出二个数:五百万、一万。
③教师:读了这些数以后,你发现了什么?
④教师根据学生的读数过程作如下板书:
500 0000=500万 1 0000=1万
3.学生观察、比较等号右边与等号左边的数。
①同学们仔细观察一下,等号右边的数与等号左边的数有什么不同?
(等号右边的数省略了万位后面的尾数,等号左边的数没有省略万位后面的尾数。
②它们有哪些相同的地方?(等号两边的数大小完全相同)
4.学生小组讨论:
①请同学们想一想,怎样用“万”作单位表示整万的数?(用万作单位表示整万的数只需要去掉万位后面的四个“0”,并写上“万”字。)
②用万作单位表示数有什么好处?
(用万作单位表示数既简单又不容易写错,使人一看就知道数的大小。)
5.小结:为了读数和写数的方便,今后我们可以直接用“万”作单位表示整万数。
6.练习:
⑴让学生独立完成第14页“做一做”1、2题,师巡视。
⑵改写完后,抽一部分同学把完成的练习在展示台上展示出来,集体评价。
二、教学用“四舍五入”法求近似数。
1.导入:
有些较大的数,有时没有必要或者无法说出它的准确数。比如,重庆市开展万人长跑活动,参加的人数约15000人,这个15000人就是一个近似数。又比如北京申办2008年奥运会的经费是20000000(2千万)美元,折合人民币约为1亿6千万元,这个1亿6千万也只是一个大概数据。既然生活中用到近似数这么多,那我们就应重视近似数的学习,怎样求一个数的近似数呢?
我们已经学过用四舍五入法求一个数的近似数。
2.复习:
用什么方法省略4926和9375千位后面的尾数?两个数的省略方法有什么不同?(引导学生说出省略千位后面的尾数要根据百位上的数进行“四舍五入”的方法。)
师:如果把数扩大到比万大的数,还可以用同样的方法来求它的近似数吗?
3.教师出示例6
①让学生试做,同时指定一名学生在黑板上完成。
②集本订正,然后分组议一议:⑴在省略12756和1389000万位后面的尾数时,要根据哪一位上的数进行“四舍五入”?⑵在求近似数时,12756的千位上的数不满5,应该怎么办?1389000千位上的数比5大,该怎么办?⑶求出的近似数为什么不使用“等号”而要使用“约等号”?
③引导学生通过讨论,解决以上三个问题。要特别注意让学生搞清楚:因为是求一个数的近似数,不是准确数,所以要使用“约等号”。
④让学生完成第15页“做一做”的题目,然后抽学生说说是怎样想的?
4.小结:
①同学们,我们学习了把一个较大的数省略万位后面的尾数,求出近似数;我们还学习了把一个整万的数改写成用“万”作单位的数。这两方面内容在意义和方法上有什么相同的地方和不同的地方?
②学生分小组讨论,然后由每小组推荐一个代表汇报讨论结果,最后由教师总结:求近似数和改写数都要改变数的表现形式,但它们的实质是不同的,求近似数改变了原数的大小,而用“万”作单位只改变了数的表现形式,没有改变数的大小。
三、巩固练习
①完成练习二第3、5题。
订正时让学生说说改写成用“万”作单位的数和省略万后面的尾数求出近似数在方法上有什么不同。
②学生独立完成练习二第4题。
四、课堂小结
教师:同学们回忆一下,这节课我们都学了哪些知识?把一个数改写成用“万”作单位的数以及求一个数的近似数时要注意些什么?
学生小结后教师做概括性的总结和评价。
⑷ 计算方法求近似值的方法
1.四舍五入法
这种最常用的求近似数的方法,主要是看它省略的尾数是4或比4小时,就把尾数舍去;如果省略的尾数最高位上的数是5或比5大时,把尾数省略去掉后,要向前一位进一。如3096401≈310万,1÷3=0.333……≈0.3。从上面两例可以看出“四舍”时近似数比准确值小,“五入”时近似数比准确值大。
2.进一法
在实际生活中,有时把一个数的尾数省略后,不管尾数最高位上的数是几,都要向前一位进一。比如一辆车能容纳4个人,现在有15个人,则需要的车辆数目为15除以4等于3.75约定于4
3.去尾法
在实际生活中,有时把一个数的尾数省略后,不管尾数的最高位上的数是几,都不要向它的前一位进一。例如一个牛皮盒子需要3平方分米的牛皮才能完成,而现在只有10平方分米的牛皮,则只能完成10除以3等于3,3约等于3个
这三种求近似数的方法,各自适用于不同的情况,一般来说,如果没有特殊要求或其他条件的限制时,都应采取四舍五入法。
最后,有些时候需要用科学计数法表达。
⑸ 近似算法的子集和问题的近似算法
问题描述:设子集和问题的一个实例为〈S,t〉。其中,S={x1,x2,…,xn}是一个正整数的集合,t是一个正整数。子集和问题判定是否存在S的一个子集S1,使得∑x = t。(x属于S1)
1 子集和问题的指数时间算法
int exactSubsetSum (S,t)
{
int n=|S|;
L[0]={0};
for (int i=1;i<=n;i++) {
L[i]=mergeLists(L[i-1],L[i-1]+S[i]);
删去L[i]中超过t的元素;
}
return max(L[n]);
}
算法以集合S={x1,x2,…,xn}和目标值t作为输入。算法中用到将2个有序表L1和L2合并成为一个新的有序表的算法mergeLists(L1,L2)。
2 子集和问题的完全多项式时间近似格式
基于算法exactSubsetSum,通过对表L[i]作适当的修整建立一个子集和问题的完全多项式时间近似格式。
在对表L[i]进行修整时,用到一个修整参数δ,0<δ<1。用参数δ修整一个表L是指从L中删去尽可能多的元素,使得每一个从L中删去的元素y,都有一个修整后的表L1中的元素z满足(1-δ)y≤z≤y。可以将z看作是被删去元素y在修整后的新表L1中的代表。
举例:若δ=0.1,且L=〈10,11,12,15,20,21,22,23,24,29〉,则用δ对L进行修整后得到L1=〈10,12,15,20,23,29〉。其中被删去的数11由10来代表,21和22由20来代表,24由23来代表。
对有序表L修整算法
List trim(L,δ)
{ int m=|L|;
L1=〈L[1]〉;
int last=L[1];
for (int i=2;i<=m;i++) {
if (last<(1-δ)*L[i]) {
将L[i]加入表L1的尾部;
last=L[i];
}
return L1;
}
子集和问题近似格式
int approxSubsetSum(S,t,ε)
{ n=|S|;
L[0]=〈0〉;
for (int i=1;i<=n;i++) {
L[i]=Merge-Lists(L[i-1],
L[i-1]+S[i]);
L[i]=Trim(L[i],ε/n);
删去L[i]中超过t的元素;
}
return max(L[n]);
}
⑹ 近似算法的介绍
本文对几种近似算法做了较为祥细的介绍,主要有顶点覆盖问题的近似算法旅行售货员问题近似算法一般的旅行售货员问题集合覆盖问题的近似算法子集和问题的近似算法
⑺ 两种近似算法组成的算法怎么求解近似比
二分法是利用函数求方程近似解的一种方法。
对函数y=f(x),若在区间[a,b]上是连续不断的一条曲线,且f(a)*f(b)<0,则方程f(x)=0在区间[a,b]上有解。
当确定方程的解在区间[a,b]上时,取区间[a,b]的中点c=(a+b)/2,再确定方程的解在区间[a,c]内还是区间[c,b]内,以此类推,直到到达所要求的精确度时,区间内的任意值都可以当做方程的解,通常取区间端点。
⑻ 近似算法和启发式算法的区别与联系
在计算机科学与运筹学,近似算法是指用来发现近似方法来解决优化问题的算法。近似算法通常与NP-hard问题相关; 由于不可能有效的多项式时间精确算来解决NP-hard问题,所以一个求解多项式时间次优解。与启发式算法不同,通常只能找到合理的解决方案相当快速,需要可证明的解决方案质量和可证明的运行时间范围。理想情况下,近似值最优可达到一个小的常数因子(例如在最优解的5%以内)。近似算法越来越多地用于已知精确多项式时间算法但由于输入大小而过于昂贵的问题。
启发式算法(heuristic algorithm)是相对于最优化算法提出的。一个问题的最优算法求得该问题每个实例的最优解。启发式算法可以这样定义:一个基于直观或经验构造的算法,在可接受的花费(指计算时间和空间)下给出待解决组合优化问题每一个实例的一个可行解,该可行解与最优解的偏离程度一般不能被预计。现阶段,启发式算法以仿自然体算法为主,主要有蚁群算法、模拟退火法、神经网络等。
⑼ 对于有scaling性质的问题,近似算法的绝对性能比和渐近性能比是相同的,为什么
有scaling的性质的话,他的最优解的值函数可以无限的扩张,所以不管N是多少,都可以通过扩张来满足opt(I)>N的条件,从而使得对任何一个I属于D,有RA(I)小于等于r成立,然后这就是绝对性能比的定义...我jio着可能是这样的,纯粹个人理解..