精华内容
下载资源
问答
  • Java语言特点

    万次阅读 多人点赞 2019-06-30 19:37:45
    Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类,这也有利于软件的升级。 Java中的类有一个运行时刻的表示,能进行运行时刻的类型...

    Java图标

    Java语言是简单的

    1. Java语言的语法与C语言和C++语言很接近,从某种意义上讲,它是由C和C++演变而来,使得大多数程序员很容易学习和使用。
    2. 对C++来说进行了简化和一定的提高,如:使用接口代替了复杂的多重继承以及取消了指针,还通过实现垃圾自动回收机制,大大简化了程序员的资源释放管理工作。
    3. 提供了丰富的类库和API文档,以及第三方开发包工具包,还有大量的基于Java的开源项目,帮助程序设计人员参考学习,JDK就是开放的源代码之一,读者可以通过分析项目的源代码,来提高自己的编程水平。

    Java语言是面向对象的

    面向对象就是Java语言的基础,也是Java语言的重要特性。面向对象是指以对象为基本单元,包含属性和方法。对象的状态用属性表达,对象的行为用方法表达。

    面向对象技术使得应用程序的开发变得简单易用,节省代码。总之,Java语言是一个纯面向对象的程序设计语言。

    Java语言是分布式的

    1. 分布性主要包括两大方面,分别是操作分布和数据分布,其中操作分布指的是在多个不同的主机上布置相关操作,数据分布是将数据分别存放在多个网络中不同的主机上,借助的是URL(统一资源定位符)访问网络对象,访问方式和访问本地系统相似。
    2. Java语言具有一个强大的,易于使用的网络能力,这是非常适合于分布式计算程序的。
    3. Java语言支持Internet应用的开发,在基本的Java应用编程接口中有一个网络应用编程接口(java.net),它提供了用于网络应用编程的类库,包括URL、URLConnection、Socket、ServerSocket等。Java的RMI(远程方法激活)机制也是开发分布式应用的重要手段。

    Java语言是多线程的

    多线程机制使应用程序在同一时间并行执行多项任务,Java语言提供多线程之间的同步机制,这些相应的同步机制可以很好的保证不同线程,能够正确的共享数据。多线程机制使程序具有更好的交互性和实时性。

    Java语言是高性能的

    1. Java是一种先编译后解释的语言,所以它不如全编译性语言快。但是有些情况下性能是很要紧的,为了支持这些情况,Java设计者制作了“及时”编译程序,它能在运行时把Java字节码翻译成特定CPU(中央处理器)的机器代码,也就是实现全编译了。Java字节码格式设计时考虑到这些“及时”编译程序的需要,所以生成机器代码的过程相当简单,它能产生相当好的代码。
    2. 与那些解释型的高级脚本语言相比,Java的确是高性能的。事实上,Java的运行速度随着JIT(Just-In-Time)编译器技术的发展越来越接近于C++。

    Java语言是跨平台的

    1. 所谓的跨平台性,是指软件可以不受计算机硬件和操作系统的约束而在任意计算机环境下正常运行。这是软件发展的趋势和编程人员追求的目标。之所以这样说,是因为计算机硬件的种类繁多,操作系统也各不相同,不同的用户和公司有自己不同的计算机环境偏好,而软件为了能在这些不同的环境里正常运行,就需要独立于这些平台。
    2. 在Java语言中,Java自带的虚拟机很好地实现了跨平台性。Java源代码经过编译后生成二进制的字节码是与平台无关的,Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。这就是Java的能够Write once, run anywhere(一次编译,到处运行)的原因。Java虚拟机提供了一个字节码到底层硬件平台及操作系统的屏障,使得Java语言具备跨平台性。

    Java语言是可移植的

    可移植性来源于跨平台性性,另外,Java还严格规定了各个基本数据类型的长度。Java系统本身也具有很强的可移植性,Java编译器是用Java实现的,Java的运行环境是用ANSI C实现的。

    Java语言是安全的

    在Java语言中删除了类似于C语言中的指针和内容释放等语法,有效的避免了非法操作内存,代码要经过校验之后才能够运行,所以未经允许的Java程序不可能出现损害系统平台的行为,最大的好处就是,Java可以编写防病毒和可修复的系统,Java通常被用在网络环境中,为此,Java提供了一个安全机制以防恶意代码的攻击,从而可以提高系统的安全性。

    Java语言是健壮的

    Java语言的强类型机制、异常处理、垃圾的自动收集等是Java程序健壮性的重要保证。对指针的丢弃是Java的明智选择。Java的安全检查机制使得Java更具健壮性。

    Java语言是动态的

    1. Java语言的设计目标之一是适应于动态变化的环境。Java程序需要的类能够动态地被载入到运行环境,也可以通过网络来载入所需要的类,这也有利于软件的升级。
    2. Java中的类有一个运行时刻的表示,能进行运行时刻的类型检查。
    展开全文
  • 机器学习

    千次阅读 2020-01-09 22:01:52
    机器学习在我个人看来就是运用相关的算法,对某件事一次又一次地重复,直到达到自己想要的目标 机器学习的分类 学习策略的分类标准就是根据学生实现信息转换所需的推理多少和难易程度来分类的,依从简单到复杂,从少...

    机器学习介绍

    机器学习在我个人看来就是运用相关的算法,对某件事一次又一次地重复,直到达到自己想要的目标

    机器学习的分类

    学习策略的分类标准就是根据学生实现信息转换所需的推理多少和难易程度来分类的,依从简单到复杂,从少到多的次序分为以下六种基本类型:

    1. 机械学习(Rote learning)
      学习者无需任何推理或其它的知识转换,直接吸取环境所提供的信息。如塞缪尔的跳棋程序,纽厄尔和西蒙的LT系统。这类学习系统主要考虑的是如何索引存贮的知识并加以利用。系统的学习方法是直接通过事先编好、构造好的程序来学习,学习者不作任何工作,或者是通过直接接收既定的事实和数据进行学习,对输入信息不作任何的推理。
    2. 示教学习(Learning from instruction或Learning by being told)
      学生从环境(教师或其它信息源如教科书等)获取信息,把知识转换成内部可使用的表示形式,并将新的知识和原有知识有机地结合为一体。所以要求学生有一定程度的推理能力,但环境仍要做大量的工作。教师以某种形式提出和组织知识,以使学生拥有的知识可以不断地增加。这种学习方法和人类社会的学校教学方式相似,学习的任务就是建立一个系统,使它能接受教导和建议,并有效地存贮和应用学到的知识。不少专家系统在建立知识库时使用这种方法去实现知识获取。
    3. 演绎学习(Learning by deduction)
      学生所用的推理形式为演绎推理。推理从公理出发,经过逻辑变换推导出结论。这种推理是"保真"变换和特化(specialization)的过程,使学生在推理过程中可以获取有用的知识。这种学习方法包含宏操作(macro-operation)学习、知识编辑和组块(Chunking)技术。演绎推理的逆过程是归纳推理。
    4. 类比学习 (Learning by analogy)
      利用二个不同领域(源域、目标域)中的知识相似性,可以通过类比,从源域的知识(包括相似的特征和其它性质)推导出目标域的相应知识,从而实现学习。类比学习系统可以使一个已有的计算机应用系统转变为适应于新的领域,来完成原先没有设计的相类似的功能。
      类比学习需要比上述三种学习方式更多的推理。它一般要求先从知识源(源域)中检索出可用的知识,再将其转换成新的形式,用到新的状况(目标域)中去。类比学习在人类科学技术发展史上起着重要作用,许多科学发现就是通过类比得到的。
    5. 基于解释的学习(Explanation-based learning, EBL)
      学生根据教师提供的目标概念、该概念的一个例子、领域理论及可操作准则,首先构造一个解释来说明为什该例子满足目标概念,然后将解释推广为目标概念的一个满足可操作准则的充分条件。EBL已被广泛应用于知识库求精和改善系统的性能
    6. 归纳学习(Learning from induction)
      归纳学习是由教师或环境提供某概念的一些实例或反例,让学生通过归纳推理得出该概念的一般描述。这种学习的推理工作量远多于示教学习和演绎学习,因为环境并不提供一般性概念描述(如公理)。从某种程度上说,归纳学习的推理量也比类比学习大,因为没有一个类似的概念可以作为"源概念"加以取用。归纳学习是最基本的,发展也较为成熟的学习方法,在人工智能领域中已经得到广泛的研究和应用。

    总结

    机器学习最主要的应用领域有:专家系统、认知模拟、规划和问题求解、数据挖掘、网络信息服务、图象识别、故障诊断、自然语言理解、机器人和博弈等领域。
    从机器学习的执行部分所反映的任务类型上看,大部分的应用研究领域基本上集中于以下两个范畴:分类和问题求解。
    (1)分类任务要求系统依据已知的分类知识对输入的未知模式(该模式的描述)作分析,以确定输入模式的类属。相应的学习目标就是学习用于分类的准则(如分类规则)。
    (2)问题求解任务要求对于给定的目标状态,寻找一个将当前状态转换为目标状态的动作序列;机器学习在这一领域的研究工作大部分集中于通过学习来获取能提高问题求解效率的知识(如搜索控制知识,启发式知识等)。

    展开全文
  • IDEA下载以及配置(最全)

    万次阅读 多人点赞 2019-09-17 08:25:36
    IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码...

    IDEA下载以及配置

    IDEA简介

    IDEA 全称 IntelliJ IDEA,是java编程语言开发的集成环境。IntelliJ在业界被公认为最好的java开发工具之一,尤其在智能代码助手、代码自动提示、重构、J2EE支持、各类版本工具(git、svn等)、JUnit、CVS整合、代码分析、 创新的GUI设计等方面的功能可以说是超常的。IDEA是JetBrains公司的产品,这家公司总部位于捷克共和国的首都布拉格,开发人员以严谨著称的东欧程序员为主。它的旗舰版本还支持HTML,CSS,PHP,MySQL,Python等。免费版只支持Python等少数语言

    IDEA下载

    https://www.jetbrains.com

    进入官网进入下载最新版本,在这里选择你要下载的产品,选择 intelli IDEA 然后点进去下载
    在这里插入图片描述
    安装就是确定确定就行了,唯一一个不同如下:
    在这里插入图片描述
    启动IDEA,输入激活码,就启动成功了
    在这里插入图片描述

    基本配置

    创建项目

    点击new project,导入 jdk
    在这里插入图片描述
    创建项目:
    在这里插入图片描述
    IDEA文件目录介绍 :
    在这里插入图片描述

    					bin目录是一些执行和配置相关包
    					help目录帮助文档手册;
    					jre64目录是jre运行支持;
    					lib目录是运行用到的jar包;
    					licenese目录是许可协议;	
    					plugins目录是插件
    					redist目录是一些杂项;
    
    
    					config是你对idea的配置的文件 这个文件保存好,假如其他电脑安装idea,启动的时候可以选择导入你的这个config这样省得再重复配置了;
    					
    					system目录是一些系统缓存文件,日志文件,临时文件,索引文件,包括本地历史文件等等,假如idea遇到运行奇葩问题,请把system文件删除,大多数情况能解决问题;
    
    

    IDEA优化配置,提高启动和运行速度(前提是电脑要好):

    找到 idea 安装盘,及bin文件中找到文件:idea.exe.vmoptions
    在这里插入图片描述
    修改如下:

    在这里插入图片描述

    setting基本配置

    首勾选view里的Toolbar,会出现工具栏一个个小扳手(setting)

    系统主题设置:
    在这里插入图片描述
    设置鼠标悬浮提示
    在Eclipse里,我们鼠标移动到一个类上,会提示这个类的文档解释信息;
    IDEA里默认不会这样,我们需要设置下;Editor->General
    勾选这个选项,参数则是放在单词上停留的时间,我设置的是1秒
    在这里插入图片描述
    显示方法分隔符
    也就是每个方法之间会有分隔符,这样有利于查看代码。
    操作:Editor->General ->Appearance 勾选Show method separators

    忽略大小写提示(重要)
    IDEA默认提示是区分大小写的,比如输入string,不会提示String类;这里设置下
    Editor->General ->Code Completion 把红框里的选项去掉即可
    在这里插入图片描述
    自动导包
    默认情况,包括Eclipse 写完类,是需要手工导入包的,不过IDEA提供了自动导包设置
    Editor->general->Auto Import
    在这里插入图片描述
    设置字体
    Editor->Font
    这里可以根据自己喜好,设置字体样式,字体大小

    配置类文档注释信息模版
    默认新建类 没有文档注释信息,我们一般公司开发,都要搞下,方便找人。
    Editor->File and Code Templates 然后Includes File Header,右框就是你输入的内容

    设置文件编码
    Editor -> File Encodings 统一全部设置utf-8
    在这里插入图片描述

    设置自动编译
    在Eclipse里,项目都是自动编译的,IDEA里默认不是,我们需要配置下;
    Build,Execution,Deployment -> Compiler 两个勾选下,设置项目自动编译,包括平行结构的多个模块也自动编译;勾选这两个即可
    在这里插入图片描述

    快捷方式改成eclipse
    有些人不太适应IDEA的快捷键,所以你也可以根据自己的需要来更改快捷键
    Keymap的下拉框选择eclipse,你也可以选择其他的

    设置默认浏览器
    tools -->web browsers
    在这里插入图片描述
    快捷键介绍:

    alt+shift+s 以及 alt+inster 实现自动生成get set 以及构造方法
    ctrl+d 删除一行
    ctrl+shift+o 导入包
    ctrl+shift+f 代码格式化
    ctrl+shift+y 转换大小写
    ctrl+f 查找(当前文件)
    ctrl+h 全局查找
    双击shift 查找文件
    tab 以及 shift+tab 整体代码向后 向前移动
    alt+/ 提示操作(自定义修改)
    alt+/这个快捷方式被其他地方占用了,所以先去掉;
    根据快捷方式搜索
    

    创建基本项目和配置

    Web项目

    新建一个Web项目
    在这里插入图片描述

    要访问的话,则需要配置tomcat
    在这里插入图片描述
    点击左上角的+号选择Tomcat Server ->Local ,红框里选择你的tomcat版本,name可以为你的tomcat取名字
    在这里插入图片描述
    这里两个都改为update classes and resources的目的是:当你运行后,进行更改里面的代码然后刷新,浏览器中并不会更改,这是因为在配置服务器的时候没有更改规则

    运行Web的index.jsp页面
    在这里插入图片描述

    Maven项目

    Maven项目第一步是配置Maven

    在这里插入图片描述
    选择自己的Maven地址和settings
    然后选择Maven 选择SDK 勾选Create from archetype 选择maven-archetype-webapp点击next

    在这里插入图片描述

    然后输入你的项目名称等点击next。进入这个界面,这里要注意的是directory要选择你刚配的Maven,然后点击下面的+号键
    在这里插入图片描述
    然后添加一对键值对

    Name:archetypeCatelog
    Value:internal
    

    创建成功之后,新建java文件和resources文件(标记为Resources root文件夹)
    在这里插入图片描述
    java文件(创建一个java名字的文件夹专门存放java文件)
    在这里插入图片描述
    替换掉这里的junit
    在这里插入图片描述
    改为,(改完之后记得点一下右下角的import Changes,更新一下)

    <dependency>
    	<groupId>javax.servlet</groupId>
    	<artifactId>javax.servlet-api</artifactId>
    	<version>4.0.1</version>
    	<scope>provided</scope>
    </dependency>
    

    webapp创建一个hello.jsp,mavendamo:

    @WebServlet("/maven")
    public class MavenDemo extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            doPost(req,resp);
        }
    
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
            System.out.println("maven 案例");
            req.getRequestDispatcher("/hello.jsp").forward(req, resp);
        }
    }
    

    设置好tomcat然后开启,地址栏再加上maven测试,如果控制台成功出现Maven案例则说明成功

    jrebel插件

    在servlet中更改打印的值,然后保存,运行一次并不会更改,针对这种情况有两种解决方式:
    第一个则是重启服务
    第二个就是运用jrebel插件

    在settings中 点击Plugins ->Browse repositories按钮,搜索jrebel for intellij 并下载,然后Restart重启即可,重启后,依次File-Setting(或ctrl+alt+s)打开设置,可以看到Jrebel插件已经成功了
    在这里插入图片描述
    这时需要激活jrebel才能使用,打开jrebel 激活面板 ,选择Connect to online licensing service

    激活码:https://jrebel.hexianwei.com/855574b5-211c-4132-8047-1eed68db0020

    在这里插入图片描述

    弄到这里jrebel就可以正常使用了,但jrebel激活之后默认是联网使用的 , 在该模式下 , jrebel会一直联网监测激活信息 . 所以需要调为离线使用的,直接点击下图中Work offline按钮即可

    在这里插入图片描述

    然后启动项目时用jrebel启动就好了,如图:
    在这里插入图片描述

    展开全文
  • 遗传算法

    万次阅读 多人点赞 2019-04-06 21:41:47
    由于自然选择是客观存在的,即生物只能改变自己适应环境,那么在自然选择的过程中,适应度低的个体会被淘汰,适应度高的个体被保留,高适应度的父体与母体又有更高的概率繁衍出适应度高的子代,因此在一代又一代的...

    使用遗传算法求解多峰函数的最大值,是我的一项课程作业,做完之后,顺便把文档整理出来做个记录。全部内容如下:

    1、问题描述

    编程实现遗传算法,并求解多峰函数的最大值。多峰函数的表达式如下所示:
    在这里插入图片描述
    用MATLAB做出函数的图像如下:
    在这里插入图片描述

    2、算法描述及实现

    2.1、遗传算法概述

    遗传算法(GA,Genetic Algorithm),也称为进化算法。遗传算法是受达尔文的进化论的启发,借鉴生物进化过程而提出的一种启发式搜索算法。其主要特点是直接对结构对象进行操作,因此不同于其他求解最优解的算法,遗传算法不存在求导和对函数连续性的限定,采用概率化的寻优方法,不需要确定的规则就能自动获取和指导优化的搜索空间,自适应地调整搜索方向。

    以上是对遗传算法相对抽象的总结,为了更具体形象的解释遗传算法的一般原理,我们首先介绍一些生物学上的概念

    ①种群:不同生物个体形成的群体,生物的进化以群体的形式进行,这样的一个群体称为种群;

    ②个体:组成种群的单个生物;

    ③基因:带有遗传信息的DNA片段,可以通俗的将基因理解为一段信息,这段信息决定的生物个体的性状;

    ④表现型:根据基因形成的个体的外部表现;

    ⑤适应度:生物个体对于生存环境的适应程度,越适应那么其得以存活和繁衍的概率就越大;

    ⑥遗传:通过繁殖过程,子代将从父母双方各获取一部分基因,形成新的自己的基因,这个过程中,会发生基因的复制、交叉,也会以较低的概率发生基因突变;

    ⑦自然选择:物竞天择,适者生存的自然淘汰机制。具体为对环境适应度高的个体参与繁殖的机会比较多,后代就会越来越多。适应度低的个体参与繁殖的机会比较少,后代就会越来越少;

    ⑧进化:种群通过代际繁衍不断适应生存环境的过程,在这个过程中,以对外界环境的适应度为评判标准,生物的性状不断得到改良。

    了解了这些术语的含义,我们就可以进一步说说生物进化的过程了。由于自然选择是客观存在的,即生物只能改变自己去适应环境,那么在自然选择的过程中,适应度低的个体会被淘汰,适应度高的个体被保留,高适应度的父体与母体又有更高的概率繁衍出适应度高的子代,因此在一代又一代的繁衍之后,高适应度的个体在种群中所占的比例越来越大,种群就这样完成了进化。

    现在我们要参考生物进化的过程来设计算法解决求最优解的问题。对此,遗传算法的思路是,将要解决的问题模拟成一个生物进化的过程,通过进化来寻找最优解。以我们题目中寻找多峰函数的最大值这个问题为例

    将(x, y)这一可能的解作为一个个体;将多峰函数的函数值f(x, y)作为个体的适应度;对(x, y)进行编码作为个体的基因;以适应度为标准不断筛选生物个体;通过遗传算子(如复制、交叉、变异等)不断产生下一代。如此不断循环迭代,完成进化。最终,根据设定的迭代次数,可得到最后一代种群,该种群中的个体适应度都较高,而多峰函数的最大值就有比较大的概率存在于这一群解中,以种群中适应度最高的个体作为问题的解,则可以说该解有比较高的概率就是我们希望求得的最优解。

    文字述说终究还是不如图表好理解,因此还是看图吧(下图将本题与自然遗传联系了起来):
    在这里插入图片描述
    通过以上描述,我们不难看出,遗传算法不能保证一定能求得最优解,而只能以一定的概率求最优解。但是使用遗传算法时,我们可以不用关心具体如何去找最优解,要做的只是简单的否定一些表现不好的个体。这一优点也是遗传算法能够取得广泛应用的原因之一。

    2.2、算法的流程

    通过上文的阐述,对于如何模拟自然进化来求题中多峰函数的最优解已经比较明晰了。这里我将列出遗传算法的主要步骤,并一一解析:

    第一步:随机产生一个种群,作为问题的初代解(通常,初代解可能与最优解相差较大,这是可以容忍的,只要保证初代解是随机产生的,以确保个体基因的多样性即可);

    第二步:寻找一种合适的编码方案对种群中的个体进行编码,可以选择如浮点数编码或二进制编码等常用编码方案(需要指出的是,不同的编码方案直接影响后续遗传算子的实现细节);

    第三步:以多峰函数的函数值 作为个体的适应度,计算种群中每个个体的适应度(算出的适应度将为后续的个体选择提供依据);

    第四步:根据适应度的高低选择参与繁衍的父体与母体,选择的原则是适应度越高的个体越可能被选中(以此不断淘汰适应度低的个体);

    第五步:对被选出的父体与母体执行遗传操作,即复制父体与母体的基因,并采用交叉、变异等算子产生出子代(在较大程度保留优秀基因的基础上,变异增加了基因的多样性,从而提高找到最优解的概率);

    第六步:根据一定的准则判断是继续执行算法,还是找出所有子代中适应度最高个体作为解返回并结束程序(判断的准则可以是设定的解的阈值、指定的迭代次数等)。
    在这里插入图片描述

    2.3、算法的编码实现

    2.3.1、编码

    本文采用的是二进制编码方式,这种编码方式编解码过程简单易行,相应的交叉算子、变异算子等操作用位运算即可实现。当然,它也有一定的缺点,比如连续性不够强。为保证求解的精度,本文使用14个bit为 编码,使用11个bit为 编码,两者组合成25个bit的最终结果。不难算出,该方式的编码精度可达千分位。具体的编码操作可总结为,将 或 的取值区间映射到0~2n-1这一整数范围,其中n表示编码位数, 或 在其取值区间的某点,相应的映射到整数区间中的某点,改点即为 或 的基因编码。程序如下:

    /*
        基因编码
        gene1       输入型参数,待编码的基因段1
        gene2       输入型参数,待编码的基因段2
        gene_code   输出型参数,基因编码
    
        返回值:当输入的基因不符合要求时返回false,否则返回true
    */
    static bool gene_encode(const double gene1, const double gene2, unsigned int *gene_code)
    {
        /* 判断基因是否合法 */
        if (!is_gene_legal(gene1, gene2))
            return false;
    
        /* 若基因合法则对其进行编码 */
        unsigned int gene1_code = (gene1 - GENE1_RANGE_LEFT) * (GENE1_CODE_MAX - 1) / (GENE1_RANGE_RIGHT - GENE1_RANGE_LEFT);
        unsigned int gene2_code = (gene2 - GENE2_RANGE_LEFT) * (GENE2_CODE_MAX - 1) / (GENE2_RANGE_RIGHT - GENE2_RANGE_LEFT);
        
        /* 组合基因片段 */
        *gene_code = (gene1_code << 11) | gene2_code;
    
        return true;
    }
    

    2.3.2、解码

    解码是编码的逆过程,无需赘述,程序如下:

    /*
        基因解码
        gene_code   输入型参数,基因编码
        gene1       输出型参数,解码后的基因段1
        gene2       输出型参数,解码后的基因段2
    
        返回值:当输入的基因编码不符合要求时返回false,否则返回true
    */
    static bool gene_decode(const unsigned int gene_code, double *gene1, double *gene2)
    {
        /* 判断基因编码是否合法 */
        if (!is_gene_code_legal(gene_code))
            return false;
    
        /* 若基因编码合法则对其进行解码 */
        unsigned int gene1_code = GET_GENE1_CODE(gene_code);
        unsigned int gene2_code = GET_GENE2_CODE(gene_code);
    
        *gene1 = (double)gene1_code * (GENE1_RANGE_RIGHT - GENE1_RANGE_LEFT) / (GENE1_CODE_MAX - 1) + GENE1_RANGE_LEFT;
        *gene2 = (double)gene2_code * (GENE2_RANGE_RIGHT - GENE2_RANGE_LEFT) / (GENE2_CODE_MAX - 1) + GENE2_RANGE_LEFT;
    
        return true;
    }
    

    2.3.3、计算适应度

    适应度函数也称评价函数,通常用于区分群体中个体好坏的标准。适应度高的,也就是优秀的个体有更大的几率参与繁衍,遗传自己的基因。一般的,适应度函数根据目标函数来确定,有时候直接将目标函数值作为适应度。这里,考虑到待求解的多峰函数,尖峰分布密集而且峰的直径很窄,这不利于遗传算法的收敛,因此本文不直接将多峰函数值作为适应度,而是利用对数函数将多峰函数进行平缓,并将平缓后的函数值作为目标函数。具体做法是,将多峰函数进行两次求对数,因此,多峰函数与适应度的关系可如下表示:
    在这里插入图片描述
    用MATLAB做出适应度函数图像如下:
    在这里插入图片描述
    对比前文中的图不难看出,图像得到了有效的平缓,同时不同峰之间也保持着一定的高低之别。值得一提的是,这里更主要的是给出优化遗传算法的一个思路,即可以在适应度函数上做文章。本题的适应度函数只是对多峰函数本身做了一个简单的变换,读者不妨思考一下,就本题而言有没有什么非常好的适应度函数。

    据上文所述,适应度求值函数如下:

    /*
        多峰函数:z = 21.5 + x *sin(4 * 3.1415926 * x) + y * sin(20 * 3.1415926 * y)
        适 应 度:log(log(z))
        约    束:-3.0 <= x <= 12.1; 4.1 <= y <= 5.8
        精    度:精确到千分位
    */
    double get_fitness(const double x, const double y)
    {
        return log(log(21.5 + x * sin(4 * PI * x) + y * sin(20 * PI * y)));
    }
    

    2.3.4、选择算子

    本文的选择算法采用了非常常用的“轮盘赌算法”,赌盘算法的原理非常简单明了。创建赌盘时,我们将种群中所有个体的适应度求和,不妨将得到的结果称为总和适应度。然后,将每个个体的适应度除以总和适应度,然后将得到的商逐个累加,每加一次就得到赌盘的一个边界,累加完成后总和为1。如下的饼状图可以更形象的表明赌盘的原理:
    在这里插入图片描述
    由上文所述,赌盘创建函数可如下编写:

    /*
        创建赌盘
        ga      遗传算法器指针
    */
    static void create_roulette(GA *ga)
    {
        /* 计算赌盘中的概率 */
        ga->roulette[0] = ga->fitness[0] / ga->sum_fitness;
    
        for (int num = 1; num < ga->population_num - 1; num++)
        {
            ga->roulette[num] = ga->roulette[num - 1] + ga->fitness[num] / ga->sum_fitness;
        }
    
        ga->roulette[ga->population_num - 1] = 1.0;
    }
    

    再回到选择算子,选择算子需要赌盘作为基础,其运行时,会产生一个0到1的随机数,然后在赌盘中找到该数所在的区间,这个区间对应的个体即为被选中的个体。因此,适应度越高的个体被选中的几率越大,这是合理的。当然,也存在较小的概率选出适应度较低的个体,为了避免这种情况,本文引入了竞争机制,即一次选择的过程选出2个个体,再取其中适应度较高的那个个体,具体的程序如下:

    /*
        基因选择函数
        ga      遗传算法器指针
        返回值:返回使用轮盘赌的方式选出的个体(编号)
        说  明:选择策略为轮盘赌+随机竞争
    */
    static unsigned int select(GA *ga)
    {
        unsigned int index1 = 0, index2 = 0;
    
        /* 产生一个[0.0, 1.0]之间的浮点数 */
        double selector1 = rand() * 1.0 / RAND_MAX;
        double selector2 = rand() * 1.0 / RAND_MAX;
    
        /* 找出被选中的个体的索引 */
        for (; selector1 > ga->roulette[index1]; index1++);
        for (; selector2 > ga->roulette[index2]; index2++);
    
        return (ga->fitness[index1] > ga->fitness[index2] ? index1 : index2);
    }
    

    2.3.5、交叉算子

    遗传算法的交叉操作实质上是按某种方式交换父体和母体的部分基因,常见的交叉算子有单点交叉、两点交叉、多点交叉、均匀交叉及算术交叉等。本文选用两点交叉法,实现过程既不复杂,也有较好的随机性,该方法可由下图示意:
    在这里插入图片描述
    图中虚线指出的两个交叉点是随机产生的。具体程序如下:

    /*
        交叉函数
        ga          遗传算法器指针
        one         输出型参数,待交叉基因
        another     输出型参数,待交叉基因
        说明:
        1.对传入的基因编码执行两点交叉操作
    */
    static void cross(GA *ga, unsigned int *one, unsigned int *another)
    {
        /* 1.随机产生两个交叉点的位置 */
        unsigned char pos1 = rand() % GENE_CODE_LENGTH + 1;
        unsigned char pos2 = rand() % GENE_CODE_LENGTH + 1;
        unsigned char min_pos = min(pos1, pos2);
        unsigned char max_pos = max(pos1, pos2);
    
        /* 2.截出需要交换的基因段 */
        unsigned int one_gene_seg = get_bits(*one, min_pos, max_pos) << (min_pos - 1);
        unsigned int another_gene_seg = get_bits(*another, min_pos, max_pos) << (min_pos - 1);
        unsigned int mask = ~(get_bits(~(0U), min_pos, max_pos) << (min_pos - 1));
    
        /* 3.执行交叉操作 */
        *one = (*one & mask) | another_gene_seg;
        *another = (*another & mask) | one_gene_seg;
    }
    

    2.3.6、变异算子

    在自然界中,基因变异可以增加个体的多样性,这对于遗传算法来说是增加了个体的随机性,可以增加找到最优解的概率。本文采用的变异算子所做的操作是随机选择基因的某一位进行反转,程序如下:

    /*
        变异函数
        gene_code       输入型参数
        说明:
        1.对传入的基因编码执行变异操作
        2.随机选择基因编码中的一位做反转操作
    */
    static void mutate(unsigned int *gene_code)
    {
        unsigned int mutate_bit = 1 << (rand() % GENE_CODE_LENGTH);
        *gene_code ^= mutate_bit;
    }
    

    2.3.7、繁殖函数及进化函数

    遗传算法的主要算子都在上文中分析过了,下面要做的就是根据遗传算法的流程将这些算子整合起来以实现算法功能。在本文中,这其中涉及到两个关键的函数,即繁殖函数和进化函数。繁殖函数包括基因的复制、交叉及变异,同时本文还采用了子代竞争策略,即父代产生的两个子代个体仅保留适应度最高的,程序如下:

    /*
        繁殖函数
        ga       遗传算法器指针
        father   从种群中选出的父体
        mother   从种群中选出的母体
        返回值:  适应度最高的子代的基因编码
        说明: 
        1.一对父体与母体将繁殖出一对子代
        2.选择出适应性更好的子代返回
    */
    static unsigned int inherit(GA *ga, unsigned int father, unsigned int mother)
    {
        unsigned int son1 = ga->gene_code[father];
        unsigned int son2 = ga->gene_code[mother];
    
        /* 1.交叉 */
        cross(ga, &son1, &son2);
    
        /* 2.变异 */
        mutate(&son1);
        mutate(&son2);
    
        /* 3.子代竞争 */
        double son1_gene1, son1_gene2, son2_gene1, son2_gene2;
        gene_decode(son1, &son1_gene1, &son1_gene2);
        gene_decode(son2, &son2_gene1, &son2_gene2);
    
        return (ga->get_fitness(son1_gene1, son1_gene2) > ga->get_fitness(son2_gene1, son2_gene2)) ? son1 : son2;
    }
    

    进化函数则实现了遗传算法的一次完整的迭代过程,根据上文给出的遗传算法流程图,不难进行如下编码:

    /*
        进化函数
        ga      遗传算法器指针
    */
    static void evolve(GA *ga)
    {
        /* 1.申请暂存子代基因编码的内存 */
        unsigned int *descendants = (unsigned int *)calloc(ga->population_num, sizeof(unsigned int));
        
        /* 2.精英保留(将上一代中适应度最高的个体的基因编码保留) */
        descendants[0] = ga->gene_code[ga->best_individual];
        
        /* 3.选择合适的父体与母体 */
        unsigned int father = select(ga);
        unsigned int mother = select(ga);
    
        /* 4.繁殖(包含交叉与变异) */
        for (int num = 1; num < ga->population_num; num++)
            descendants[num] = inherit(ga, father, mother);
    
        /* 5.将子代记录到ga中并进行基因解码(使新一代的基因编码与基因对应) */
        for (int num = 0; num < ga->population_num; num++)
        {
            ga->gene_code[num] = descendants[num];
            gene_decode(ga->gene_code[num], &ga->gene[num].gene1, &ga->gene[num].gene2);
        }
        
        /* 5.更新种群适应度 */
        fit(ga);
        
        /* 6.更新赌盘 */
        create_roulette(ga);
    
        /* 7.释放之前申请的空间 */
        free(descendants);
    }
    

    3、运行结果及分析

    至此,本文已经给出了一个遗传算法的C语言实现的所有关键程序。下面就调用编写的遗传算法进行测试。本文将创建含有100个个体的种群,并进行100代迭代以求解多峰函数的最大值,一次完整的调用本文实现的遗传算法的程序如下所示:

    /* 创建遗传算法器 */
    GA *ga = create_ga(get_fitness, 100);
    
    /* 初始化遗传算法器 */
    ga->init(ga);
    
    /*迭代100代*/
    for (int i = 0; i < 100; i++)
    ga->evolve(ga);
    
    /*销毁遗传算法器*/
    delete_ga(ga);
    

    经多次调用测试,算法执行的结果较为稳定,所得的多峰函数最大值大多在38以上,多次运行结果中最好的解为38.849744,对应的坐标为(11.625331, 5.725256)。将迭代求得的最大值用MATLAB作图如下:
    在这里插入图片描述
    为验证是否找到了最优解,用MATLAB遍历求出该多峰函数在给定定义域内的最大值为38.8501,与本文求出的结果相差0.000356,可见本文实现的遗传算法表现还不算太差。

    文中给出的程序比较散,这里给出完整程序的下载链接

    展开全文
  • 近期总结一一些面试题 都是企业的面试题笔记题 感觉薪资10k下的都会出笔试题 ...同时分享一个自己录制的CSS3动画特效经典案例【推荐教程】--后期会更新vue框架 微信小程序等内容。 https://ke.qq.com/cou...
  • 测试开发笔记

    万次阅读 多人点赞 2019-11-14 17:11:58
    2、负责修改用户代表发现的问题 测试人员: 1、检查或协助用户填写缺陷报告 2、向用户学习相关的使用关注点 邀请的用户或客户代表(付费) 1、按照自己的操作习惯使用软件,提出易用性等方面的问题和改进建议 明确...
  • 适应环境

    千次阅读 2007-12-29 19:29:00
    不知不觉来上海已经三个星期了。来这里开始确实不适应,住的地方是我长这么大住过的地方中最烂的...我们都在努力的适应周围的环境。我们以前在学校都是做WEB的,现在都改做嵌入式,而且做得不是应用是操作系统,中国仅
  • 文章目录 @[toc] 从鸟群觅食行为到粒子群算法 粒子群算法的核心 例 : 求解函数最小值 ...总体来说,粒子群算法是一种较大概率收敛于全局最优解的,适合在动态、多目标优化环境中寻优的一种高效率的群体智能算法。
  • 遗传算法(一) 遗传算法的基本原理

    千次阅读 多人点赞 2020-02-03 22:25:13
    适应度(fitness):度量某个物种对于生存环境适应程度。 选择(selection):以一定的概率从种群中选择若干个个体。一般,选择过程是一种基于适应度的优胜劣汰的过程。 复制(reproduction):细胞分裂时,遗传物质...
  • SpringCloud面试题

    万次阅读 多人点赞 2018-12-12 00:29:07
    而SpringCloud目前是国外比较流行,当然我觉得国内的市场也会慢慢的偏向SpringCloud,就连刘军作为Dubbo重启的负责人也发表过观点,Dubbo的发展方向是积极适应SpringCloud生态,并不是起冲突 3.Rest和RPC对比 其实...
  • 职场小白想要快速适应职场环境,需要做到以下几点?   1,明确任务需求 作为职场人,肯定会接到工作任务,很多工作效率不高往往是因为前期的沟通工作不到位。当我们接到工作任务的第一反应就是想尽快的把它完成...
  • 深度强化学习1——强化学习到深度强化学习

    万次阅读 多人点赞 2018-10-05 22:04:43
    与迁移学习结合,适应不同环境 硬件提升 融合更多的模型学习,充分利用样本 自主设定奖励函数 个人相关深度强化学习github地址: https://github.com/demomagic 下一篇我们将深入讲解强化学习的必备...
  • 如何快速适应mac环境开发

    千次阅读 2017-05-14 23:18:38
    下边是些能你快速适应环境的建议,老鸟就不用看了 如果你是开发老手,也可以把自己使用的心得,或者好的窍门软件,在底下留言一下不胜感激,大家也能受益学习一下嘛,分享精神。 谷歌浏览器,qq什么的常用基本...
  • 红外线测温仪方案开发

    千次阅读 2020-02-24 10:28:25
    红外线测温仪方案开发    额温枪(红外线测温仪)针对量测人体额温基准设计,...若转换使用环境温度变化过大时,需将本测量器放置于欲测量的环境20分钟,待其稳定适应环境温度后再使用,便可测得更精准之数值。
  • 在我们学习某一门语言初始,我们最先做的就是环境的搭建。相对于PHP开发语言言来说,其环境的搭建已经不是很复杂了,这主要得益于现在越来越多的集成环境发布。本篇博文主要为大家列举一系列国内外知名优秀PHP集成...
  • 适应(domain adaptation)

    千次阅读 2021-05-22 08:52:44
    文章目录导读前言域适应类别任务相关性一步域适应技术及其应用基于散度的域适应基于对抗的域适应基于重建的域适应结论 导读 在迁移学习中, 当源域和目标的数据分布不同 ,但两个任务相同时,这种特殊的迁移学习叫做...
  • 强化学习环境搭建

    千次阅读 2019-04-30 17:16:40
    强化学习环境搭建强化学习简介环境安装Anaconda安装安装DockerDocker介绍Docker安装OpenAI Gym安装Universe安装测试 Gym 和 Universe 强化学习简介 强化学习算法的大概流程 1.1. 智能体通过行为的选择与执行...
  •  1:同一个色块的任意点都能延伸到自己的色块的所有成员,并且不会多,不会少。  2:色块内所有点都到色块任意点的色差是个渐变过程  3:色块之间的相对性与色块衔接成员变异相对性一致。   上面是...
  • 如何搭建软件测试环境

    千次阅读 多人点赞 2021-02-18 21:19:05
    如何搭建软件测试环境
  • [新手坑] 02.Vue开发环境和生产环境...前阵子做的一个小项目, 引入了Vant的UI库, 外加自己写的很多样式, 在开发环境下测试完美, 直接就build出来上正式环境, 发现竟然有多处样式未生效的问题! 还好是新项目, 尚未推...
  • 本文针对小白用户对App做一个简单的介绍,介绍了App都有哪些类型,不同的类型app开发需要哪些技术,用户可以根据自己的需求选择不同的App开发,若不懂技术,没有资金怎么开发app。 一 、App有哪些形式? ...
  • 此篇教程参考自TensorFlow 2.0 + Keras Crash Course,在原文的基础上进行了适当的总结与改编,以适应于国内开发者的理解与使用,水平有限,如果写的不对的地方欢迎大家评论指出。觉得文章有用的话麻烦点赞,想看...
  • 远程全方位环境监测无人机系统

    千次阅读 2019-08-01 01:52:00
    随着我国城市化、工业化进程的迅速推进,人民生活水平的快速提高,国家与社会开始越来越关注周边环境的保护。当前,我国多地区面临大气环境质量改善巨大压力。国务院也相继印发了《打赢蓝天保卫战三年行动计划》《水...
  • 刚入职新公司的第一周应该是比较紧张的,因为第一周算是我们熟悉的时间,到第二周有可能就要开始做项目了,甚至有的节奏快的公司也就你熟悉个两三天后就开始干活了。那么在这短短的几天的时间里,我...
  • 20款知名PHP集成环境推荐与优缺点分析、php环境大全推荐(PHP环境搭建包)、PHP环境搭建、PHP集成环境搭建,最好用的20个php环境搭建工具推荐
  • 环境转变的心理适应---心态的转变

    千次阅读 2010-10-09 23:59:00
    人对于环境变化的适应是需要时间的心理反应--这种心理反应是顺着时间轴的心态转变。 习惯了的环境能够给人带来良好的心态,而这种心态作为基础,能够生活五彩缤纷。
  • 接下来,本文将带你开启 Vue.js 实战开发的第一步:搭建你的开发环境。 搭建项目前需要做的准备 子曰:工欲善其事,必先利其器。要做好一件事,准备工作是少不了的。 在做 Vue.js 开发时,大家需要了解并安装以下...
  • Python 虚拟环境 看这一篇就够了

    千次阅读 多人点赞 2020-06-02 13:07:32
    强大的软件库,开发者将精力集中在业务上,而避免重复造轮子的浪费。但众多的软件库,形成了复杂的依赖关系,加上 Python2 和 Python3 旷日持久之争,对采用 Python 开发的项目造成了不少困扰,所以 Python 建议,...
  • 一、感觉适应 “入芝兰之室,久而不觉其香;入鲍鱼之肆,久而不闻其臭。”刚走进花园,你会闻到一股花香味,但过了几分钟,就闻不到了。这种现象就是感觉适应。由于刺激对感受器的持续作用从而使感受性...
  • 假想你要为一种癌症疾病建立一个分类器,然后你收集了很多病人的材料,然后到学校里面鼓励学生贡献自己的血样作为自己的健康样本。好的,然后开始设计算法训练得到了一个预测准确率非常高的分类模型。但是注意,收集...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 202,682
精华内容 81,072
关键字:

如何让自己适应环境