精华内容
下载资源
问答
  • 分享几个非常有启发性的设计概念

    千次阅读 多人点赞 2011-10-23 21:35:43
    书中提到了一些非常有启发性的设计概念,这里和大家分享一下。模块性:要编写复杂软件又不至于一败涂地的唯一方法,就是用定义清晰的接口把若干简单的模块组合起来。模块性可以说是听到的最多的一个,它已经深入...
    最近读完《unix编程艺术》,一本不错的书,值得好好读一下。

    书中提到了一些非常有启发性的设计概念,这里和大家分享一下。


    模块性:要编写复杂软件又不至于一败涂地的唯一方法,就是用定义清晰的接口把若干简单的模块组合起来。模块性可以说是听到的最多的一个,它已经深入程序员的心中。它的本质其实就是用分而治之的方法来分解复杂度。关于模块的大小,本书有精彩的论述,有兴趣可以详读。

    紧凑性:就是一个设计能否装进人脑的特性。我把它理解为设计的可读性。紧凑不等以薄弱:如果一个设计构建在易于理解利于组合的抽象概念上,则这个系统能够在具有非常强大、灵活的功能同时保持紧凑性,典型的如Eclipse的插件体系结构。紧凑不等于易于学习:对于某些紧凑设计而言,在掌握其精妙的内在概念模型之前,要理解这个设计有些困难;但是一旦理解了这个模型,则学习相对简单。

    紧凑性目前对我来说是一个“可以意会,不可言传”的特性。书中用开发语言的设计做例子也许非常好理解:lisp就是一个典型的紧凑性的设计:特性非常简单,几十行代码就可能写一个解释器。但是,它可以做很多复杂的东西。c和Python是半紧凑的,perl,java,shell则不是。c++是反紧凑的,但是他的子集是半紧凑的。
    提高紧凑性的一个方法就就是设计过程中保持概念的一致性,并且紧紧的围绕它来定义问题和解决问题。

    正交性:是有助于使复杂设计也能紧凑的重要特性之一。在纯粹的正交设计中,所有的操作均无副作用;每一个动作(无论是API调用,宏调用或者语言运算)只改变一件事情,不会影响其他。无论你控制的是什么系统,改变一个时期的方法有且只有一个。正交性的障碍在于便利性,人们经常为了便利性牺牲正交性。正交性教给我们:做,并且只做好一件事情。

    单点性:每一个知识点在系统中只有一个唯一,明确,权威的表述。在它的指引下,你编程的时候会遵循下面的建议:不要重复你自身(Don’t Repeat Yourself)——《程序员修炼之道》。数据结构的SPOT原则:无垃圾,无混淆。数据结构不要太通用,太面面俱到。数据驱动编程,代码生成在一定程度是也是遵循的SPOT原则。

    透明性:如果没有阴暗的交流和隐藏的深度,软件系统就是透明的。如果实际上能够预测到程序的大全部或大部分情况,并能够建立简单的心理模型,这个程序就是透明的:因为可以看透程序在干什么。

    要追求代码的透明,最有效的方法很简单,就是不要在具体操作的代码上叠放太多的抽象层。不要建造过分精细的抽象城堡。

    可显性:如果软件系统所包含的功能是为了帮助人们对软件建立正确的做什么,怎么做的心理模型而设计的,这个系统就是可显的。良好的帮助有助于提升可显性,良好的变量名和函数名有助于提升可显性。

    我的理解:可显性是指是否容易入门(比如有没有相关文档);透明性是指入门后是否容易理解(比如程序结构是否模型是否容易理解)。

    为透明性编程

    更深入的内容可以详细阅读《unix编程艺术》。

    展开全文
  • 启发式算法

    千次阅读 2019-05-16 15:45:01
    启发式算法一般用于解决NP-hard问题,其中NP是指非确定多项式。 你可能不懂NP-HARD问题是什么(关于NP-hard,NPC,NP,P问题,下期再说),简单来说,NPH问题就是用电脑直接算不出来的问题,然后你要用启发式算法...

    常用的启发式算法

    什么是启发式算法

    启发式算法一般用于解决NP-hard问题,其中NP是指非确定性多项式。

    你可能不懂NP-HARD问题是什么(关于NP-hard,NPC,NP,P问题,下期再说),简单来说,NPH问题就是用电脑直接算不出来的问题,然后你要用启发式算法,得到很可能正确的结果,但可以省下时间、空间,电脑就能跑起来了。

    例如,著名的旅行商问题(Travel Saleman Problem or TSP):假设一个推销员需要从南京出发,经过广州,北京,上海,…,等 n 个城市, 最后返回香港。 任意两个城市之间都有飞机直达,但票价不等。假设公司只给报销 C 元钱,问是否存在一个行程安排,使得他能遍历所有城市,而且总的路费小于 C?

    旅行商问题可以直接看做求最短路径问题,当规模小的时候你可以直接通过Dijkstra或Floyd算法求,但是当规模大的时候,这些算法就解决不聊了,所以我们要寻找其他算法。

    推销员旅行问题显然是 NP 的。因为如果你任意给出一个行程安排,可以很容易算出旅行总开销。但是,要想知道一条总路费小于 C 的行程是否存在,在最坏情况下,必须检查所有可能的旅行安排。

    启发式算法是相对于最优化算法提出的,是基于直观或者经验构造的算法,在可接受的开销(时间和空间)内给出待解决组合优化问题的一个可行解。

    目前通用的启发式算法

    目前比较通用的启发式算法一般有模拟退火算法(SA)、遗传算法(GA)、蚁群算法(ACO)、人工神经网络(ANN)、萤火虫算法(FA)等。

    模拟退火算法(SA)

    简介

    模拟退火算法(Simulated Annealing, SA)的思想借鉴于固体的退火原理,当固体的温度很高的时候,内能比较大,固体的内部粒子处于快速无序运动,当温度慢慢降低的过程中,固体的内能减小,粒子的慢慢趋于有序,最终,当固体处于常温时,内能达到最小,此时,粒子最为稳定。模拟退火算法便是基于这样的原理设计而成。

    模拟退火算法步骤

    1. 初始化温度T(充分大),温度下限Tmin(充分小),初始解X,每个T值迭代次数L

    2. 随机生成临域解x_new;

    3. 设f(x)函数来计算用来计算解得好坏,计算出f(x_new)-f(x);

    4. 如果f(x_new)-f(x)>0,说明新解比原来的解好,则无条件接受,如果f(x_new)-f(x)<0,则说明旧解比新解好,则以概率exp((f(xnew)-f(x))/k*T)接受x_new作为解。

    5. 如果当前温度<Tmin时,则退出循环,输出当前结果,否则减少当前温度,回到第2步继续循环,常用的降温方法为T= a*T (0<a<1),一般a取接近1的值

    代码示例

    求解函数最小值问题: 其中,0<=x<=100,给定任意y值,求x为多少时,F(x)最小。

    public class SATest {
     public static final int T = 1000;// 初始化温度
     public static final double Tmin = 1;// 温度的下界
     public static final int k = 100;// 迭代的次数
     public static final double delta = 0.98;// 温度的下降率public static double getX() {
     return Math.random() * 100;
     }/**
     * 评价函数的值,即对应上文中的f(x)
     * 
     * @param x目标函数中的一个参数
     * @param y目标函数中的另一个参数
     * @return函数值
     */
     public static double getFuncResult(double x, double y) {
     double result = 6 * Math.pow(x, 7) + 8 * Math.pow(x, 6) + 7
     * Math.pow(x, 3) + 5 * Math.pow(x, 2) - x * y;return result;
     }/**
     * 模拟退火算法的过程
     * @param y目标函数中的指定的参数
     * @return最优解
     */
     public static double getSA(double y) {
     double result = Double.MAX_VALUE;// 初始化最终的结果
     double x[] = new double[k];
     // 初始化初始解
     for (int i = 0; i < k; i++) {
     x[i] = getX();
     }
     // 迭代的过程
     while (t > Tmin) {
     for (int i = 0; i < k; i++) {
     // 计算此时的函数结果
     double funTmp = getFuncResult(x[i], y);
     // 在邻域内产生新的解
     double x_new = x[i] + (Math.random() * 2 - 1);
     // 判断新的x不能超出界
     if (x_new >= 0 && x_new <= 100) {
     double funTmp_new = getFuncResult(x_new, y);
     if (funTmp_new - funTmp < 0) {
     // 替换
     x[i] = x_new;
     } else {
     // 以概率替换
     double p = 1 / (1 + Math
     .exp(-(funTmp_new - funTmp) / T));
     if (Math.random() < p) {
     x[i] = x_new;
     }
     }
     }
     }
     T = T * delta;
     }
     for (int i = 0; i < k; i++) {
     result = Math.min(result, getFuncResult(x[i], y));
     }
     return result;
     }public static void main(String args[]) {
     // 设置y的值
     int y = 0;
     System.out.println("最优解为:" + getSA(y));
     }}
    

    遗传算法(GA)

    简介

    遗传算法(Genetic Algorithm, GA)起源于对生物系统所进行的计算机模拟研究。它是模仿自然界生物进化机制发展起来的随机全局搜索和优化方法,借鉴了达尔文的进化论和孟德尔的遗传学说。其本质是一种高效、并行、全局搜索的方法,能在搜索过程中自动获取和积累有关搜索空间的知识,并自适应地控制搜索过程以求得最佳解。

    相关术语

    • 编码(coding):将物体的表现型用编码的方式转为程序可控的基因型。

    • 解码(decoding):基因型到表现型的映射。

    • 基因型(genotype):参数的因子;

    • 表现型(phenotype):根据不同因子最终展现的形态;

    • 适应度(fitness):度量某个结果的好坏。

    • 进化(evolution):不断剔除差的结果,最终逐步留下好的结果。

    • 选择(selection):以一定的概率从种群中选择若干个个体留下,并繁殖。选择过程是一种基于适应度的优胜劣汰的过程。

    • 复制(reproduction):将父本、母本的基因复制,以便产生下一代。

    • 交叉(crossover):两个染色体的某一相同位置处DNA被切断,前后两串分别交叉组合形成两个新的染色体。也称基因重组或杂交;

    • 变异(mutation):交叉后可能(很小的概率)对染色体进行更改,来防止算法过早收敛而陷入局部最优解中。

    • 个体(individual):指染色体带有特征的实体;

    • 种群(population):个体的集合,该集合内个体数称为种群的大小

    在此,关于编码方法,交叉方法,变异方法,选择方法等都不做详尽概述。

    蚁群算法(ACO)

    简介

    我们尝试复原一下蚂蚁寻找食物的场景。想象有一只蚂蚁找到了食物,这时它需要将食物带回蚁穴。对于这一只蚂蚁而言,它显然并不知道应该怎么走。那么,这只蚂蚁有可能会随机选择一条路线。

    这条路线很可能是一条远路。但是,蚂蚁一路上留下了记号,也就是信息素。如果这只蚂蚁继续不停地搬运食物,或者有许多其他蚂蚁一块搬运的话。他们总会在运气好的时候走到更快往返的路线上。蚂蚁选择的路越好,相同时间内往返的次数也就更多,也就在路上留下了更多的信息素。

    于是,蚂蚁们总会发现,有一些路径的信息素更浓,这些路径就是更好的路线。于是蚂蚁也就更多地向信息素更浓的路径上偏移。蚂蚁们不停重复这个过程,最终总能找到一条确定的路线,而这条路线就是蚂蚁们找到的最优路径。

    蚁群算法步骤

    1. 初始化蚂蚁数量、可行路段、每条路段距离、每条路段的初始信息素大小等信息

    2. 设定蚂蚁的起点、终点。

    3. 蚂蚁从起点出发根据信息素浓度,有一定的概率性选择路段,浓度越高,概率越大,逐步回到终点。

    4. 在蚂蚁走过的路径上,根据每条路段的长度按比例释放信息素,短的路段释放的信息素多,长的路段释放的信息素少。

    5. 对所有路段的信息素进行挥发。

    6. 回到第二步进行循环,直到蚂蚁数量迭代完。

    萤火虫算法(FA)

    简介

    该算法的基本思想是利用在一定范围内萤火虫发光低的向发光高的萤火虫移动,从而有效的实现寻找最优解。
    由于萤火虫算法原理相对简单、且易于实现;而且还具有良好的全局寻优能力,能够快速地收敛于最优解等特性,现在萤火虫算法已经应用到工业优化、动态路径规划、图像处理、经济调度等领域。

    算法流程

    1. 初始化问题,将个体转化为萤火虫,设置亮度函数,并初始化所有参数β,γ,α
    2. 确定每个萤火虫两两之间的距离
    3. 计算对周围萤火虫的吸引度
    4. 对于每个萤火虫而言,找到吸引度最高的萤火虫个体,并更新位置
    5. 使最亮的萤火虫随机移动位置
    6. 如果完成迭代或者达到精度则结束,否则转第2步

    全文比较简洁,主要是一个简单介绍,若要具体研究,建议朋友们查阅论文。

    展开全文
  • 启发式教学

    千次阅读 2018-03-07 12:05:18
    启发式教学的关键在教师     我国著名的教育家陶行知先生说过:“我认为好的教师不是教书,不是教学生,而是教学生...要交给学生正确解决问题的方法,提高学生的动手能力和创造的思维能力,从而培养学生正确...

    启发式教学的关键在教师

        我国著名的教育家陶行知先生说过:“我认为好的教师不是教书,不是教学生,而是教学生会学。”也就是说,教师在课堂上不能单纯地向学生灌输现成的课本知识,不能再当唱独角戏的演员了,而是要当“导演”,要有意识地启发引导学生积极、主动地学习。让学生运用自己的感官,认真观察、有序实验、积极思考。要交给学生正确解决问题的方法,提高学生的动手能力和创造性的思维能力,从而培养学生正确思维,以达到掌握学习规律,提高解决问题的能力。

        1.教师的主导作用在于激发学生的学习兴趣,诱发内因,形成学习动机 爱因斯坦曾说过:“兴趣是最好的老师。”杨振宁也指出:“成功的真正秘诀在于兴趣。”心理学认为:兴趣是学习动机中最活泼、最现实的成分之一。要启发学生的思维,必须从兴趣开始。例如,我在教浮力和阿基米德原理一节内容时,课前我准备了质量相同的几个物体:一个小木块、一只瘪的废旧牙膏袋、一只气鼓鼓的废旧牙膏袋。开始,向学生介绍传说中关于死海的神话故事,并强调这个故事与新课的内容——浮力有关。然后,让一学生到演示台上把小木块和瘪的牙膏袋放入一个盛水的烧杯中,并问学生观察到什么现象,学生回答:“木块浮在水面上而牙膏袋深入水底。”再问原因,学生答:“牙膏袋是金属,密度大,而木块密度小。”让学生把气鼓鼓的牙膏袋也放入水中,结果发现也肖在水面。学生对实验现象非常感兴趣,对自己分析的结果产生了怀疑,又对解开最终结果产生浓厚的求知欲。教师抓住时机因势利导引入新课,学生的思维相当活跃,连平时调皮淘气的学生都能集中精力听课了,取得了较好的教学效果。

        2.教师的主导作用在于启迪学生思维、引导思路、发展智力 威廉说过:“平庸的教师只是叙述,好的教师讲解,优秀的教师示范,伟大的教师启发。”对学生进行启发式教学,教师应当引导学生完成观察→思维→想象、识记→理解→记忆、分析→概括→综合直到提取信息解决问题这样三个层次的思维过程,把错综复杂的物理现象,通过分析、说理,理清思路,使问题简单化。例如,在夏季晚上七、八点钟的时候,常常会感到灯泡的光线很暗,有的日光灯不能起动正常发光。为什么?对于这样一个司空见惯的物理现象,可以启发学生思考问题的线索:灯光暗→支路电压低→干路损耗电压增大(假设干路总电压不变)→干路电流增大→总电阻减小→支路增加→用电器增多。然后要求学生反向思考。经过师生的共同讨论,大部分同学都能落实到并联电路中的支路电压与支路的多少有关的问题上。老师总结为“对于同一干路来说,支路增加越多,支路电压越低。”老师再问学生为什么在炎热夏季的晚上家里电扇转得特别慢?为什么在中午家里做饭的时候,如果附近有人使用电炉,常会出现停电事故?这类问题学生通过分析、比较,都能回答得较为轻松,达到引导思路的目的。

        3.教师的主导作用在于引导学生观察,提高分析问题的能力 观察是学习物理的主要方法之一,也是学习物理知识获得感性认识的源泉,通过观察才能获得进一步思考的感性材料。教师要引导学生会观察物理现象和物理过程,分析物理结果。例如,在观察生活中的物理现象以及课堂演示实验的同时,指导学生记录观察的点滴及心得,时间一长,自然就会“集腋成裘,聚沙成塔”了,从而培养学生的观察、分析问题的能力。在“感生电流的方向,椤次定律”一节的演示实验中,让学生自己动手,首先在观察现象中获得感性认识,然后对实验观察记录进行分析,通过归纳、总结。最后得出:“感生电流的磁场,总是要阻碍原磁场的变化”这一高度概括的规律。另外,在学生分组实验中,还要引导学生观察所用实验器材的型号、规格、构造、作用及说明书等,掌握器材各部分的作用。在教学中,教师要充分利用演示实验和学生实验,尽可能采用边教边实验及问答的方式,逐步启发学生思维提高其观察分析问题的能力。

        4.教师的主导作用在于指导学生实验,培养其动手能力和创新能力 物理学是一门以实验为主的基础学科,具有较强的实验技能性,实验是物理学研究物理现象、物理规律的基本方法,它对激发学生学习的积极性,培养学生的观察思考等综合能力以及提高实验技能起着积极的作用。对于演示实验,教师要严格规范操作过程,鼓励学生积极参与实验,提高学生正确使用实验仪器的能力,培养良好的实验习惯,积极开动脑筋,对实验提出有参考价值的建议并要求其他同学作记录。对于学生实验,要善于启发学生独立思考,勇于发表自己的见解,不人云亦云。鼓励学生不要被课本提供的实验方案束缚了手脚,另外寻找新的实验方法,大胆设计新的实验方案,培养学生的创新能力;要求每个学生都能接触到实验器材,指导学生遵守实验仪器的使用规则,亲自动手操作,让学生做到“三到”,即手到、眼到、脑到;让学生通过实验,自己去发现规律,体会实验成功的喜悦,这样,即使学生学会了获得物理知识的方法,又培养了学生的实验技能和严谨的科学态度,达到实验的目的,也才能取得良好的教学效果。 总之,教师要充分体现自己在物理课堂教学中的主导地位,发挥好“导演”的作用。利用学生好奇、好胜的心理,激发其学习物理的兴趣。指导学生实验、引导学生观察,一步一步的启发学生的思维,逐步地提高学生观察问题、分析问题以及解决问题的能力。

    展开全文
  • 关于启发式搜索算法

    千次阅读 2018-11-12 16:52:17
    启发式搜索就是利用启发性信息进行制导的搜索。 启发性信息就是有利于尽快找到问题之解的信息。 按其用途划分,启发性信息一般可分为以下三类: (1)用于扩展节点的选择,即用于决定应先扩展哪一个节点,以免盲目扩展...

    启发式搜索(Informed Search / Heuristic Search)
    启发式搜索就是利用启发性信息进行制导的搜索。

    启发性信息就是有利于尽快找到问题之解的信息。
    按其用途划分,启发性信息一般可分为以下三类:
    (1)用于扩展节点的选择,即用于决定应先扩展哪一个节点,以免盲目扩展。
    (2)用于生成节点的选择,即用于决定应生成哪些后续节点,以免盲目地生成过多无用节点。
    (3)用于删除节点的选择,即用于决定应删除哪些无用节点,以免造成进一步的时空浪费。

    启发式搜索要用启发函数来导航,其搜索算法就要在状态图一般搜索算法基础上再增加启发函数值的计算与传播过程,并且由启发函数值来确定节点的扩展顺序。两种策略:

    全局择优搜索
    在OPEN表中保留所有已生成而未考察的节点,并用启发函数f(x)对它们全部进行估价,从中选出最优节点进行扩展,而不管这个节点出现在搜索树的什么地方。
    局部择优搜索(爬山法)
    扩展节点N后仅对N的子节点按启发函数值大小以升序排序,再将它们依次放入OPEN表的首部。

    一般的搜索策略都可以归纳成以下的算法过程

       - 初始化队列Q
    
       - 重复以下过程
    
                 - 取队列Q头的值,并测试其是否是我们的目标值,如果是结束搜索
    
                 - 拓展Q,例如产生候选节点并将其加入队列Q
    

    因为在实际编程过程中,虽然实际模型常常是图Graph结构的,但是通常会使用队列Queue来保存搜索信息

    不同的搜索算法根据添加新节点的顺序不同而区分,就是拓展步骤候选节点的选择顺序策略

    从这种角度考虑时,深度优先搜索(DFS)和广度优先搜索(BFS)其实在处理新节点的方法上是一样的

    区别仅仅在:

           - 深度优先搜索,在队列的头加入新的候选节点
    
           - 广度优先搜索,在队列的尾加入新的候选节点
    

    最佳优先搜索 Best First Search 使用评价函数 f(x) 来对上述的节点选择顺序进行排序

    下面先定义两个函数

           - g(x) 为从根节点到x节点的代价总和
    
           - h(x) 为从x节点到目标节点的估计代价总和
    

    这类应用算法有

    代价一致搜索 (Uniform Cost Search) f(x) = g(x)

    贪心搜索 (Greedy Search) f(x) = h(x)

    A星搜索 (A* Search) f(x) = g(x) + h(x)

    关于模型的图

    上面所讲的 g(x) h(x) 还是太过抽象,所以这里用一张经典的图进行说明,这是一张地图的抽象,假定目标节点为Bucharest

    在上图中,h(x)指的是右边的各个节点(城市)到目标节点(Bucharest)的直线测量距离

    可以想象,这个距离在实际中不可能等同于路程,除非你在驾驶一辆理想化的私人进行交通而且还无视航空法规。

    但是,这个距离在大多情况下是能反映出一部分的实际距离的,因为无论怎样绕远路,直线距离100km和直线距离1km的两个地点在实际到达距离或时间(代价)上都是有区分度的。

    这里又回到了数学建模问题,一个好的建模可以大大优化算法的执行质量。

    贪心搜索是完全使用 h(x) 作为参考的,该算法会一直选择距离目标最近的点进行拓展。

    由于每一步的拓展都是基于当前与节点相连接的节点进行选择的,所以贪心算法可能会出现环路状况,例如图中的 Iasi 和 Neamt 就会不断循环访问

    而且贪心搜索无法保证结果的最优解,原因是我们用的数据是预测数据(直线距离)而不是真实数据,其具有一定概率上的相关性但不具备实际相关性。

    代价一致搜索

    用优先队列实现,关键点在于该算法不关心经过节点量,只关心该路径已走过路程和(代价和)。而且此算法就算到达目标点也不会停止,而是继续寻找是否有更佳路径,直至遍历完成

    procedure UniformCostSearch(Graph, start, goal)
    node ← start
    cost ← 0
    frontier ← priority queue containing node only
    explored ← empty set
    prev[] ← empty set
    do
    if frontier is empty
    return failure
    node ← frontier.pop()
    if node is goal
    return solution
    explored.add(node)
    for each of node’s neighbors n
    if n is not in explored
    if n is not in frontier
    frontier.add(n)
    prev[n] = node
    else if n is in frontier with higher cost
    replace existing node with n
    prev[n] = node
    这里还有一个算法在我看来是和代价一致搜索是一样原理的,就是Dijkstra’s algorithm。
    这两个算法的区别在于UCS不需要像Dijkstra’s那样一次吧所有节点的信息全部读入(初始化时所有节点的cost设置成无限大),而是在某节点有更新时才对其进行cost值初始化并加入优先队列。(黄色字部分为区别)

    因为算法的限制,ucs不会出现环路情况,因为explored参数的存在

    explored 和 prev可以设置为每个节点的状态 ,也可以设成独立结构

    A* Search

    吸收了以上两个算法的优点

    贪心的效率和ucs的精准

    为什么A* Search能保证有最优解呢?

    这是由于 h() 只要满足可允许(adimssible)条件:任何的h(x)都小于或等于h*(x)

    h*(x) 是从节点x到目标的实际路径

    那么从算法的角度看预测值的权永远小于或等于同等的实际距离的权

    就是说预测对算法的影响不会大于实际值

    Iterative Deepening A*

    相对A*算法该算法使用了深度优先的搜索策略,并且在递归开始就设定了阈值,在算法搜索到一定深度后自动停止深度搜索

    该算法无需进行访问判断和排序,相对占内存空间较小

    node current node
    g the cost to reach current node
    f estimated cost of the cheapest path (root…node…goal)
    h(node) estimated cost of the cheapest path (node…goal)
    cost(node, succ) step cost function
    is_goal(node) goal test
    successors(node) node expanding function

    procedure ida_star(root)
    bound := h(root)
    loop
    t := search(root, 0, bound)
    if t = FOUND then return bound
    if t = ∞ then return NOT_FOUND
    bound := t
    end loop
    end procedure

    function search(node, g, bound)
    f := g + h(node)
    if f > bound then return f
    if is_goal(node) then return FOUND
    min := ∞
    for succ in successors(node) do //DFS
    t := search(succ, g + cost(node, succ), bound)
    if t = FOUND then return FOUND
    if t < min then min := t
    end for
    return min
    end function


    作者:joshualiunsw
    来源:CSDN
    原文:https://blog.csdn.net/joshualiunsw/article/details/52135805
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 人工智能08 启发式搜索

    千次阅读 2019-07-11 11:06:32
    启发式搜索 【这一章在某些地方笔者自己也没完全弄清楚,...除了搜索过程不是从开始节点统一向外扩展外,本章描述的搜索过程有点像广度优先搜索,不同的是,它会优先顺着有启发性具有特定信息的节点搜索下去,这些...
  • 启发式算法(Heuristic Algorithm)

    千次阅读 2019-01-17 10:56:42
    启发式算法(Heuristic Algorithm)有不同的定义:一种定义为,一个基于直观或经验的构造的算法,对优化问题的实例能给出可接受的计算成本(计算时间、占用空间等)内,给出一个近似最优解,该近似解于真实最优解的...
  • 启发式算法介绍

    千次阅读 2019-08-10 16:30:53
    启发式算法(Heuristic Algorithm)有不同的定义:一种定义为,一个基于直观或经验的构造的算法,对优化问题的实例能给出可接受的计算成本(计算时间、占用空间等)内,给出一个近似最优解,该近似解于真实最优解的...
  • 启发式评估

    千次阅读 2013-11-14 11:05:33
    使用Nielsen的十条准则做WEB的启发式评估 ——根据workshop, Heuristic Evaluation: Fitting The Approach to the Project整理 Nielsen & Molich‘s Heuristics,优点:所需的时间和资本都比较低,可以快速进行评估...
  • 启发式算法 相对与精确算法提出的。是一种群体智能算法。平衡局部最优解与全局最优解。 启发式算法可以这样定义:一个基于直观或经验构造的算法,在可接受的花费(指计算时间和空间)下给出待解决组合优化问题每一个...
  • A*算法(二)启发式算法

    万次阅读 2019-09-03 23:20:50
    启发式函数的使用、权衡代价函数、衡量单位、精确的启发式函数、预计算的精确启发式函数、线性精确启发式算法、网格地图中的启发式算法、曼哈顿距离、对角线距离、欧几里得距离、平方后的欧几里得距离、Breaking ...
  • 不确定下的判断:启发法和偏见

    千次阅读 2014-09-30 11:52:40
    代表: 1.对结果的先验概率不敏感 2.对样本
  • 面向对象设计——启发规则

    千次阅读 2020-04-12 13:52:02
    11.2 启发规则 人们使用面向对象方法学... 使设计结果清晰、易读,易懂,是提高软件可维护和可重用的重要措施 。显然,人们不会重用那些他们不理解的设计。保证设计结果清晰易懂的主要因素 如下*: (1)用词一致,...
  • 再谈启发式搜索算法

    千次阅读 2015-12-05 09:17:46
    启发式搜索算法有点像广度优先搜索,不同的是,它会优先顺着有启发性具有特定信息的节点搜索下去 ,这些节点可能是到达目标的最好路径。 我们称这个过程为最优(best-first)或启发式搜索。 下面是其基本思想:...
  • 人工智能(二)确定推理(启发式推理、消解推理) 推理就是由已知判断推出另一个判断的思维过程。 知识+推理=人类智慧 专家知识库+推理机=人工智能 一、推理的方法及其分类 ##按逻辑基础分类 1.演绎推理(三段论...
  • [转]为什么Lisp语言如此先进?

    千次阅读 2013-06-20 16:05:49
    为什么Lisp语言如此先进?作者: 阮一峰日期: 2010年10月14日上周,《黑客与画家》...下面是此书中非常棒的一篇文章,原文写于八年前,至今仍然具有启发性,作者眼光之超前令人佩服。由于我不懂Lisp语言,所以田春同
  • **这里就是要根据知识,设计启发性信息(启发函数)**,启发性信息可以: 1)帮助确定扩展节点的信息 2)有效地帮助决定哪些后继节点应被生成 3)能决定在扩展一个节点时哪些节点应从搜索树上被删除 启发性
  • 路由寻迹之启发式搜索 启发式搜索是指我们在搜索路径时,首先选择最有希望的的节点去拓展,这种被称为启发式搜索. 启发函数 那么什么可以用来定义最有希望,如何来界定一个点比另外一个点、一个网格比另外一个网络更...
  • 启发式搜索算法

    千次阅读 2012-03-19 22:04:39
    再谈启发式搜索算法 作者:July 二零一一年二月十日 本文参考: I、 维基百科、 II、 人工智能-09 启发式搜索、 III、本BLOG内,经典算法研究系列:一、A*搜索算法 ---------------------------- 引言:...
  • 启发式算法是指具有自学习功能,可利用部分信息对计算产生推理的算法。 … ps:这部分可见:什么是启发式算法(heuristic algorithm) 朗文对heuristic的解释是:The use of experience and pract
  • 启发式算法解TSP问题

    千次阅读 2018-05-30 10:24:03
    从结果可以看出启发式算法的特点,由于是经验算法,结果并不是严格意义上的最优解,因此具有一定的随机,但只要迭代次数足够多,总可以收敛到最优解附近。 三、遗传算法  遗传算法(GA)是模拟达尔文生物进化论的...
  • 本文是数据科学公司(Silicon Valley Data Science)的数据工程师 Matt Rubashkin 的一篇实战派文章,介绍了他如何创造性的将深度学习与物联网结合起来解决一个实际问题的思路和过程,非常具有启发性。...
  • 测试启发法速查表

    千次阅读 2014-06-16 08:58:03
    Elisabeth Hendrickson 是业内公认、世界知名的大师级敏捷软件测试专家,她的“测试启发法速查表”在业内广为流传,帮助了无数的测试工作者。本文就是这份测试启发法速查表,希望能够帮助各位测试人员。
  • 启发式测试策略模型

    千次阅读 2016-03-24 13:53:36
    今天学习了探索式测试设计里的一个测试模型策略觉得很不错,自己总结了下发出来与大家一起分享,大家可以在这个启发式测试策略的基础上根据自己的实际工作环境和语境下进行扩展、补充和改善,以达到帮助我们平时工作...
  • 最近在学习图信号处理的相关知识,想进行一些应用层面的实践,恰巧遇到一篇十分具有启发性的推荐算法的论文,故以此文进行简单总结,也作为自己的学习笔记。 Reference: ... 一、图信号基本知识 一个无向图 GGG(Graph...
  • 浅析超启发式算法(hyper heuristic)

    千次阅读 2019-01-02 17:02:08
    在介绍超启发式算法前,先来简单聊一聊启发式算法。为解决NP难问题(精确求解非常困难,但验证结果十分简单,例如旅行商问题就是一个典型的NP难问题),启发式算法应运而生。据我所知,启发式算法中有基于种群的遗传...
  • 计算机或通信里的概念对应的名词,很多来源于生活中,因此名词本身在生活中的含义对于理解概念非常具有启发性。 因为虽然这个名词只是一个或几个单词,但实际是前辈们深入理解和实践之后发现最能体现这个概念的生活...
  • C++语言程序设计实验指导与习题解析

    千次下载 热门讨论 2007-03-12 13:47:52
    以Visual C++ 6.0为上机练习环境,内容包括:C++语言程序的开发环境、C++语言实验题及指导、与《C++语言程序设计教程》一书配套的习题及习题...实现和习题选择恰当,具有启发性和实用性,与理论教学紧密配合。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 80,950
精华内容 32,380
关键字:

具有启发性的