人工智能中的局部搜索算法

??在局部搜索算法中,我们不再关心从初始节点到目标节点之间的路径,而是考虑从当前节点出发,移动到它的邻近状态,直到到达合理的目标状态。相比于前面所说的无信息搜索算法和有信息搜索算法,局部搜索算法往往能以常数的空间复杂度(不用保存路径)在很大甚至无限的状态空间中找到合理解。

爬山法

爬山法不断向值增加的方向移动,直到到达顶峰。

function HillClimbing(problem) returns a local maximum state
    current_state = initial_state
    loop do
        next_state = the highest neighbor
        if (next_state is higher than current_state)
           current_state = next_state
        else
           return current_state

爬山法的问题在于它只能保证到达局部最大值,却不能保证到达全局最大值。

比如我们从C点出发,那么我们会停在局部最大值A点,因此没办法到达全局最大值B点。

模拟退火算法

??模拟退火算法与爬山法类似,只是我们不再一味地往值增加的方向移动,而是以一定的几率容许往值减小的方向移动,从而使得我们有可能从局部最大值A点走出来,并到达全局最大值B点。
??只所以叫做模拟退火,是因为一开始这个几率相对较高,而随着时间的增加,这个几率则像温度一样慢慢减小。

function SimulatedAnnealing () returns a solution state

    current_state = initial_state
    for t = 1 to infinite do
        T = schedule(t)
        if T = 0 then
            return current_state
        next_state = a randomly selected neighbor
        E = next_state.height - current_state.height
        if E > 0 then
            current_state = next_state
        else
            current_state = next_state with probability e^(E/T)

遗传算法

??遗传算法模拟生物中的遗传过程,从初始种群开始,迭代进行一系列杂交和变异直到获得合适的种群,并从中挑选出最佳个体。

function GeneticAlgorithm(population, fitin) returns a solution state
    inputs: population, a set of individuals
            fitness, a function that measures fitness of an individual

    repeat
        new_population = empty_set
        for i = 1 to sizeof(population) do
            x = RandomSelect(population, fitness)
            y = RandomSelect(population, fitness)
            new_individual = Reproduce(x, y)
            if (a probability) then
                new_individual = Mutate(new_individual)
            add new_individual to new_population
    until some individuals are fit enough or time has elapsed
    return the best individual in the population
----------------------------------------------------------------
function Reproduce(x, y) returns a new individual
    inputs: x, y, the parents of the new individual

    length = Length(x)
    mutation_point = RandomSelectIn(1, length)
    new_individual = Sub(x, 1, mutation_point)
                     + Sub(y, mutation_point, length)
    return new_individual
时间: 2024-10-11 01:36:31

人工智能中的局部搜索算法的相关文章

人工智能中卷积神经网络基本原理综述

人工智能Artificial Intelligence中卷积神经网络Convolutional Neural Network基本原理综述 人工智能(Artificial Intelligence,简称AI)的Deep Learning(深度学习)通过机器学习,把某一层的输出output当做下一层的输入input.在人工智能中,认为output是机器通过深度学习获得的某种"智慧".深度学习(Deep Learning)通过神经网络把海量数据分组,然后形成组合分层结果,这样就形成了神经网络

SQL Server 中本地(局部)临时表

一个SSMS查询窗口就是一个会话 通过本地临时表验证: 本地临时表仅在当前会话中可见:全局临时表在所有会话中都可见.本地临时表的名称前面有一个编号符 (#table_name),而全局临时表的名称前面有两个编号符 (##table_name). 打开一个查询窗口,新建本地临时表,插入数据,并查询 create table #temptable (id int identity(1,1) primary key, name nvarchar(10) null); go insert into #t

ABAP程序中的局部与全局变量

声明:原创作品,转载时请注明文章来自SAP师太博客,并以超链接形式标明文章原始出处,否则将追究法律责任!原文出自: 1.9.  ABAP程序中的局部与全局变量 报表程序中选择屏幕事件块(AT SELECTION-SCREEN)与逻辑数据库事件块.以及methods(类中的方法).subroutines(FORM子过程).function modules(Function函数)中声明的变量为局部的,即在这些块里声明的变量不能在其他块里使用,但这些局部变量可以覆盖同名的全局变量:除这些处理块外,其他

Python在金融,数据分析,和人工智能中的应用

Python在金融,数据分析,和人工智能中的应用 Python最近取得这样的成功,而且未来似乎还会继续下去,这有许多原因.其中包括它的语法.Python开发人员可用的科学生态系统和数据分析库.易于和几乎所有其它技术集成,以及其开源地位. 自 从1991它出现在编程场景中,比于其他编程语言,Python取得了少有的地位.面向对象,容易学习,使用语法,以及由此产生的低维护成本,是 Python持续获得好评的一部分原因.开源是一个很明显的优势,跨平台的有效性,多目标,垃圾回收(自动的),代码的简洁性,

C# 中的局部static变量

其实这问题没什么可讨论的,C#不支持局部静态变量. 但还是想了一下C#为什么不支持局部静态变量,以下均是个人想法. C++和C支持局部静态变量,也就是在一个函数的内部声明一个静态变量,这种变量的特定如下: 静态局部变量在函数内定义,但不象自动变量那样,当调用时就存在,退出函数时就消失.静态局部变量始终存在着,也就是说它的生存期为整个程序的生命周期 静态局部变量的生存期虽然为整个源程序,但是其作用域仍与自动变量相同,即只能在定义该变量的函数内使用该变量.退出该函数后,尽管该变量还继续存在,但不能使

Java中的局部代码块、构造代码块、静态代码块

局部代码块: 作用:控制变量的生命周期: 在程序中,当我们已经使用完 x 后,并且在接下来的代码中,不会再用到x,那么就没必要让x 在内存中占用空间了,这用情况下,可以使用 局部代码块,将x及其所设计到的区域封装为局部代码块,他们在程序执行中顺序不变,只是在执行完成后消失. 表现形式,以代码体现如下: class TestDemo { public static void main(String[] args) { { int x = 9; System.out.println(x); } Sy

php中在局部作用域内访问全局变量

php中,由于作用域的限制,导致变量的访问限制: 1.局部作用域内不能访问全局变量 2.全局作用域内不能访问局部变量 对于第一种情况,如下代码将不能正常运行: <?php //局部作用域(函数内)使用全局变量 $a = 1;//在全局作用域内的变量 function test() { echo "a = {$a}<br />";//在局部作用域中访问全局作用域变量 } test(); /* 运行结果: Notice: Undefined variable: a in

spine在cocos2d-x中进行局部换肤

最近发现越来越多的游戏热衷用spine来做动画,做出来的效果真是生动美妙啊.我也来研究一下.期间就遇到了两个问题,一个是局部换肤的问题,一个是碰撞的时候.我先来解决局部换肤的问题. 看了看cocos2d-x 提供的spine的demo,虽然没有局部换肤但是有整体换肤的功能,我觉得这就是解决问题的突破口.在cocos2d-x3.4中,换肤的函数是SkeletonRenderer 类中的这个函数: bool setSkin (const std::string& skinName); 首先看看函数的

Java中,局部内部类

局部内部类 A:局部内部类可以直接访问外部类的成员. B:局部内部类在局部位置可以创建内部类对象,通过内部类对象调用内部类方法,来使用局部内部类功能. C:局部内部类访问局部变量,局部变量必须加final修饰.为什么呢? 因为局部变量会随着方法的调用完毕而消失,这个时候,局部对象并没有立马从堆内存中消失, 局部对象还要使用这个局部变量.为了让数据还能继续被使用,就用fianl修饰局部变量, 这样,在堆内存里面存储的其实是一个常量值.通过反编译工具可以看一下. 通过反编译工具我们看到了,加入fin