精华内容
下载资源
问答
  • 新手小白学 JAVA 方法 局部变量 成员变量

    万次阅读 多人点赞 2021-04-01 23:59:30
    位置:定义在方法里或者局部代码块中 注意:必须手动初始化来分配内存.如:int i = 5;或者int i; i = 5; 作用域:也就是方法里或者局部代码块中,方法运行完内存就释放了 2.3 成员变量 位置:定义在类里方法外 注意:不用

    1 变量

    1.1 概念

    可以改变的数,称为变量。在Java语言中,所有的变量在使用前必须声明。
    一般通过“变量类型 变量名 = 变量值 ;”这三部分来描述一个变量。如:int a = 3 ;
    变量的使用原则:就近原则,即尽量控制变量的使用范围到最小

    1.2 局部变量

    位置:定义在方法里或者局部代码块中
    注意:必须手动初始化来分配内存.如:int i = 5;或者int i; i = 5;
    作用域:也就是方法里或者局部代码块中,方法运行完内存就释放了

    1.3 成员变量

    位置:定义在类里方法外
    注意:不用初始化,也会自动被初始化成默认值
    作用域:整个类中,类消失了,变量才会释放
    8大类型速查表(含默认值)

    1.4 练习:变量的默认值测试

    创建包: cn.tedu.basic
    创建类: TestVariable1.java

    package cn.tedu.design;
    /*本类用于测试各种类型变量的默认值*/
    public class TestVariable1 {
            static String name;
            static byte b;//整数类型默认值都是0
            static short c;
            static int d;
            static long e;
            static float f;//小数类型的默认值是0.0
            static double g;
            static char j;//char类型的默认值是\u0000
            static boolean h;//boolean类型的默认值是false
    
            public static void main(String[] args) {
                System.out.println(name);//null,引用类型的默认值
                System.out.println(b);
                System.out.println(c);
                System.out.println(d);
                System.out.println(e);
                System.out.println(f);
                System.out.println(g);
                System.out.println(h);
                System.out.println(j);
                System.out.println(h);
            }
        }
    

    1.5 练习:局部变量与成员变量测试

    创建包: cn.tedu.basic
    创建类: TestVariable2.java

    package cn.tedu.oop;
    /**本类用于测试变量的使用*/
    public class TestVariable2 {
        //2.定义成员变量:
        //1)位置:类里方法外
        //2)无需手动初始化,会自动赋予对应类型的默认值
        //3)作用域:在整个类中生效,类消失,变量才会消失
        static int count;
       
        //3.变量有一个使用的原则:就近原则
        static int sum = 200;
        public static void main(String[] args) {
            //1.定义局部变量:
            //1)位置:在方法里/局部代码块里
            //2)必须手动初始化
            //3)作用域:在方法/局部代码块中,对应的代码执行完局部变量就被释放
            int sum = 100;//定义在方法中的局部变量sum
            System.out.println(sum);//变量的就近原则:使用的都是自己附近的变量,100
            System.out.println(count);
           
            for (int i = 0; i < 10; i++) {//局部变量i只能在循环中使用
                System.out.println(i);
            }
            //System.out.println(i);//报错:无法引用变量i:i cannot be resolved to a variable
        }
    }
    

    2 方法

    2.1 概述

    被命名的代码块,方法可以含参数可以不含参数,可以提高代码的复用性。

    2.2 方法定义的格式

    方法的格式

    2.3 方法调用顺序图

    顺序执行代码,调用指定方法,执行完毕,返回调用位置
    方法的调用顺序

    2.4 练习:测试方法的调用顺序/参数/返回值

    创建包:cn.tedu.method
    创建类:TestMethod .java

    package cn.tedu.method;
    /**本类用于测试方法*/
    public class TestMethod {
    	//1.创建程序的入口函数main()
    	public static void main(String[] args) {
    		System.out.println(1);
    		/**2.我们通过方法名+参数列表的方式来调用方法的功能*/
    		method1();//调用method1()
    		System.out.println(2);
    		method2(3);//调用method2()
    		int result = method3(1,2);//调用method3()
    		System.out.println(result);
    	}
    
    	/**3.如果方法想要返回值,必须修改返回值类型
    	 * 并且return对应类型的结果
    	 * 如果方法的返回值类型是void,不允许有返回值
    	 * */
    	/*本方法用来测试方法的返回值类型*/
    	public static int method3(int i, int j) {
    		/**4.通过return关键字将方法结果返回到调用位置*/
    		return i+j;
    	}
    
    	/**1.方法的修饰符 方法的返回值类型 方法名(方法参数){方法体}*/
    	/*method1()想测试方法的调用顺序*/
    	public static void method1() {
    		System.out.println(5);
    		System.out.println(6);
    		System.out.println(7);
    	}
    	
    	/*本方法用来测试方法的参数,参数的位置在小括号里*/
    	public static void method2(int a) {
    		System.out.println("海绵宝宝今年:"+ a +"岁啦~");
    	}	
    }
    

    2.5 方法的重载

    方法的重载是指在一个类中定义多个同名的方法,但是每个方法的参数列表不同(也就是指参数的个数和类型不同),程序在调用方法时,可以通过传递给他们的不同个数和类型的参数来决定具体调用哪个方法.

    2.6 练习:测试方法的重载

    创建包: cn.tedu.method
    创建类: TestMethodOverload.java

    package cn.tedu.method;
    /**本类用于测试方法的重载*/
    public class TestMethodOverload {
    	public static void main(String[] args) {
    		/**1.我们根据方法名+参数列表确定具体调用哪个方法*/
    		/**2.方法的重载:
    		 * 在同一个类中,存在方法名相同,但参数列表不同的方法
    		 * 如果在同类中,同名方法的参数个数不同,一定构成重载
    		 * 如果在同类中,同名方法的参数个数相同,
    		 * 需要查看对应位置上参数的类型,而不是参数名,与参数名无关
    		 * (int a,String b)与(int b,String a)--不构成重载
    		 * (int a,String b)与(String a,int b)--构成重载
    		 * */
    		//2.调用method()
    		method();
    		//4.调用method(int)
    		method(666);
    		//6.调用method(int,String)
    		method(888,"泡泡");
    	}
    
    	//1.创建一个无参的method()
    	public static void method() {
    		System.out.println("哈哈哈哈我没参数");
    	}
    	//3.创建一个method(int n)
    	public static void method(int n) {
    		System.out.println("哈哈哈哈我的参数是:"+n);
    	}
    	//5.创建一个method(int n,String s)
    	public static void method(int a,String b) {
    		System.out.println(b+"今晚要干他"+a+"碗大米饭");
    	}
    	public static void method(String a,int b) {
    		System.out.println(b+"今晚要干他"+a+"碗大米饭");
    	}
    }
    
    展开全文
  • python中全局变量与局部变量

    万次阅读 多人点赞 2019-03-01 15:27:17
    python中全局变量与局部变量 标签: python 局部变量就是定义在一个函数体内部的变量 全局变量是定义在外面的变量 比如: a = 1 def f(): b = 2 其中a就是全局变量,而b是局部变量。局部变量只在函数体内部...

    python中全局变量与局部变量

    标签: python


    • 局部变量就是定义在一个函数体内部的变量
    • 全局变量是定义在外面的变量

    比如:

    a = 1
    def f():
        b = 2
    
    

    其中a就是全局变量,而b是局部变量。局部变量只在函数体内部有效,出了函数体,外面是访问不到的,而全局变量则对下面的代码都有效。

    在函数体内部使用全局变量

    全局变量可以直接在函数体内容部使用的,你可以直接访问,但是注意的是,如果对于不可变类型的数据,如果在函数里面进行了赋值操作,则对外面的全局变量不产生影响,因为相当于新建了一个局部变量,只是名字和全局一样,而对于可变类型,如果使用赋值语句,同样对外部不产生影响,但是使用方法的话就会对外部产生影响。

    如下面的代码:

    g_b = 3;g_l1 = [1,2];g_l2 = [1,2,3]
    def t1():
        g_b = 2
        g_l1 =[]
        g_l2.append(7)
    t1(g_b,g_l1,g_l2)
    print(g_b,g_l1,g_l2)
    

    global关键字

    上面说到,如果使用的是赋值语句,在函数内部相当于新建了一个变量,并且重新给了指向,但是有时候我们想把这个变量就是外部的那个全局变量,在赋值操作的时候,就是对全局变量给了重新的指向,这个时候可以通过global关键字表示我在函数里面的这个变量是使用的全局那个。使用方法如下:

    g_b = 3
    def t1():
        global g_b
        g_b = 2
    t1()
    print(g_b)
    

    这个时候你会发现全局变量g_b也重新指向了,这是因为global gb表示指定了函数中的g_b就是外面的那个。

    展开全文
  • 关于java成员变量和局部变量

    万次阅读 多人点赞 2018-09-14 10:46:45
    1、成员变量和局部变量简述 在Java语言里,根据定义变量位置的不同,可以将变量分成两大类:成员变量(存在于堆内存中,和类一起创建)和局部变量(存在于栈内存中,当方法执行完成,让出内存,让其他方法来使用内存)...

    1、成员变量和局部变量简述

    在Java语言里,根据定义变量位置的不同,可以将变量分成两大类:成员变量(存在于堆内存中,和类一起创建)和局部变量(存在于栈内存中,当方法执行完成,让出内存,让其他方法来使用内存)。二者的运行机制存在较大差异。

    1.1成员变量

    类变量从该类的准备阶段起开始存在,直到系统完全销毁这个类,类变量的作用域与这个类的生存范围相同;

    而实例变量则从该类的实例被创建起开始存在,直到系统完全销毁这个实例,实例变量的作用域与对应实例的生存范围相同。

    正是基于这个原因,可以把类变量和实例变量统称为成员变量。其中类变量可以理解为类成员变量,它作为类本身的一个成员,与类本身共存亡;实例变量则可以理解为实例成员变量,它作为实例的一个成员与实例共存亡。

    只要类存在,类就可以访问类变量         类.类变量

    只要实例存在,实例就可以访问实例变量        实例.实例变量

    当然实例也可以访问类变量。但是需要注意的是因为实例不拥有类变量,所以通过实例来访问类变量进行操作,实际上是对类变量进行操作 ,当有其他实例来访问类变量时,访问的类变量是被对象访问操作过的类变量。

    成员变量无需显示初始化,只要为一个类定义了类变量或实例变量,系统就会在这个类的准备阶段或创建该类的实例时进行默认初始化。

    1.2局部变量

    局部变量根据定义形式的不同,又可以分为如下三种:

    形参:在定义方法签名时定义的变量,形参的作用域在整个方法中都有效

    方法局部变量:在方法体内定义的局部变量,它的作用域是从定义该变量的地方生效,到该方法结束时失效

    代码块局部变量:这个局部变量的作用域从定义该变量的地方生效,到该代码结束时失效。

    一个变量只在一对{}中起作用。。

    java允许局部变量和成员变量同名,如果方法中局部变量和成员变量同名,局部变量就会覆盖成员变量,如果需要在这个方法中引用被覆盖成员变量,则可使用this(对于实例变量)或类名(对于类变量)作为调用者来限定访问成员变量。

    2、成员变量的初始化和内存中的运行机制

    接下来以下面代码来举例说明成员变量的初始化和内存中的运行机制

     

    复制代码

     1 public class Person {
     2     public int num;
     3     public String name;
     4     
     5     public static void main(String[] args) {
     6         Person p1 = new Person();
     7         Person p2 = new Person();
     8         p1.num = 2;
     9         p2.num = 3;
    10         p1.name = "张三";
    11         p2.name = "李四";
    12     }
    13     
    14 
    15 }

    复制代码

     

    当程序执行Person p1 = new Person();时,如果这行代码是第一次使用Person类,则系统通常会在第一次使用Person类时加载这个类,并初始化这个类,在类的准备 阶段,系统将会为该类的类变量分配内存空间,并指定默认初始值。当person类初始化完成后,系统内存中的存储示意图如下图所示。

     可以看出,当person类初始化完成后,系统将在堆内存中为Person分配一块内存空间,实际上是创建了一个类对象,在这块内存区里包含了保存num类变量的内存,并设置num的默认初始值为0。

    系统接着创建了一个Person对象,并把这个Person对象赋给p1变量,Person对象包含了名为name的实例变量,实例变量是在创建实例时分配内存空间并指定初始值的。当创建了第一个person对象后,系统内存中的存储示意图如下图所示。

    从上图可以看出num不属于对象,它属于类,所以创建第一个对象时并不需要为num分配内存空间,系统只是为name分配了内存空间,并指定初始值为null。

    创建第二个对象p2时,由于在创建第一个对象时已经对类进行了初始化,所以在创建p2时对类进行初始化,对象的创建过程与第一个对象的创建过程没有什么区别。

    第二个对象创建完成后,成员变量如上图所示在内存中存储。

    **当程序需要访问类变量时,尽量使用类来作为主调,不要使用对象作为主调,这个可以避免产生歧义。

    3、局部变量的初始化和内存中的运行机制

    *局部变量必须经过显示初始化之后才能使用,系统不会为局部变量执行初始化。定义了局部变量以后,系统并没有给局部变量进行初始化,直到程序给这个局部变量赋给初值时,系统才会为这个局部变量分配内存空间,并将初始值保存到这块内存中。

    *局部变量不属于任何类或者实例,因此它总是保存在方法的栈内存中。如果局部变量是基本数据类型,则该变量直接存储在方法的栈内存中,如果是引用变量则将引用的地址存储在方法的栈内存中。

    *栈内存中的变量无需系统垃圾回收,随着方法或者代码块的运行结束而结束。局部变量通常只保存了具体的值或者引用地址,所以所占的内存比较小。

    4、变量的使用规则

    能不使用成员变量就别使用成员变量

    能不使用方法局部变量就别使用方法局部变量

    使用代码块局部变量性能最好。

     

     

     

    展开全文
  • 学习总结:局部搜索

    万次阅读 2016-04-20 11:51:50
    学习总结:局部搜索 通常考察一个算法的性能通常用局部搜索能力和全局收敛能力这两个指标。局部搜索是指能够无穷接近最优解的能力,而全局收敛能力是指找到全局最优解所在大致位置的能力。局部搜索能力...


                            学习总结:局部搜索



    通常考察一个算法的性能通常用局部搜索能力和全局收敛能力这两个指标。局部搜索是指能够无穷接近最优解的能力,而全局收敛能力是指找到全局最优解所在大致位置的能力。局部搜索能力和全局搜索能力,缺一不可。向最优解的导向,对于任何智能算法的性能都是很重要的。 

        局部最优问题(或叫局部峰值\局部陷井):现实问题中,fD上往往有多个局部的极值点。一般的局部搜索算法一旦陷入局部极值点,算法就在该点处结束,这时得到的可能是一个糟糕的结果。解决的方法就,目标函数差的点,被选中的概率小。考虑归一化问题,使得邻域内所有点被选中的概率和为1总的来说,局部搜索的方法,就是依赖于对解空间进行按邻域搜索。

        起始点问题:一般的局部搜索算法是否能找到全局最优解,与初始点的位置有很大的依赖关系。解决的方法就是随机生成一些初始点,从每个初始点出发进行搜索,找到各自的最优解。再从这些最优解中选择一个最好的结果作为最终的结果。

        学习的重要性:
            1、直接用于无约束的实际问题;
            2、其基本思想和逻辑结构可以推广到约束问题;
            3、约束问题可以转化成无约束问题求解。

        方法分类:
            1、间接法:对简单问题,求解必要条件或充分条件;
            2、迭代算法:
                     零阶法:只需计算函数值 f(x) (直接法)
                     一阶法:需计算 ▽f(x)       (梯度法)
                     二阶法:需计算 ▽2f(x)      (梯度法)

        直接搜索法优点:计算不太复杂;易于实施与快速调试;所需的准备时间较少
    一、单纯形搜索法:

    1962年由Spendley, Hext和Himsworth提出,80年代得到证明。单纯形搜索法是一种无约束最优化的直接方法。单纯形法是求解非线性多元函数、无约束最小化问题的有效方法之一。在许多技术领域内,都取得了有效的成果。

    所谓的单纯形是指n维空间E^n中具有n+1个顶点的凸多面体。比如一维空间中的线段,二维空间中的三角形,三维空间中的四面体等,均为相应空间中的单纯形。单纯形搜索法与其它直接方法相比,基本思想有所不同,在这种方法中,给定维空间E^n中一个单纯形后,求出n+1个顶点上的函数值,确定出有最大函数值的点(称为最高点)和最小函数值的点(称为最低点),然后通过反射、扩展、压缩等方法(几种方法不一定同时使用)求出一个较好点,用它取代最高点,构成新的单纯形,或者通过向最低点收缩形成新的单纯形,用这样的方法逼近极小点。
        单纯形搜索法的基本思想是:先找出一个基本可行解,对它进行鉴别,看是否是最优解;若不是,则按照一定法则转换到另一改进的基本可行解,再鉴别;若仍不是,则再转换,按此重复进行。因基本可行解的个数有限,故经有限次转换必能得出问题的最优解。

    一般解题步骤可归纳如下:

    ①把线性规划问题的约束方程组表达成典范型方程组,找出基本可行解作为初始基本可行解。

    ②若基本可行解不存在,即约束条件有矛盾,则问题无解。

    ③若基本可行解存在,从初始基本可行解作为起点,根据最优性条件和可行性条件,引入非基变量取代某一基变量,找出目标函数值更优的另一基本可行解。

    ④按步骤3进行迭代,直到对应检验数满足最优性条件(这时目标函数值不能再改善),即得到问题的最优解。

    ⑤若迭代过程中发现问题的目标函数值无界,则终止迭代。 

    二、Powell共轭方向法(方向加速法)

    1964年由Powell提出,后经Zangwoll(1967年)和Brent(1973年)改进。该算法有效地利用了迭代过程中的历史信息,建立起能加速收敛的方向。

    理论基础:以二次对称函数为模型进行研究。

    在非线性目标函数中,最简单的是二次函数,故任何对一般函数有效的方法首先应对二次函数有效;在最优点附近,非线性函数可用一个二次函数作近似,故对二次函数使用良好的方法,通常对一般函数也有效;很多实际问题的目标函数是二次函数。

    设A是n×n阶对称正定矩阵,p(0), p(1)为两个n维向量,若 成立p(0)T A p(1) = 0,则称向量p(0)与p(1)为A共轭或A正交,称该两向量的方向为A共轭方向。 

    特点:Powell法本质上是以正定二次函数为背景,以共轭方向为基础的一种方法。不同于其他的直接法, Powell法有一套完整的理论体系,故其计算效率高于其他直接法。若每次迭代的前n 个搜索方向都线性无关时,则原始Powell法具有二次终止性 Powell法使用一维搜索,而不是跳跃的探测步。Powell法的搜索方向不一定为下降方向。

    不足:在原始Powell法中,必须保持每次迭代中前n个搜索方向线性无关,否则将永远得不到问题的最优解。

    为了避免出现搜索方向组线性相关的现象,Powell及其他人对原始Powell法进行修正:

    三、梯度法

        又名最速下降法求解无约束多元函数极值的数值方法,早在1847年就已由柯西(Cauchy))提出。它是导出其他更为实用、更为有效的优化方法的理论基础。因此,梯度法是无约束优化方法中最基本的方法之一。该方法选取搜索方向Pκ的出发点是:怎样选取Pk可使ƒ(X)下降得最快?或者说使ƒ(Xκ+λΡκ)-ƒ(Χκ)<0且不等式左式的绝对值尽量大。 

    目标:求出平稳点(满足Ñf(x)=0的x * )。对给定的解,按负梯度方向搜索其邻域解,若邻域中有更优的解(根据给定的评估函数评定),则移动至该邻域解,继续寻找,直至找不到为止。此时,就找到了局部最优解。方法非常简单,但是缺陷也很明显,即陷入到局部最优解之后无法跳出。

    注意:最速下降法的搜索路径呈直角锯齿形,相邻两个搜索方向是正交的。

    1、优点:计算简单,需记忆的容量小;对初始点要求低,稳定性高;远离极小点时收敛快,常作为其它方法的第一步。

    2、缺点:收敛速度较慢(线性或不高于线性),原因是最速下降方向只有在该点附近有意义。直线搜索可能会产生一些问题,可能会“之字型”地下降。尤其当目标函数等值面是很扁的椭圆、椭球或类似图形时,收敛更慢。

    四、Newton法

    由最速下降法可知,从全局角度来看,负梯度方向一般不是一个特别好的方向,有没有更好的方向

    基本思想:利用目标函数f(x)x(k)处的二阶Taylor展开式去近似目标函数,用二次函数的极小点去逼近目标函数的极小点。

       或  

    1、Newton法的最大优点是:Newton法是局部收敛的当初始点选得合适时收敛很快,具有二阶收敛速度,是目前算法中最快的一种。 对初始点要求高,一般要求初始点离极小点较近,否则不收敛。有时即使是收敛的,但因初始点离极大点或鞍点较近,会收敛于极大点或鞍点。

    2、Newton法的搜索方向-H (x)-1 g(x),称为Newton方向,是一个好方向,对二次函数此方向直指平稳点。如果H(x(k))是正定的,则H(x(k))-1必存在,从而算法是可行的,并且保证求得的平稳点是极小点。但在迭代过程中要求H(x(k))是正定的这一条件不一定能保证,因而它不一定是下降方向。一般在极小点附近的Hesse矩阵容易为正定的。所以基本Newton法在极小点附近才比较有效。

    五、共轭梯度法

    共轭梯度法最早是又Hestenes和Stiefle(1952)提出来的,用于解正定系数矩阵的线性方程组,在这个基础上,Fletcher和Reeves (1964)首先提出了解非线性最优化问题的共轭梯度法。由于共轭梯度法不需要矩阵存储,且有较快的收敛速度和二次终止性等优点,现在共轭梯度法已经广泛地应用与实际问题中。

    共轭梯度法(Conjugate Gradient)是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。 

    共轭梯度法是一个典型的共轭方向法,它的每一个搜索方向是互相共轭的,而这些搜索方向d仅仅是负梯度方向与上一次迭代的搜索方向的组合在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。

    1、共轭梯度法不需要预先估计任何参数就可以计算,每次迭代所需的计算,主要是向量之间的运算,便于并行化。程序简单,对大规模问题很有吸引力。对一般函数为超线性收敛。

    2、共轭度法的收敛速度比最速下降法要快得多,同时也避免了要求海塞矩阵的计算收敛速度依赖于一维搜索的精确性及Hesse矩阵的特征值的分布。

        局部领域搜索是基于贪婪思想持续地在当前解的领域中进行搜索,虽然算法通用易实现,且容易理解,但其搜索性能完全依赖于领域结构和初解,尤其窥陷入局部极小而无法保证全局优化性。针对局部领域搜索,为了实现全局优化,可尝试的途径有:以可控性概率接受劣解来逃逸局部极小,如模拟退火算法;确定性的局部极小突跳策略,如禁忌策略;扩大领域搜索结构,如TSP的2opt扩展到k-opt;多点并行搜索,如进化计算;变结构领域搜索( Mladenovic et al,1997)等等。

    一、爬山法(Hill-Climbing)

    爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解。如下图所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解。

    爬山法是向值增加的方向持续移动到简单循环过程,算法在到达一个“峰顶”时终止,此时相邻状态中没有比该“峰顶”更高的值。爬山法不维护搜索树,当前节点只需要记录当前状态及其目标函数值;爬山法不会前瞻与当前状态不直接相邻的状态的值——“就像健忘的人在大雾中试图登顶珠峰一样”。爬山法从来不会“下山”,只会向值比当前节点好的方向搜索,因而肯定不完备,很容易停留在局部极值上
    function HillClimbing(problem) return 一个局部最优状态
        输入:problem
        局部变量:current, 一个节点
                  neighbor,一个节点
        current= MakeNode(Initial-State(problem));
        loop do
            neighbor= a highest-valued successor of current ;
            if VALUE[neighbor] <= VALUE[current] then return STATE[current];
            current= neighbor ;
        爬山法又称贪婪局部搜索,只是选择相邻状态中最好的一个。尽管贪婪是七宗罪之一,但是贪婪算法往往能够获得很好的效果。当然,爬山法会遇到以下问题:

    (1)局部极值

    (2)山脊:造成一系列的局部极值

    (3)高原:平坦的局部极值区域——解决办法:继续侧向移动
        随机爬山法:在上山移动中,随机选择下一步,选择的概率随着上山移动到陡峭程度而变化。

    首选爬山法:随机地生成后继节点直到生成一个优于当前节点的后继。

    随机重新开始的爬山法:“如果一开始没有成功,那么尝试,继续尝试”算法通过随机生成的初始状态来进行一系列的爬山法搜索,找到目标时停止搜索。该算法以概率1接近于完备:因为算法最终会生成一个目标状态作为初始状态。如果每次爬山搜索成功的概率为p,则需要重新开始搜索的期望次数为 1/p。

    二、模拟退火算法(Simulated Annealing)

    “模拟退火”算法是源于对热力学中退火过程的模拟,在某一给定初温下,通过缓慢下降温度参数,使算法能够在多项式时间内给出一个近似最优解。

        爬山法是完完全全的贪心法,每次都鼠目寸光的选择一个当前最优解,因此只能搜索到局部的最优值。模拟退火其实也是一种贪心算法,但是它的搜索过程引入了随机因素。模拟退火算法与爬山法类似,但是它没有选择最佳的移动,而是选择随机的移动。如果该移动使情况得到改善,那么接受该移动;否则,算法以某个概率接受该移动。因此有可能会跳出这个局部的最优解,达到全局的最优解。以上图为例,模拟退火算法在搜索到局部最优解A后,会以一定的概率接受到E的移动。也许经过几次这样的不是局部最优的移动后会到达D点,于是就跳出了局部最大值A。

    模拟退火的原理:我们将热力学的理论套用到统计学上,将搜寻空间内每一点想像成空气内的分子;分子的能量,就是它本身的动能;而搜寻空间内的每一点,也像空气分子一样带有“能量”,以表示该点对命题的合适程度。算法先以搜寻空间内一个任意点作起始:每一步先选择一个“邻居”,然后再计算从现有位置到达“邻居”的概率。可以证明,模拟退火算法所得解依概率收敛到全局最优解。

    当陷入局部最优之后,模拟退火算法要求概率根据算法进行过程中,逐步降低(逐渐降低才能趋向稳定)其跳出局部最优的概率,使其越来越趋于稳定。这一特性增加也同样存在缺陷,即对于全局最优解,也存在一定概率跳出,从而使得求解过程不稳定。

    随着邻域的范围的增大,跳出局部极小区域,最终进入全局极小区域的概率越来越大,但是代价是总的迭代次数增加。但是随着邻域范围的增大,会出现所谓的在极值附近来回”振荡”而无法落入极值点的现象。可以推测,随着邻域范围的进一步增大及其随机特性,模拟退火算法将退化到随机寻找极值并进行记录极值的算法。当然这种算法也存在问题,即对于某些情况下,也不易达到全局最优。例如,解空间中仅有两个局部最优,其中一个是全局最优,那么模拟退火似乎并不一定总能进入到全局最优解当中。

    Create initial solution S

    repeat

    for i=1 to iteration-length do

    Generate a random transition from S to Si

    If ( C(S) <= C(Si) ) then

    S=Si

    else if( exp(C(S)-C(Si))/kt > random[0,1) ) then

    S=Si

    Reduce Temperature t

    until ( no change in C(S) )

    C(S): Cost or Loss function of Solution S.

    1、在其他参数合适的情况下,初始解的位置与邻域结构是2个重要因素。

    2、初始解的位置与邻域结构的设计之间对于找到最优解的问题而言存在依赖关系。随着邻域的范围的增大,跳出局部极小区域,最终进入全局极小区域的概率越来越大,同时也可能会产生振荡,无法落入极值区域。

    3、模拟退火本质上也是一种 暴力搜索,只不过是利用随机的性质和局部极值区域连续(也取决于求解问题中邻域的结构)的特性避免了大量计算,进而在较短时间内从某种概率上逼近局部最优值和全局最优值。

    三、禁忌搜索(Tabu Search或Taboo Search,TS)

    禁忌搜索(Tabu Search或Taboo Search,简称TS)的思想最早由Glover(1986)提出,它是对局部领域搜索的一种扩展,是一种全局逐步寻优算法,是对人类智力过程的一种模拟。TS算法通过引入一个灵活的存储结构和相应的禁忌准则来避免迂回搜索,并通过藐视准则来赦免一些被禁忌的优良状态,进而保证多样化的有效探索以最终实现全局优化。相对于模拟退火和遗传算法,TS是又一种搜索特点不同的meta-heuristic算法。

    禁忌搜索是人工智能的一种体现,是局部领域搜索的一种扩展。禁忌搜索最重要的思想是标记对应已搜索的局部最优解的一些对象,并在进一步的迭代搜索中尽量避开这些对象(而不是绝对禁止循环),从而保证对不同的有效搜索途径的探索。禁忌搜索涉及到领域(neighborhood)、禁忌表(tabu list)、禁忌长度(tabu 1ength)、候选解(candidate)、藐视准则(candidate)等概念

    简单TS算法的基本思想描述如下:

    (1)给定算法参数,随机产生初始解x,置禁忌表为空。

    (2)判断算法终止条件是否满足?若是,则结束算法并输出优化结果;否则,继续以下步骤。

    (3)利用当前解的邻域函数产生其所有(或若干)邻域解,并从中确定若干候选解。

    (4)对候选解判断特赦准则是否满足?若成立,则用满足特赦准则的最佳状态y替代x成为新的当前解,即x=y,并用与y对应的禁忌对象替换最早进入禁忌表的禁忌对象,同时用y替换“best so far”状态,然后转步骤6;否则,继续以下步骤。

    (5)判断候选解对应的各对象的禁忌属性,选择候选解集中非禁忌对象对应的最佳状态为新的当前解,同时用与之对应的禁忌对象替换最早进入禁忌表的禁忌对象元素。

    (6)转步骤(2)。

    局部搜索,模拟退火,遗传算法,禁忌搜索的形象比喻:为了找出地球上最高的山,一群有志气的兔子们开始想办法。
        1、兔子朝着比现在高的地方跳去。他们找到了不远处的最高山峰。但是这座山不一定是珠穆朗玛峰。这就是局部搜索,它不能保证局部最优值就是全局最优值。
        2、兔子喝醉了。他随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,他渐渐清醒了并朝最高方向跳去。这就是模拟退火。
        3、兔子们吃了失忆药片,并被发射到太空,然后随机落到了地球上的某些地方。他们不知道自己的使命是什么。但是,如果你过几年就杀死一部分海拔低的兔子,多产的兔子们自己就会找到珠穆朗玛峰。这就是遗传算法。
        4、兔子们知道一个兔的力量是渺小的。他们互相转告着,哪里的山已经找过,并且找过的每一座山他们都留下一只兔子做记号。他们制定了下一步去哪里寻找的策略。这就是禁忌搜索。 

     



    http://blog.sciencenet.cn/blog-628137-497041.html    此文来自科学网邹锋博客,转载请注明出处。

                            学习总结:局部搜索



    通常考察一个算法的性能通常用局部搜索能力和全局收敛能力这两个指标。局部搜索是指能够无穷接近最优解的能力,而全局收敛能力是指找到全局最优解所在大致位置的能力。局部搜索能力和全局搜索能力,缺一不可。向最优解的导向,对于任何智能算法的性能都是很重要的。 

        局部最优问题(或叫局部峰值\局部陷井):现实问题中,fD上往往有多个局部的极值点。一般的局部搜索算法一旦陷入局部极值点,算法就在该点处结束,这时得到的可能是一个糟糕的结果。解决的方法就,目标函数差的点,被选中的概率小。考虑归一化问题,使得邻域内所有点被选中的概率和为1总的来说,局部搜索的方法,就是依赖于对解空间进行按邻域搜索。

        起始点问题:一般的局部搜索算法是否能找到全局最优解,与初始点的位置有很大的依赖关系。解决的方法就是随机生成一些初始点,从每个初始点出发进行搜索,找到各自的最优解。再从这些最优解中选择一个最好的结果作为最终的结果。

        学习的重要性:
            1、直接用于无约束的实际问题;
            2、其基本思想和逻辑结构可以推广到约束问题;
            3、约束问题可以转化成无约束问题求解。

        方法分类:
            1、间接法:对简单问题,求解必要条件或充分条件;
            2、迭代算法:
                     零阶法:只需计算函数值 f(x) (直接法)
                     一阶法:需计算 ▽f(x)       (梯度法)
                     二阶法:需计算 ▽2f(x)      (梯度法)

        直接搜索法优点:计算不太复杂;易于实施与快速调试;所需的准备时间较少
    一、单纯形搜索法:

    1962年由Spendley, Hext和Himsworth提出,80年代得到证明。单纯形搜索法是一种无约束最优化的直接方法。单纯形法是求解非线性多元函数、无约束最小化问题的有效方法之一。在许多技术领域内,都取得了有效的成果。

    所谓的单纯形是指n维空间E^n中具有n+1个顶点的凸多面体。比如一维空间中的线段,二维空间中的三角形,三维空间中的四面体等,均为相应空间中的单纯形。单纯形搜索法与其它直接方法相比,基本思想有所不同,在这种方法中,给定维空间E^n中一个单纯形后,求出n+1个顶点上的函数值,确定出有最大函数值的点(称为最高点)和最小函数值的点(称为最低点),然后通过反射、扩展、压缩等方法(几种方法不一定同时使用)求出一个较好点,用它取代最高点,构成新的单纯形,或者通过向最低点收缩形成新的单纯形,用这样的方法逼近极小点。
        单纯形搜索法的基本思想是:先找出一个基本可行解,对它进行鉴别,看是否是最优解;若不是,则按照一定法则转换到另一改进的基本可行解,再鉴别;若仍不是,则再转换,按此重复进行。因基本可行解的个数有限,故经有限次转换必能得出问题的最优解。

    一般解题步骤可归纳如下:

    ①把线性规划问题的约束方程组表达成典范型方程组,找出基本可行解作为初始基本可行解。

    ②若基本可行解不存在,即约束条件有矛盾,则问题无解。

    ③若基本可行解存在,从初始基本可行解作为起点,根据最优性条件和可行性条件,引入非基变量取代某一基变量,找出目标函数值更优的另一基本可行解。

    ④按步骤3进行迭代,直到对应检验数满足最优性条件(这时目标函数值不能再改善),即得到问题的最优解。

    ⑤若迭代过程中发现问题的目标函数值无界,则终止迭代。 

    二、Powell共轭方向法(方向加速法)

    1964年由Powell提出,后经Zangwoll(1967年)和Brent(1973年)改进。该算法有效地利用了迭代过程中的历史信息,建立起能加速收敛的方向。

    理论基础:以二次对称函数为模型进行研究。

    在非线性目标函数中,最简单的是二次函数,故任何对一般函数有效的方法首先应对二次函数有效;在最优点附近,非线性函数可用一个二次函数作近似,故对二次函数使用良好的方法,通常对一般函数也有效;很多实际问题的目标函数是二次函数。

    设A是n×n阶对称正定矩阵,p(0), p(1)为两个n维向量,若 成立p(0)T A p(1) = 0,则称向量p(0)与p(1)为A共轭或A正交,称该两向量的方向为A共轭方向。 

    特点:Powell法本质上是以正定二次函数为背景,以共轭方向为基础的一种方法。不同于其他的直接法, Powell法有一套完整的理论体系,故其计算效率高于其他直接法。若每次迭代的前n 个搜索方向都线性无关时,则原始Powell法具有二次终止性 Powell法使用一维搜索,而不是跳跃的探测步。Powell法的搜索方向不一定为下降方向。

    不足:在原始Powell法中,必须保持每次迭代中前n个搜索方向线性无关,否则将永远得不到问题的最优解。

    为了避免出现搜索方向组线性相关的现象,Powell及其他人对原始Powell法进行修正:

    三、梯度法

        又名最速下降法求解无约束多元函数极值的数值方法,早在1847年就已由柯西(Cauchy))提出。它是导出其他更为实用、更为有效的优化方法的理论基础。因此,梯度法是无约束优化方法中最基本的方法之一。该方法选取搜索方向Pκ的出发点是:怎样选取Pk可使ƒ(X)下降得最快?或者说使ƒ(Xκ+λΡκ)-ƒ(Χκ)<0且不等式左式的绝对值尽量大。 

    目标:求出平稳点(满足Ñf(x)=0的x * )。对给定的解,按负梯度方向搜索其邻域解,若邻域中有更优的解(根据给定的评估函数评定),则移动至该邻域解,继续寻找,直至找不到为止。此时,就找到了局部最优解。方法非常简单,但是缺陷也很明显,即陷入到局部最优解之后无法跳出。

    注意:最速下降法的搜索路径呈直角锯齿形,相邻两个搜索方向是正交的。

    1、优点:计算简单,需记忆的容量小;对初始点要求低,稳定性高;远离极小点时收敛快,常作为其它方法的第一步。

    2、缺点:收敛速度较慢(线性或不高于线性),原因是最速下降方向只有在该点附近有意义。直线搜索可能会产生一些问题,可能会“之字型”地下降。尤其当目标函数等值面是很扁的椭圆、椭球或类似图形时,收敛更慢。

    四、Newton法

    由最速下降法可知,从全局角度来看,负梯度方向一般不是一个特别好的方向,有没有更好的方向

    基本思想:利用目标函数f(x)x(k)处的二阶Taylor展开式去近似目标函数,用二次函数的极小点去逼近目标函数的极小点。

       或  

    1、Newton法的最大优点是:Newton法是局部收敛的当初始点选得合适时收敛很快,具有二阶收敛速度,是目前算法中最快的一种。 对初始点要求高,一般要求初始点离极小点较近,否则不收敛。有时即使是收敛的,但因初始点离极大点或鞍点较近,会收敛于极大点或鞍点。

    2、Newton法的搜索方向-H (x)-1 g(x),称为Newton方向,是一个好方向,对二次函数此方向直指平稳点。如果H(x(k))是正定的,则H(x(k))-1必存在,从而算法是可行的,并且保证求得的平稳点是极小点。但在迭代过程中要求H(x(k))是正定的这一条件不一定能保证,因而它不一定是下降方向。一般在极小点附近的Hesse矩阵容易为正定的。所以基本Newton法在极小点附近才比较有效。

    五、共轭梯度法

    共轭梯度法最早是又Hestenes和Stiefle(1952)提出来的,用于解正定系数矩阵的线性方程组,在这个基础上,Fletcher和Reeves (1964)首先提出了解非线性最优化问题的共轭梯度法。由于共轭梯度法不需要矩阵存储,且有较快的收敛速度和二次终止性等优点,现在共轭梯度法已经广泛地应用与实际问题中。

    共轭梯度法(Conjugate Gradient)是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点,共轭梯度法不仅是解决大型线性方程组最有用的方法之一,也是解大型非线性最优化最有效的算法之一。 

    共轭梯度法是一个典型的共轭方向法,它的每一个搜索方向是互相共轭的,而这些搜索方向d仅仅是负梯度方向与上一次迭代的搜索方向的组合在各种优化算法中,共轭梯度法是非常重要的一种。其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。

    1、共轭梯度法不需要预先估计任何参数就可以计算,每次迭代所需的计算,主要是向量之间的运算,便于并行化。程序简单,对大规模问题很有吸引力。对一般函数为超线性收敛。

    2、共轭度法的收敛速度比最速下降法要快得多,同时也避免了要求海塞矩阵的计算收敛速度依赖于一维搜索的精确性及Hesse矩阵的特征值的分布。

        局部领域搜索是基于贪婪思想持续地在当前解的领域中进行搜索,虽然算法通用易实现,且容易理解,但其搜索性能完全依赖于领域结构和初解,尤其窥陷入局部极小而无法保证全局优化性。针对局部领域搜索,为了实现全局优化,可尝试的途径有:以可控性概率接受劣解来逃逸局部极小,如模拟退火算法;确定性的局部极小突跳策略,如禁忌策略;扩大领域搜索结构,如TSP的2opt扩展到k-opt;多点并行搜索,如进化计算;变结构领域搜索( Mladenovic et al,1997)等等。

    一、爬山法(Hill-Climbing)

    爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解。如下图所示:假设C点为当前解,爬山算法搜索到A点这个局部最优解就会停止搜索,因为在A点无论向那个方向小幅度移动都不能得到更优的解。

    爬山法是向值增加的方向持续移动到简单循环过程,算法在到达一个“峰顶”时终止,此时相邻状态中没有比该“峰顶”更高的值。爬山法不维护搜索树,当前节点只需要记录当前状态及其目标函数值;爬山法不会前瞻与当前状态不直接相邻的状态的值——“就像健忘的人在大雾中试图登顶珠峰一样”。爬山法从来不会“下山”,只会向值比当前节点好的方向搜索,因而肯定不完备,很容易停留在局部极值上
    function HillClimbing(problem) return 一个局部最优状态
        输入:problem
        局部变量:current, 一个节点
                  neighbor,一个节点
        current= MakeNode(Initial-State(problem));
        loop do
            neighbor= a highest-valued successor of current ;
            if VALUE[neighbor] <= VALUE[current] then return STATE[current];
            current= neighbor ;
        爬山法又称贪婪局部搜索,只是选择相邻状态中最好的一个。尽管贪婪是七宗罪之一,但是贪婪算法往往能够获得很好的效果。当然,爬山法会遇到以下问题:

    (1)局部极值

    (2)山脊:造成一系列的局部极值

    (3)高原:平坦的局部极值区域——解决办法:继续侧向移动
        随机爬山法:在上山移动中,随机选择下一步,选择的概率随着上山移动到陡峭程度而变化。

    首选爬山法:随机地生成后继节点直到生成一个优于当前节点的后继。

    随机重新开始的爬山法:“如果一开始没有成功,那么尝试,继续尝试”算法通过随机生成的初始状态来进行一系列的爬山法搜索,找到目标时停止搜索。该算法以概率1接近于完备:因为算法最终会生成一个目标状态作为初始状态。如果每次爬山搜索成功的概率为p,则需要重新开始搜索的期望次数为 1/p。

    二、模拟退火算法(Simulated Annealing)

    “模拟退火”算法是源于对热力学中退火过程的模拟,在某一给定初温下,通过缓慢下降温度参数,使算法能够在多项式时间内给出一个近似最优解。

        爬山法是完完全全的贪心法,每次都鼠目寸光的选择一个当前最优解,因此只能搜索到局部的最优值。模拟退火其实也是一种贪心算法,但是它的搜索过程引入了随机因素。模拟退火算法与爬山法类似,但是它没有选择最佳的移动,而是选择随机的移动。如果该移动使情况得到改善,那么接受该移动;否则,算法以某个概率接受该移动。因此有可能会跳出这个局部的最优解,达到全局的最优解。以上图为例,模拟退火算法在搜索到局部最优解A后,会以一定的概率接受到E的移动。也许经过几次这样的不是局部最优的移动后会到达D点,于是就跳出了局部最大值A。

    模拟退火的原理:我们将热力学的理论套用到统计学上,将搜寻空间内每一点想像成空气内的分子;分子的能量,就是它本身的动能;而搜寻空间内的每一点,也像空气分子一样带有“能量”,以表示该点对命题的合适程度。算法先以搜寻空间内一个任意点作起始:每一步先选择一个“邻居”,然后再计算从现有位置到达“邻居”的概率。可以证明,模拟退火算法所得解依概率收敛到全局最优解。

    当陷入局部最优之后,模拟退火算法要求概率根据算法进行过程中,逐步降低(逐渐降低才能趋向稳定)其跳出局部最优的概率,使其越来越趋于稳定。这一特性增加也同样存在缺陷,即对于全局最优解,也存在一定概率跳出,从而使得求解过程不稳定。

    随着邻域的范围的增大,跳出局部极小区域,最终进入全局极小区域的概率越来越大,但是代价是总的迭代次数增加。但是随着邻域范围的增大,会出现所谓的在极值附近来回”振荡”而无法落入极值点的现象。可以推测,随着邻域范围的进一步增大及其随机特性,模拟退火算法将退化到随机寻找极值并进行记录极值的算法。当然这种算法也存在问题,即对于某些情况下,也不易达到全局最优。例如,解空间中仅有两个局部最优,其中一个是全局最优,那么模拟退火似乎并不一定总能进入到全局最优解当中。

    Create initial solution S

    repeat

    for i=1 to iteration-length do

    Generate a random transition from S to Si

    If ( C(S) <= C(Si) ) then

    S=Si

    else if( exp(C(S)-C(Si))/kt > random[0,1) ) then

    S=Si

    Reduce Temperature t

    until ( no change in C(S) )

    C(S): Cost or Loss function of Solution S.

    1、在其他参数合适的情况下,初始解的位置与邻域结构是2个重要因素。

    2、初始解的位置与邻域结构的设计之间对于找到最优解的问题而言存在依赖关系。随着邻域的范围的增大,跳出局部极小区域,最终进入全局极小区域的概率越来越大,同时也可能会产生振荡,无法落入极值区域。

    3、模拟退火本质上也是一种 暴力搜索,只不过是利用随机的性质和局部极值区域连续(也取决于求解问题中邻域的结构)的特性避免了大量计算,进而在较短时间内从某种概率上逼近局部最优值和全局最优值。

    三、禁忌搜索(Tabu Search或Taboo Search,TS)

    禁忌搜索(Tabu Search或Taboo Search,简称TS)的思想最早由Glover(1986)提出,它是对局部领域搜索的一种扩展,是一种全局逐步寻优算法,是对人类智力过程的一种模拟。TS算法通过引入一个灵活的存储结构和相应的禁忌准则来避免迂回搜索,并通过藐视准则来赦免一些被禁忌的优良状态,进而保证多样化的有效探索以最终实现全局优化。相对于模拟退火和遗传算法,TS是又一种搜索特点不同的meta-heuristic算法。

    禁忌搜索是人工智能的一种体现,是局部领域搜索的一种扩展。禁忌搜索最重要的思想是标记对应已搜索的局部最优解的一些对象,并在进一步的迭代搜索中尽量避开这些对象(而不是绝对禁止循环),从而保证对不同的有效搜索途径的探索。禁忌搜索涉及到领域(neighborhood)、禁忌表(tabu list)、禁忌长度(tabu 1ength)、候选解(candidate)、藐视准则(candidate)等概念

    简单TS算法的基本思想描述如下:

    (1)给定算法参数,随机产生初始解x,置禁忌表为空。

    (2)判断算法终止条件是否满足?若是,则结束算法并输出优化结果;否则,继续以下步骤。

    (3)利用当前解的邻域函数产生其所有(或若干)邻域解,并从中确定若干候选解。

    (4)对候选解判断特赦准则是否满足?若成立,则用满足特赦准则的最佳状态y替代x成为新的当前解,即x=y,并用与y对应的禁忌对象替换最早进入禁忌表的禁忌对象,同时用y替换“best so far”状态,然后转步骤6;否则,继续以下步骤。

    (5)判断候选解对应的各对象的禁忌属性,选择候选解集中非禁忌对象对应的最佳状态为新的当前解,同时用与之对应的禁忌对象替换最早进入禁忌表的禁忌对象元素。

    (6)转步骤(2)。

    局部搜索,模拟退火,遗传算法,禁忌搜索的形象比喻:为了找出地球上最高的山,一群有志气的兔子们开始想办法。
        1、兔子朝着比现在高的地方跳去。他们找到了不远处的最高山峰。但是这座山不一定是珠穆朗玛峰。这就是局部搜索,它不能保证局部最优值就是全局最优值。
        2、兔子喝醉了。他随机地跳了很长时间。这期间,它可能走向高处,也可能踏入平地。但是,他渐渐清醒了并朝最高方向跳去。这就是模拟退火。
        3、兔子们吃了失忆药片,并被发射到太空,然后随机落到了地球上的某些地方。他们不知道自己的使命是什么。但是,如果你过几年就杀死一部分海拔低的兔子,多产的兔子们自己就会找到珠穆朗玛峰。这就是遗传算法。
        4、兔子们知道一个兔的力量是渺小的。他们互相转告着,哪里的山已经找过,并且找过的每一座山他们都留下一只兔子做记号。他们制定了下一步去哪里寻找的策略。这就是禁忌搜索。 

     



    http://blog.sciencenet.cn/blog-628137-497041.html    此文来自科学网邹锋博客,转载请注明出处。
    展开全文
  • ajax局部刷新ajax局部刷新技术ajax局部刷新技术ajax局部刷新技术ajax局部刷新技术ajax局部刷新技术ajax局部刷新技术ajax局部刷新技术ajax局部刷新技术
  • 时间局部性和空间局部

    千次阅读 2019-05-29 15:56:22
    在CPU访问寄存器时,无论是存取数据抑或存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理。 时间局部性(temporal locality) :被引用过一次的存储器位置在未来会被多次引用(通常在循环中)。 空间...
  • B:在局部位置,可以创建内部类对象,通过对象调用内部类方法,来使用局部内部类功能 面试题: 局部内部类访问局部变量的注意事项? A:局部内部类访问局部变量必须用final修饰 B:为什么呢? 局部变量是...
  • 空间相关分析(三) 局部莫兰指数的理解与计算

    万次阅读 多人点赞 2020-06-04 08:42:13
    今天,就来进一步地说明局部莫兰指数(Local Moran’I)的含义与计算。         首先说明一下进行局部相关分析的必要性: 在全局相关分析中,如果全局莫兰指数显著,我们...
  • 普通局部变量与static局部变量的区别 内存分配和释放 1、普通局部变量只有执行到变量定义的语句的时候才分配空间。 2、static局部变量在编译阶段(函数还没有执行),变量的空间已经分配。 3、普通局部变量离开作用...
  • RecyclerView局部刷新

    2016-03-08 10:49:13
    自己写的一个RecyclerView里面的item中的控件的局部刷新。 注意这里是item中控件的局部刷新,而不是item整体刷新,这里本人是用到了金融方面加载股票行情数据列表的时候使用到了,找了很多,没有解决,最后自己写了...
  • 局部性原理

    千次阅读 2018-05-26 17:50:22
    1、什么是局部性原理? 一个编写良好的计算机程序,它们倾向于引用邻近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身,我们称这种程序具有良好的局部性。这种倾向性,我们称之为局部性原理,是一个...
  • 静态局部变量和动态局部变量区别

    千次阅读 2020-05-13 10:03:05
    静态局部变量和动态局部变量区别: 1.静态局部变量属于静态存储类别,在静态存储区分配存储单元,在整个运行期间都不释放。 而自动变量(动态局部变量)属于动态存储类别,占动态存储空间,函数调用后释放 2.静态局部...
  • 程序时间局部性和空间局部

    千次阅读 2020-06-07 09:34:48
    时间局部性:当前访问的数据,在最近的将来可能还会访问 空间局部性:当前访问数据,在最近的将来可能海湖访问其附近的数据 因为现在计算机的Cache机制 所以写程序时要注意提高程序时间局部性和空间局部性 写得好的...
  • Java 局部变量

    千次阅读 2018-11-11 19:55:38
    局部变量声明在方法、构造方法或者语句块中; 局部变量在方法、构造方法、或者语句块被执行的时候创建,当它们执行完成后,变量将会被销毁; 访问修饰符不能用于局部变量; 局部变量只在声明它的方法、构造方法...
  • 1、前言 相信同学们一定懵逼过,那是,不懵逼就不正常了,现在由我为了大家在轻松的氛围... b、局部变量:在函数内、在class的方法(构造、类方法、静态方法、实例方法)内(变量未加self修饰),这就是局部变量 ...
  • 结论:函数可以返回局部变量的值,但是不能返回指向栈内存的指针。 原因: 局部变量的作用域为函数内部,函数执行结束,操作系统会自动释放栈上的局部变量。并且函数返回的是局部变量的值拷贝。但是如果返回局部变量...
  • webpack命令行局部运行的方法
  • Flutter局部刷新

    千次阅读 2019-12-09 16:04:16
    在Flutter中,如果我们想要更新页面中的某个...下面提供了两种局部刷新的方式,通过provider和StreamBuilder来实现局部刷新 1、通过provider刷新 首先在pubspec.yaml中添加provider依赖 # provider provider:...
  • thymeleaf局部刷新

    万次阅读 多人点赞 2019-02-21 15:49:37
    之前用thymeleaf一直只是在页面加载的时候利用thymeleaf的标签取值,而ajax加载的数据则需要使用js添加到html中,那我们如果需要动态得局部刷新数据,该如何操作呢? 方法:使用th:fragment fragment可以理解为一...
  • 在CPU访问寄存器时,无论是存取数据还是存取指令,都趋于聚集在一片连续的区域中,这就被称为局部性原理。 局部性原理又分为时间局部性(temporal locality) 和空间局部性 (spatial locality) 。 1. 时间局部...
  • 关于局部变量、局部静态变量的定义 局部变量:形参和函数体内部定义的变量。 局部静态变量:将局部变量定义为static类型。 三者区别 1.形参是一种自动对象,是由传递函数的实参进行初始化,作用域仅仅是在所在函数...
  • JavaScript之局部变量和局部函数

    千次阅读 2016-04-07 19:23:34
    局部变量在前面已经解释过了,这里就不重复了。那么什么是局部函数呢?局部函数就是在函数里的。下面我们在函数outer中定义了两个局部函数。 // 定义全局函数 function outer() { // 定义第一个局部函数 ...
  • SQL局部变量

    千次阅读 2017-02-24 16:16:31
    1.局部变量的定义: DECLARE 局部变量名 数据类型 【后面可以用逗号连接n个】 局部变量名必须是以@开头,要符合标识符的命名规则。 2.局部变量的赋值: 用SET或SELECT语句为局部变量赋值。 SET 局部变量名=表达式 ...
  • 局部搜索算法

    千次阅读 2019-03-24 09:10:22
    局部搜索算法是在一组可行解的基础上,在当前解的领域内进行局部搜索产生新的可行解的过程。 主要有路径内搜索和路径间搜索,以下都以VRP为例。 路径内搜索 2-opt 2-opt搜索算法由Lin S(1965)提的一种路径内改进...
  • 为分清这些,我们先看一段代码:#include static int global_sta = 1; //global_sta为静态全局对象 void print() { int non_local = 2; //non_local为局部对象,非静态的 static sta_local = 3;...}非静态局部
  • 静态局部变量与自动局部变量的区别 区别: 1、静态局部变量属于静态存储类别,在静态存储区内分配存储分配单元。在程序整个运行期间都不释放。而自动变量(即动态局部变量)属于动态存储类别,占动态存储区...
  • 取图像局部保存成一个图像,或者将图像局部和另一个图像互换应用比较广。 主要用到的函数是rect 1.取图像局部保存 Rect rectL(0, 0, 15,20); Mat img_now = img(rectL); 取图像img的左上角,宽15像素,高20像素的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,226,722
精华内容 490,688
关键字:

局部