精华内容
下载资源
问答
  • 一个启发式的例子。 驾驶汽车到达某人的家,写成算法是这样的:沿167 号高速公路往南行至Puyallup;从South Hill Mall 出口出来后往山上开 4.5 英里;在一个杂物店旁边的红绿灯路口右转,接着在第一个路口左转;从...

    启发式算法(Heuristic)概述

    TODO待补充

    一个启发式的例子。

    驾驶汽车到达某人的家,写成算法是这样的:沿167 号高速公路往南行至Puyallup;从South Hill Mall 出口出来后往山上开 4.5 英里;在一个杂物店旁边的红绿灯路口右转,接着在第一个路口左转;从左边褐色大房子的车道进去,就是North Cedar 路714 号。

    用启发式方法来描述则可能是这样:找出上一次我们寄给你的信,照着信上面的寄出地址开车到这个镇;到了之后你问一下我们的房子在哪里。 这里每个人都认识我们——肯定有人会很愿意帮助你的;如果你找不到人,那就找个公共电话亭给我们打电话,我们会出来接你。

    物理符号系统

    在研究某个系统的时侯,我们可以建立一个简单而容易理解的模型来定性地描述这个系统的性质。就像生物学中的细胞学说,一切生物都是由细胞组成的,但任何一种生物的细胞都有极其复杂的种类、形态和功能。但我们可以建立一个标准的细胞模型:细胞由细胞核、细胞质和细胞膜组成,细胞核中有遗传物质,细胞质中有各种行使不同功能的细胞器,细胞膜包在细胞质外面,负责细胞核环境的物质交换和信息交流。在此基础上研究各种细胞的形态结构和功能就都显得比较简单了。同样的道理,“智能”是个相当抽象的、让人有点无从下手的研究对象,物理符号系统就是一个用以描述智能的,(相对来说)简单而容易理解的模型。

    1 启发式搜索

    启发式搜索会造成这样的结果:找到的解虽然是令人满意的,却不是最优的;或者说,虽不是最优的却能令人满意。实际上在认知心理学研究中也表明,动物在进行决策的时候采取的也是启发式策略,尤其是在资源(时间、食物等)不充足的情况下。这样做出的决策往往不是最优的,不过至少是有效的。

    西蒙的“有限理性”正是基于此点。传统经济学一直以完全理性为前提,由于行为人可以得到所有资讯,因此可以在多种方案中,选择能使效用最大化的一种方案;但是于现实状况中,人们所获得的资讯、知识与能力都是有限的,所能够考虑的方案也是有限的,未必能作出使得效用最大化的决策。因此,西蒙认为必须考虑人的基本生理限制,以及由此而引起的认知限制、动机限制及其相互影响的限制。西蒙所提出的理论是,将不完全的资讯以及处理资讯的费用,和一些非传统的决策者目标函数引入经济分析

    经济学博弈论里,参与者有时会被认为是完全理性(英语:Perfect rationality)的;亦即,他们总是会以效用极大化的方式行动,以及总是能够对任意复杂的过程进行推论。他们总是能够思考所有可能的结果,并且选择对他们来说明显是最好可能的方式行动。完全理性和超级理性不同之处在于,完全理性的人总是会遵行优势策略,即玩家从不会在决策时考虑其他玩家对他们的决定会如何回应。完全理性的人是完全的个人主义者。

    AI的两个定性结构定律:

    1. 智能存在于物理符号系统中;
    2. 符号系统是通过生成潜在可能的解,并对其进行检验,也就是通过搜索的方式来解题的。

    符号系统是许多模式和过程的集合体,过程能够产生、破坏或修正模式。模式能指称对象、过程或其他模式,当它们指称过程的时候,它们就能得到解释,完成被指称的过程。在我们所了解的符号系统中有两类意义最为重大,就是人类和计算机。

    符号系统的智能体现在它能够从问题空间中抽取信息,并通过搜索来解决问题。启发式搜索就是一种这样的搜索策略,通过估价函数来决定下一步搜索的起始点和方向,以有效率的解决问题。

    通过认知心理学对人类及动物认知过程的研究,提出了很多关于智能的假设。以这些假设为依据,人们开发了一堆各种各样的智能程序,能完成很多看起来 很复杂的任务,比如语义理解,定律发现等。但是每一种程序都有它的局限性。相信随着认知科学研究的不断深入,会有更多更牛的程序诞生。

    2 启发式算法的发展

    2.1 发展历史

    启发式算法的计算量都比较大,所以启发式算法伴随着计算机技术的发展,取得了巨大的成就。

    40年代:由于实际需要,人们已经提出了一些解决实际问题快速有效的启发式算法。

    50年代:启发式算法的研究逐步繁荣起来。随后,人们将启发式算法的思想和人工智能领域中的各种有关问题的求解的收缩方法相结合,提出了许多启发式的搜索算法[]。其中贪婪算法和局部搜索等到人们的关注。

    60年代: 随着人们对数学模型和优化算法的研究越来越重视,发现以前提出的启发式算法速度很快,但是解得质量不能保证。虽然对优化算法的研究取得了很大的进展,但是较大规模的问题仍然无能为力(计算量还是太大)。

    70年代:计算复杂性理论的提出。NP完全理论告诉我们,许多实际问题不可能在合理的时间范围内找到全局最优解。发现贪婪算法局部搜索算法速度快,但解不好的原因主要是他们只是在局部的区域内找解,得到的解不能保证全局最优性。由此必须引入新的搜索机制和策略,才能有效地解决这些困难问题,这就导致了**超启发式算法(meta-heuristic algorithms)**的产生。

    Holland模拟地球上生物进化规律提出了遗传算法(Genetic Algorithm),它的与众不同的搜索机制引起了人们再次引发了人们研究启发式算法的兴趣,从而掀起了研究启发式算法的热潮。

    80年代以后: 模拟退火算法(Simulated Annealing Algorithm)人工神经网络(Artificial Neural Network)禁忌搜索(Tabu Search)相继出现。最近,演化算法(Evolutionary Algorithm), 蚁群算法(Ant Algorithms), 拟人拟物算法,量子算法等油相继兴起,掀起了研究启发式算法的高潮。由于这些算法简单和有效,而且具有某种智能,因而成为科学计算和人类之间的桥梁。

    优胜劣汰是大自然的普遍规律,它主要通过选择和变异来实现。选择是优化的基本思想,变异(多样化)是随机搜索或非确定搜索的基本思想。“优胜劣汰”是算法搜索的核心,根据“优胜劣汰”策略的不同,可以获得不同的超启发式算法。超启发式算法的主要思想来自于人类经过长期对物理、生物、社会的自然现象仔细的观察和实践,以及对这些自然现象的深刻理解,逐步向大自然学习,模仿其中的自然现象的运行机制而得到的。

    进化算法:是借鉴生物界自然选择和自然遗产机制的随机搜索算法,包括:遗传算法(GA),遗传策略(GS),进化规划(EP),进化策略(ES)。进化算法的基本框架还是简单遗传算法所描述的框架,但在进化的方式上有较大的差异,选择、交叉、变异、种群控制等有很多变化。

    模拟退火是模拟统计物理中固体物质的结晶过程。模拟退火来自冶金学的专有名詞退火。退火是将材料加热后再经特定速率冷却,目的是增大晶粒的体积,並且減少晶格中的缺陷。材料中的原子原来会停留在使内能有局部最小值的位置,加热使能量变大,原子会离开原来位置,而随机在其他位置中移动。退火冷却时速度较慢,使得原子有较多可能可以找到内能比原先更低的位置。

    模拟退火的原理也和金属退火的原理近似:我们将热力学的理论套用到统计学上,将搜索空间内每一点想象成空气内的分子;分子的能量,就是它本身的动能;而搜索空间内的每一點,也像空气分子一样带有“能量”,以表示该点对命题的合適程度。算法先以搜索空间内一个任意点作起始:每一步先选择一个“邻居”,然后再计算从现有位置到达“邻居”的概率。在退火的过程中,如果搜索到好的解接受;否则,以一定的概率接受不好的解(即实现多样化或变异的思想),达到跳出局部最优解得目的。

    神经网络:模拟大脑神经处理的过程,通过各个神经元的竞争和协作,实现选择和变异的过程。

    禁忌搜索:模拟人的经验,通过禁忌表记忆最近搜索过程中的历史信息,禁忌某些解,以避免走回头路,达到跳出局部最优解的目的。

    蚂蚁算法:模拟蚂蚁的行为,拟人拟物,向蚂蚁的协作方式学习。

    2.2 总结

    这几种超启发式算法都有一个共同的特点:从随机的可行初始解出发,才用迭代改进的策略,去逼近问题的最优解。他们的基本要素:

    1. 随机初始可行解;

    2. 给定一个评价函数(常常与目标函数值有关);

    3. 邻域,产生新的可行解;

    4. 选择和接受解得准则;

    5. 终止准则。

    其中 (4) 集中反映了超启发式算法的克服局部最优的能力。

    虽然人们研究对启发式算法的研究将近50年,但它还有很多不足

    1. 启发式算法目前缺乏统一、完整的理论体系。

    2. 由于NP理论,各种启发式算法都不可避免的遭遇到局部最优的问题,如何判断

    3. 各种启发式算法都有个自优点如何,完美结合。

    4. 启发式算法中的参数对算法的效果起着至关重要的作用,如何有效设置参数。

    5. 启发算法缺乏有效的迭代停止条件。

    6. 启发式算法收敛速度的研究等。

    展开全文
  • 经典的启发式算法

    2020-05-03 23:09:35
    启发式算法是相对于最优化算法提出,是基于直观或者经验构造算法,在可接受开销(时间和空间)内给出待解决组合优化问题一个可行解。 例子 例如,著名推销员旅行问题(Travel Saleman Problem or TSP)...

    定义

    • 启发式算法一般用于解决NP-hard问题,其中NP是指非确定性多项式。
    • 启发式算法是相对于最优化算法提出的,是基于直观或者经验构造的算法,在可接受的开销(时间和空间)内给出待解决组合优化问题的一个可行解。

    例子

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

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

    现代启发式算法的各种具体实现方法是相对独立提出的,相互之间有一定的区别。从历史上看,现代启发式算法主要有:模拟退火算法(SA)、遗传算法(GA)、列表搜索算法(ST)、进化规划(EP)、进化策略(ES)、蚁群算法(ACA)、人工神经网络(ANN)。如果从决策变量编码方案的不同来考虑,可以有固定长度的编码(静态编码)和可变长度的编码(动态编码)两种方案。SA是基于Monte Carlo算法迭代求解的一种全局概率型搜索算法,具有区别于常规算法的搜索机制和特点,它是借鉴了热力学的退火原理建立起来的。GA是借鉴“优胜劣汰”生物进化与遗传思想而提出的一种全局性并行搜索算法。EP和ES不像GA注重父代与子代遗传细节而侧重父代与子代表现行为上的联系(强调物种层的行为变化)。TS是一种具有记忆功能的全局逐步优化算法。ACA是受到人们对自然界中真实的蚁群集体行为研究成果的启发而提出的一种基于种群的模拟进化算法,属于随机搜索算法

    目前通用的启发式算法

    • 模拟退火算法(SA)、遗传算法(GA)、蚁群算法(ACO)、人工神经网络(ANN)等

    模拟退火算法(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)>0f(x\_new)-f(x)>0,说明新解比原来的解好,则无条件接受,如果f(x_new)f(x)<0f(x\_new) - f(x)<0,则说明旧解比新解好,则以概率e((f(x_new)f(x))/kT)e^{((f(x\_new)-f(x))/k*T)}接受x_new作为解。
    5. 如果当前温度<Tmin时,则退出循环,输出当前结果,否则减少当前温度,回到第2步继续循环,常用的降温方法为T= a*T (0<a<1),一般a取接近1的值
    模拟退火算法实例

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

    '''模拟退火算法解决求解函数最小值问题:
     其中,0<=x<=100,给定任意y值,求x为多少时,F(x)最小。
    '''
    
    class SA_test():
        T = 1000 # 初始化温度
        Tmin = 1.0 # 温度的下界
        k = 100 # 迭代的次数
        delta = 0.98 # 温度的下降率
        
        def getX():
            return np.random.random(1) * 100
    
    def getFuncResult(x, y):
        '''评价函数的值,即对应上文中的f(x)
        Args:
            x 目标函数中的一个参数
            y 目标函数中的另一个参数
        Return:
            函数值
        '''
        result = 6 * np.power(x, 7) + 8 * np.power(x, 6) + 7* np.power(x, 3) + 5 * np.power(x, 2) - x * y
        return result
    
    def get_SA(y):
        result = float("inf") # 初始化最终结果
        
        x = []
        for _ in range(0,SA_test.k):
            # 初始化初始解
            x.extend(list(SA_test.getX()))
        
        # 迭代过程
        #print(x)
        
        t = SA_test.T
        while ( t > SA_test.Tmin ):
            
            for _ in range(0,SA_test.k):
                
                temp_fun = getFuncResult(x[_] , y)
                x_new = x[_] + np.random.random(1) * 2 - 1 # 在邻域内产生新的解
                
                if (x_new >= 0 and x_new <= 100): # 判断新的x不能超出界
                    temp_fun_new = getFuncResult(x_new , y)
                    
                    if (temp_fun_new - temp_fun ) < 0 :
                        x[_] = float(x_new)
                    else:
                        # 以概率替换
                        p = 1 / (1 + np.exp(-(temp_fun_new - temp_fun) / SA_test.T))
                        
                        if (np.random.random(1) < p):
                            x[_] = float(x_new)
                        
            t = t * SA_test.delta
            
        for _ in range(0 ,SA_test.k):
            temp_result = getFuncResult(x[_] ,y)
            
            if temp_result < result :
                result = temp_result
    
        return result
    
    print( get_SA(0))
        
    

    遗传算法(GA)

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

    相关术语

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

    比如现在要计算北京、天津、广东、新疆这四个城市的一条最优路径,但算法程序不能够直接处理北京、天津、广东、新疆这些数据,所以我们得给 它们编上号,北京(0)、天津(1)、广东(2)、新疆(3),路径(天津->新疆->北京->广东)可以表示成基因型串结构数据 (1302),这样算法程序只要直接处理它们的编号就行了。
    (1)二进制编码,基因用0或1表示(常用于解决01背包问题)
    ​
    如:基因A:00100011010 (代表一个个体的染色体)
    ​
    (2)互换编码(用于解决排序问题,如旅行商问题和调度问题)
    ​
    如旅行商问题中,一串基因编码用来表示遍历的城市顺序,如:234517986,表示九个城市中,先经过城市2,再经过城市3,依此类推。
    

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

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

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

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

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

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

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

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

    (1)单交叉点法 (用于二进制编码)
    ​
    选择一个交叉点,子代在交叉点前面的基因从一个父代基因那里得到,后面的部分从另外一个父代基因那里得到。
    ​
    如:交叉前:
    ​
    00000|01110000000010000
    ​
    11100|00000111111000101
    ​
    交叉后:
    ​
    00000|00000111111000101
    ​
    11100|01110000000010000
    ​
    (2)双交叉点法 (用于二进制编码)
    ​
    选择两个交叉点,子代基因在两个交叉点间部分来自一个父代基因,其余部分来自于另外一个父代基因.
    ​
    如:交叉前:
    ​
    01 |0010| 11
    ​
    11 |0111| 01
    ​
    交叉后:
    ​
    11 |0010| 01
    ​
    01 |0111| 11
    ​
    (3)基于“ 与/或 ”交叉法 (用于二进制编码)
    ​
    对父代按位"与”逻辑运算产生一子代A;按位”或”逻辑运算产生另一子代B。该交叉策略在解背包问题中效果较好 .
    ​
    如:交叉前:
    ​
    01001011
    ​
    11011101
    ​
    交叉后:
    ​
    01001001
    ​
    11011111
    ​
    (4)单交叉点法 (用于互换编码)
    ​
    选择一个交叉点,子代的从初始位置出发的部分从一个基因复制,然后在另一个基因中扫描,如果某个位点在子代中没有,就把它添加进去。
    ​ 
    如:交叉前:
    ​
    87213 | 09546
    ​
    98356 | 71420
    ​
    交叉后:
    ​
    87213 | 95640
    ​
    98356 | 72104
    ​
    (5)部分匹配交叉(PMX)法(用于互换编码)
    ​
    先随机产生两个交叉点,定义这两点间的区域为匹配区域,并用交换两个父代的匹配区域。
    ​
    父代A:872 | 130 | 9546
    ​
    父代B:983 | 567 | 1420    变为:
    ​
    TEMP A: 872 | 567 | 9546
    ​
    TEMP B: 983 | 130 | 1420
    ​
    对于 TEMP A、TEMP B中匹配区域以外出现的数码重复,要依据匹配区域内的位置逐一进行替换。匹配关系:1<——>5 3<——>6 7<——>0
    ​
    子代A:802 | 567 | 9143
    ​
    子代B:986 | 130 | 5427
    ​
    (6)顺序交叉法(OX) (用于互换编码)
    ​
    从父代A随机选一个编码子串,放到子代A的对应位置;子代A空余的位置从父代B中按B的顺序选取(与己有编码不重复)。同理可得子代B。
    ​
    父代A: 872 | 139 | 0546
    ​
    父代B: 983 | 567 | 1420
    ​
    交叉后:
    ​
    子代A: 856 | 139 | 7420
    ​
    子代B: 821 | 567 | 3904
    ​
    (7)循环交叉(CX)(用于互换编码)
    ​
    CX同OX交叉都是从一个亲代中取一些城市,而其它城市来自另外一个亲代,但是二者不同之处在于:OX中来自第一个亲代的编码子串是随机产生的,而CX却不是,它是根据两个双亲相应位置的编码而确定的。
    ​
    父代A:1 2 3 4 5 6 7 8 9
    ​
    父代B:5 4 6 9 2 3 7 8 1
    ​
    可得循环基因:1->5->2->4->3->6->9->7->8
    ​
    子代B的编码同理。(循环基因 5->1->4->2->6->3->9->7->8)
    

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

    变异概率Pm不能太小,这样降低全局搜索能力;也不能太大,Pm > 0.5,这时GA退化为随机搜索。
    
    (1)基本位变异算子(用于二进制编码)
    
    基本位变异算子是指对个体编码串随机指定的某一位或某几位基因作变异运算。对于基本遗传算法中用二进制编码符号串所表示的个体,若需要进行变异操作的某一基因座上的原有基因值为0,则变异操作将其变为1;反之,若原有基因值为1,则变异操作将其变为0。
    
    变异前:
    
    000001110000000010000
    
    变异后:
    
    000001110001000010000
    
    (2)逆转变异算子(用于互换编码)(源代码中使用类似此方法)
    
    在个体中随机挑选两个逆转点,再将两个逆转点间的基因交换。
    
    变异前:
    
    1346798205
    
    变异后:
    
    1246798305
    
    

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

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

    遗传算法步骤
    1. 对潜在问题进行编码,初始化基因组,并根据基因组随机初始化种群,并指定繁衍代数。
    2. 计算种群中每个个体的适应度,选择一定数目的留下,其余淘汰。
    3. 在留下的个体中,随机繁衍,对分母基因进行交叉(极小概率变异),产生下一代。
    4. 回到第2步进行循环。直到达到指定的繁衍代数

    蚁群算法(ACO)

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

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

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

    蚁群算法步骤
    1. 初始化蚂蚁数量、可行路段、每条路段距离、每条路段的初始信息素大小等信息
    2. 设定蚂蚁的起点、终点。
    3. 蚂蚁从起点出发根据信息素浓度,有一定的概率性选择路段,浓度越高,概率越大,逐步回到终点。
    4. 在蚂蚁走过的路径上,根据每条路段的长度按比例释放信息素,短的路段释放的信息素多,长的路段释放的信息素少。
    5. 对所有路段的信息素进行挥发。
    6. 回到第二步进行循环,直到蚂蚁数量迭代完。
    展开全文
  • 启发式合并

    2019-02-24 11:29:00
    启发式合并是对集合合并类问题的一种高效处理方式。... • 举个十分简单的例子:起初有 n 个数组,且每个数组有且仅有 1 个数,接下  来有 n-1 个指令,需要你每次合并两个指定数组(将其中一个数组中的数一  ...

      启发式合并是对集合合并类问题的一种高效处理方式。

      • 通常启发式合并优化的是合并多个相同数据结构的时间,通过暴力的合并来

         将两个相同的数据结构合并,从而使得维护的零散信息(性质)逐渐合一。

      • 举个十分简单的例子:起初有 n 个数组,且每个数组有且仅有 1 个数,接下

        来有 n-1 个指令,需要你每次合并两个指定数组(将其中一个数组中的数一

        个一个插入另一个数组)。使插入操作的次数最少。

      • 最坏需要插入 nlogn次。做法:每次合并两个数组时,首先比较两个数组的

        大小,将小数组中的数暴力插入大数组中就可以了。

      • 证明:对于每一个数,考虑何时会对其进行插入操作。显然是它所在的集合

        大小比另一个集合小的时候。也就是说,在每次它被进行插入操作的合并指

        令后,它所在的集合大小会翻至少一倍,那么显然最多翻 logn 次啊。所以这

        样合并集合的时间复杂度是 nlogn 的。

    一些题目:

    P3201 [HNOI2009]梦幻布丁

    P3224 [HNOI2012]永无乡

    P3302 [SDOI2013]森林

    转载于:https://www.cnblogs.com/wyher/p/10425666.html

    展开全文
  • 启发式算法是相对于最优化算法提出,是基于直观或者经验构造算法,在可接受开销(时间和空间)内给出待解决组合优化问题一个可行解。 例子: 例如,著名推销员旅行问题(Travel Saleman Problem or TSP...

    参考链接:

    什么是启发式算法

    定义:

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

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

    例子:

    • 例如,著名的推销员旅行问题(Travel Saleman Problem or TSP):假设一个推销员需要从南京出发,经过广州,北京,上海,…,等 n 个城市, 最后返回香港。 任意两个城市之间都有飞机直达,但票价不等。假设公司只给报销 C 元钱,问是否存在一个行程安排,使得他能遍历所有城市,而且总的路费小于 C?
    • 推销员旅行问题显然是 NP 的。因为如果你任意给出一个行程安排,可以很容易算出旅行总开销。但是,要想知道一条总路费小于 C 的行程是否存在,在最坏情况下,必须检查所有可能的旅行安排。

    PPPPPPS:

    现代启发式算法的各种具体实现方法是相对独立提出的,相互之间有一定的区别。从历史上看,现代启发式算法主要有:模拟退火算法(SA)、遗传算法(GA)、列表搜索算法(ST)、进化规划(EP)、进化策略(ES)、蚁群算法(ACA)、人工神经网络(ANN)。如果从决策变量编码方案的不同来考虑,可以有固定长度的编码(静态编码)和可变长度的编码(动态编码)两种方案。SA是基于Monte Carlo算法迭代求解的一种全局概率型搜索算法,具有区别于常规算法的搜索机制和特点,它是借鉴了热力学的退火原理建立起来的。GA是借鉴“优胜劣汰”生物进化与遗传思想而提出的一种全局性并行搜索算法。EP和ES不像GA注重父代与子代遗传细节而侧重父代与子代表现行为上的联系(强调物种层的行为变化)。TS是一种具有记忆功能的全局逐步优化算法。ACA是受到人们对自然界中真实的蚁群集体行为研究成果的启发而提出的一种基于种群的模拟进化算法,属于随机搜索算法。

    目前通用的启发式算法

    • 模拟退火算法(SA)、遗传算法(GA)、蚁群算法(ACO)、人工神经网络(ANN)等。

    模拟退火算法(SA)

    定义:

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

    模拟退火算法步骤:

    • 初始化温度T(充分大),温度下限Tmin(充分小),初始解X,每个T值迭代次数L
    • 随机生成临域解x_new;
    • 设f(x)函数来计算用来计算解得好坏,计算出f(x_new)-f(x);
    • 如果f(x_new)-f(x)>0,说明新解比原来的解好,则无条件接受,如果f(x_new)-f(x)<0,则说明旧解比新解好,则以概率exp((f(xnew)-f(x))/k*T)接受x_new作为解。
    • 如果当前温度<Tmin时,则退出循环,输出当前结果,否则减少当前温度,回到第2步继续循环,常用的降温方法为T= a*T (0<a<1),一般a取接近1的值

    遗传算法(GA)

    定义:

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

    遗传算法步骤

    • 对潜在问题进行编码,初始化基因组,并根据基因组随机初始化种群,并指定繁衍代数。
    • 计算种群中每个个体的适应度,选择一定数目的留下,其余淘汰。
    • 在留下的个体中,随机繁衍,对分母基因进行交叉(极小概率变异),产生下一代。
    • 回到第2步进行循环。直到达到指定的繁衍代数

    蚁群算法(ACO)

    定义:

    • 我们尝试复原一下蚂蚁寻找食物的场景。
    • 想象有一只蚂蚁找到了食物,这时它需要将食物带回蚁穴。对于这一只蚂蚁而言,它显然并不知道应该怎么走。那么,这只蚂蚁有可能会随机选择一条路线。
    • 这条路线很可能是一条远路。但是,蚂蚁一路上留下了记号,也就是信息素。如果这只蚂蚁继续不停地搬运食物,或者有许多其他蚂蚁一块搬运的话。他们总会在运气好的时候走到更快往返的路线上。蚂蚁选择的路越好,相同时间内往返的次数也就更多,也就在路上留下了更多的信息素。
    • 于是,蚂蚁们总会发现,有一些路径的信息素更浓,这些路径就是更好的路线。于是蚂蚁也就更多地向信息素更浓的路径上偏移。蚂蚁们不停重复这个过程,最终总能找到一条确定的路线,而这条路线就是蚂蚁们找到的最优路径。

    蚁群算法步骤

    • 初始化蚂蚁数量、可行路段、每条路段距离、每条路段的初始信息素大小等信息
    • 设定蚂蚁的起点、终点。
    • 蚂蚁从起点出发根据信息素浓度,有一定的概率性选择路段,浓度越高,概率越大,逐步回到终点。
    • 在蚂蚁走过的路径上,根据每条路段的长度按比例释放信息素,短的路段释放的信息素多,长的路段释放的信息素少。
    • 对所有路段的信息素进行挥发。
    • 回到第二步进行循环,直到蚂蚁数量迭代完。

    END

    转载于:https://www.cnblogs.com/anliux/p/11418933.html

    展开全文
  • 启发式搜索算法蕴含着许多人生哲学,它虽不是数学方法,其思想更类似于人类解决问题的思想和一些人生中总结的道理,值得好好体会。最后用网上一段描述各种搜索算法的例子来作为总结: 为了找出地球上最高的山,...
  • 论文研究-PDES信息管理一种启发式算法.pdf, 分析了并行离散事件仿真中同步信息相关性,并提出了对这些信息进行管理一种启发式...最后用一个例子说明这种启发式算法.
  • 树上启发式合并

    2020-07-12 10:47:07
    当需要统计并合并子树信息,然而一次合并复杂度为O(n)O(n)O(n),整体复杂度为O(n2)O(n^2)O(n2)时,使用启发式合并可以将合并复杂度降为O(nlogn)O(nlogn)O(nlogn)。 启发式合并思想 举一个例子,现在有一棵树...
  • HDP单网络启发式动态规划,自适应动态规划中较为简单网络,很好入门例子,可运行。
  • 举一个简单的例子,一般的下载者程序都要用到两个API,分别是URLDownloadToFile和ShellExecute。 URLDownloadToFile这个API用于将文件下载到本机。而ShellExecute这个API用于执行某个文件。这两个API结合使用就可以...
  • 人工智能08 启发式搜索

    千次阅读 2019-07-11 11:06:32
    【这一章在某些地方笔者自己也没完全弄清楚,比如在递归最优搜索处没有找到一个很好的例子来理解,比如如何选择启发式函数等等一系列的问题,希望有大神能指明讲解。所以本章重要的只是介绍A*算法流程和简单优化并...
  • 广度优先搜索BFS、一致代价搜索UCS、深度优先搜索DFS和启发式搜索A*的详细理解,最重要的是自己创建的例子,并进行详细的分析和算法步骤的图示
  • 提出了两个Ad hoc认知无线电网络中基于能量优化组播路由启发式算法。一个是基于经典最短路径树组播算法(shortest path tree algorithm,SPTA),另一个是基于能量函数组播启发式算法(energy function based...
  • 群体智能算法就是启发式算法;研究重点就是如何平衡局部搜索与全局搜索;有效逃离局部最优解;通俗解释就是利用类似仿生学原理,将自然、动物中一些现象抽象成为算法处理相应问题。当一个问题是NP难问题时,...
  • 通常在引起客户足够重视并且戳到其痛处同时,还能为其找到解决方法,不让用户反感才是一篇合格软文,今天文芳阁传媒小编和大家分享一个利用恐吓软文成功营销一个精品案例,希望能给各位写手们一定的启发。...
  • 包括该模块到您PageObject加入include CapybaraErrorIntel::DSL后, include Capybara::DSL将返回启发式错误消息。 例子 转这个: 变成这个: 安装 将此行添加到您应用程序Gemfile中: group :test do ...
  • 启发式算法 在很长一段时间里,提起数学建模,我就能想到遗传算法,模拟退火,粒子群。提起遗传算法,我就能想到函数GA()。我打开CSDN,输入这些关键字,就可以很轻松看到这些算法原理,过程清楚明白。然而,...
  • 树上启发式合并模板

    2020-03-29 08:37:35
    模板拿cf600E举例子,问题是给一棵有根树(rt==1),每个节点有一个颜色值,树节点数和颜色值范围都是1e5。对于每个节点我们定义其子树中数量最多那个颜色值为主颜色(可以有多个并列),现要给出每个节点主...
  • 通常在引起客户足够重视并且戳到其痛处同时,还能为其找到解决方法,不让用户反感才是一篇合格软文,今天联众云传媒小编和大家分享一个利用恐吓软文成功营销一个精品案例,希望能给各位写手们一定的启发。...
  • 【算法】树上启发式合并算法

    千次阅读 2017-03-25 17:22:50
    树上启发式合并算法是启发式合并算法在树上应用。下面我直接通过一个例子来讲解这个算法。  例:给定一棵有根树,树结点编号为1~n,根结点为结点1。结点i有颜色col[i],其中1≤col[i]≤n。要求回答m个询问,每...
  • 一个简单(小于1kb)redux启发式reduce用于处理状态更改。 可与React.js和React Native一起很好地使用,但可以与任何前端库甚至原始JS模板文字结合使用。 为什么? 我喜欢redux模式,但是锅炉板数量似乎过高...
  • 理解启发式 如果你要维护一个对搜索引擎最优化网站,你应该对启发式并不...启发式对搜索引擎优化是如此重要,因为这些搜索引擎允许用户用不同方式来搜索,如特殊关键词或者短语。 让我们看个例子,如你...
  • 启发式搜索算法(A*算法)

    万次阅读 2017-01-10 20:56:33
    进行扩展时,都选取f值最小的节点,则该搜索算法为启发式搜索算法,又称A算法。 g(n):从起始状态到当前状态n的代价。 h(n):从当前状态n到目标状态的估计代价。、 A算法的例子——八数码 2 6 3 1 2 3 1...
  • 模板拿cf600E举例子,问题是给一棵有根树(rt==1),每个节点有一个颜色值,树节点数和颜色值范围都是1e5。对于每个节点我们定义其子树中数量最多那个颜色值为主颜色(可以有多个并列),现要给出每个节点主...
  • 启发式搜索就是在当前搜索结点往下选择下一步结点时,可以通过一个启发函数来进行选择,选择代价最少结点作为下一步搜索结点而跳转其上(遇到有一个以上代价最少结点,不妨选距离当前搜索点最近一次展开搜索...
  • 搜索算法 本文主要以一些概念对较为常见搜索作简单介绍: 一、盲目搜索 ...具体例子可看以下文章: 广度和深度解析 1.深度优先搜索 深度优先搜索算法(简称DFS)是一种用于遍历或搜索树...
  • 一种受GraphQL启发的基于JSON小型查询语言 发音为“ miniquel”,类似于“ miniscule”。 这是新手吗? 请查看以下示例,或。 要快速了解查询外观以及其工作方式,请直接进入。 在Twitter上关注开发人员以...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 213
精华内容 85
关键字:

启发式的例子