我们专注攀枝花网站设计 攀枝花网站制作 攀枝花网站建设
成都网站建设公司服务热线:400-028-6601

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

最优适应算法java代码,最佳适应算法例题讲解

java软件开发的代码规范

1、组织与风格

创新互联建站-专业网站定制、快速模板网站建设、高性价比吉利网站开发、企业建站全套包干低至880元,成熟完善的模板库,直接使用。一站式吉利网站制作公司更省心,省钱,快速模板网站建设找我们,业务覆盖吉利地区。费用合理售后完善,十多年实体公司更值得信赖。

(1).关键词和操作符之间加适当的空格。

(2).相对独立的程序块与块之间加空行

(3).较长的语句、表达式等要分成多行书写。

(4).划分出的新行要进行适应的缩进,使排版整齐,语句可读。

(5).长表达式要在低优先级操作符处划分新行,操作符放在新行之首。

(6).循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分。

(7).若函数或过程中的参数较长,则要进行适当的划分。

(8).不允许把多个短语句写在一行中,即一行只写一条语句。

(9).函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格。

注:如果大家有兴趣可以到安安DIY创作室博客,有相关说明性的文章和解释。

2、注解

Java 的语法与 C++ 及为相似,那么,你知道 Java 的注释有几种吗?是两种?

// 注释一行

/* ...... */ 注释若干行

不完全对,除了以上两种之外,还有第三种,文档注释:

/** ...... */ 注释若干行,并写入 javadoc 文档

注释要简单明了。

String userName = null; //用户名

边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。

在必要的地方注释,注释量要适中。注释的内容要清楚、明了,含义准确,防止注释二义性。

保持注释与其描述的代码相邻,即注释的就近原则。

对代码的注释应放在其上方相邻位置,不可放在下面。对数据结构的注释应放在其上方相邻位置,不可放在下面;对结构中的每个域的注释应放在此域的右方;

同一结构中不同域的注释要对齐。

变量、常量的注释应放在其上方相邻位置或右方。

全局变量要有较详细的注释,包括对其功能、取值范围、哪些函数或过程存取它以及存取时注意事项等的说明。

在每个源文件的头部要有必要的注释信息,包括:文件名;版本号;作者;生成日期;模块功能描述(如功能、主要算法、内部各部分之间的关系、该文件与其它文件关系等);主要函数或过程清单及本文件历史修改记录等。

/**

* Copy Right Information : Neusoft IIT

* Project : eTrain

* JDK version used : jdk1.3.1

* Comments : config path

* Version : 1.01

* Modification history :2003.5.1

* Sr Date Modified By Why What is modified

* 1. 2003.5.2 Kevin Gao new

**/

在每个函数或过程的前面要有必要的注释信息,包括:函数或过程名称;功能描述;输入、输出及返回值说明;调用关系及被调用关系说明等

/**

* Description :checkout 提款

* @param Hashtable cart info

* @param OrderBean order info

* @return String

*/

public String checkout(Hashtable htCart,

OrderBean orderBean)

throws Exception{

}

javadoc注释标签语法

@author 对类的说明 标明开发该类模块的作者

@version 对类的说明 标明该类模块的版本

@see 对类、属性、方法的说明 参考转向,也就是相关主题

@param 对方法的说明 对方法中某参数的说明

@return 对方法的说明 对方法返回值的说明

@exception 对方法的说明 对方法可能抛出的异常进行说明

3、命名规范

定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失。(这些规范并不是一定要绝对遵守,但是一定要让程序有良好的可读性)较短的单词可通过去掉元音形成缩写;要不然最后自己写的代码自己都看不懂了,那可不行。

较长的单词可取单词的头几发符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。

使用匈牙利表示法

Package 的命名

Package 的名字应该都是由一个小写单词组成。

package com.neu.util

Class 的命名

Class 的名字必须由大写字母开头而其他字母都小写的单词组成,对于所有标识符,其中包含的所有单词都应紧靠在一起,而且大写中间单词的首字母。

public class ThisAClassName{}

Class 变量的命名

变量的名字必须用一个小写字母开头。后面的单词用大写字母开头

userName , thisAClassMethod

Static Final 变量的命名

static Final 变量的名字应该都大写,并且指出完整含义。

/**

*DBConfig PATH

**/

public static final String

DB_CONFIG_FILE_PATH =com.neu.etrain.dbconfig;

参数的命名

参数的名字必须和变量的命名规范一致。

数组的命名

数组应该总是用下面的方式来命名:

byte[] buffer;

而不是:

byte buffer[];

方法的参数

使用有意义的参数命名,如果可能的话,使用和要赋值的字段一样的名字:

SetCounter(int size){

this.size = size;

}

4、文件样式

所有的 Java(*.java) 文件都必须遵守如下的样式规则:

版权信息

版权信息必须在 java 文件的开头,比如:

/*

* Copyright ? 2000 Shanghai XXX Co. Ltd.

* All right reserved.

*/

其他不需要出现在 javadoc 的信息也可以包含在这里。

Package/Imports

package 行要在 import 行之前,import 中标准的包名要在本地的包名之前,而且按照字母

顺序排列。如果 import 行中包含了同一个包中的不同子目录,则应该用 * 来处理。

package hotlava.net.stats;

import java io.*;

import java.util.Observable;

import hotlava.util.Application;

这里 java。io.* 使用来代替InputStream and OutputStream 的。

Class

接下来的是类的注释,一般是用来解释类的。

/**

* A class representing a set of packet and byte counters

* It is observable to allow it to be watched, but only

* reports changes when the current set is complete

*/

接下来是类定义,包含了在不同的行的 extends 和 implements

public class CounterSet

extends Observable

implements Cloneable

Class Fields

接下来是类的成员变量:

/**

* Packet counters

*/

protected int[] packets;

public 的成员变量必须生成文档(JavaDoc)。proceted、private和 package 定义的成

员变量如果名字含义明确的话,可以没有注释。

存取方法

接下来是类变量的存取的方法。它只是简单的用来将类的变量赋值获取值的话,可以简单的

写在一行上。

/**

* Get the counters

* @return an array containing the statistical data. This array has been

* freshly allocated and can be modified by the caller.

*/

public int[] getPackets() { return copyArray(packets, offset); }

public int[] getBytes() { return copyArray(bytes, offset); }

public int[] getPackets() { return packets; }

public void setPackets(int[] packets) { this.packets = packets; }

其它的方法不要写在一行上

构造函数

接下来是构造函数,它应该用递增的方式写(比如:参数多的写在后面)。

访问类型 (public, private 等.) 和 任何 static, final 或 synchronized 应该在一行

中,并且方法和参数另写一行,这样可以使方法和参数更易读。

public

CounterSet(int size){

this.size = size;

}

克隆方法

如果这个类是可以被克隆的,那么下一步就是 clone 方法:

public

Object clone() {

try {

CounterSet obj = (CounterSet)super.clone();

obj.packets = (int[])packets.clone();

obj.size = size;

return obj;

}catch(CloneNotSupportedException e) {

throw new InternalError(Unexpected CloneNotSUpportedException: +

e.getMessage());

}

}

类方法

下面开始写类的方法:

/**

* Set the packet counters

* (such as when restoring from a database)

*/

protected final

void setArray(int[] r1, int[] r2, int[] r3, int[] r4)

throws IllegalArgumentException

{

//

// Ensure the arrays are of equal size

//

if (r1.length != r2.length || r1.length != r3.length || r1.length != r4.length)

throw new IllegalArgumentException(Arrays must be of the same size);

System.arraycopy(r1, 0, r3, 0, r1.length);

System.arraycopy(r2, 0, r4, 0, r1.length);

}

toString 方法

无论如何,每一个类都应该定义 toString 方法:

public

String toString() {

String retval = CounterSet: ;

for (int i = 0; i data.length(); i++) {

retval += data.bytes.toString();

retval += data.packets.toString();

}

return retval;

}

}

main 方法

如果main(String[]) 方法已经定义了, 那么它应该写在类的底部.

5、代码可读性

避免使用不易理解的数字,用有意义的标识来替代。

不要使用难懂的技巧性很高的语句。

源程序中关系较为紧密的代码应尽可能相邻。

6、代码性能

在写代码的时候,从头至尾都应该考虑性能问题。这不是说时间都应该浪费在优化代码上,而是我们时刻应该提醒自己要注意代码的效率。比如:如果没有时间来实现一个高效的算法,那么我们应该在文档中记录下来,以便在以后有空的时候再来实现她。

不是所有的人都同意在写代码的时候应该优化性能这个观点的,他们认为性能优化的问题应该在项目的后期再去考虑,也就是在程序的轮廓已经实现了以后。

不必要的对象构造

不要在循环中构造和释放对象

使用 StringBuffer 对象

在处理 String 的时候要尽量使用 StringBuffer 类,StringBuffer 类是构成 String 类的基础。

String 类将 StringBuffer 类封装了起来,(以花费更多时间为代价)为开发人员提供了一个安全的接口。当我们在构造字符串的时候,我们应该用 StringBuffer 来实现大部分的工作,当工作完成后将 StringBuffer 对象再转换为需要的 String 对象。比如:如果有一个字符串必须不断地在其后添加许多字符来完成构造,那么我们应该使用StringBuffer 对象和她的 append() 方法。如果我们用 String 对象代替StringBuffer 对象的话,会花费许多不必要的创建和释放对象的 CPU 时间。大家可以来安安DIY创作室一起讨论。

避免太多的使用 synchronized 关键字避免不必要的使用关键字 synchronized,应该在必要的时候再使用她,这是一个避免死锁的好方法。

7、编程技巧

byte 数组转换到 characters

为了将 byte 数组转换到 characters,你可以这么做:

Hello world!.getBytes();

Utility 类

Utility 类(仅仅提供方法的类)应该被申明为抽象的来防止被继承或被初始化。

初始化

下面的代码是一种很好的初始化数组的方法:

objectArguments = new Object[] { arguments };

枚举类型

JAVA 对枚举的支持不好,但是下面的代码是一种很有用的模板:

class Colour {

public static final Colour BLACK = new Colour(0, 0, 0);

public static final Colour RED = new Colour(0xFF, 0, 0);

public static final Colour GREEN = new Colour(0, 0xFF, 0);

public static final Colour BLUE = new Colour(0, 0, 0xFF);

public static final Colour WHITE = new Colour(0xFF, 0xFF, 0xFF);

}

这种技术实现了RED, GREEN, BLUE 等可以象其他语言的枚举类型一样使用的常量。

他们可以用 '==' 操作符来比较。

但是这样使用有一个缺陷:如果一个用户用这样的方法来创建颜色 BLACK new Colour(0,0,0)

那么这就是另外一个对象,'=='操作符就会产生错误。她的 equal() 方法仍然有效。由于这个原因,这个技术的缺陷最好注明在文档中,或者只在自己的包中使用。

8、编写格式

代码样式

代码应该用 unix 的格式,而不是 windows 的(比如:回车变成回车+换行)

文档化

必须用 javadoc 来为类生成文档。不仅因为它是标准,这也是被各种 java 编译器都认可的方法。使用 @author 标记是不被推荐的,因为代码不应该是被个人拥有的。

缩进

缩进应该是每行2个空格. 不要在源文件中保存Tab字符. 在使用不同的源代码管理工具时Tab字符将因为用户设置的不同而扩展为不同的宽度.如果你使用 UltrEdit 作为你的 Java 源代码编辑器的话,你可以通过如下操作来禁止保存Tab字符, 方法是通过 UltrEdit中先设定 Tab 使用的长度室2个空格,然后用 Format|Tabs to Spaces 菜单将 Tab 转换为空格。

页宽

页宽应该设置为80字符. 源代码一般不会超过这个宽度, 并导致无法完整显示, 但这一设置也可以灵活调整. 在任何情况下, 超长的语句应该在一个逗号或者一个操作符后折行. 一条语句折行后, 应该比原来的语句再缩进2个字符.

{} 对

{} 中的语句应该单独作为一行. 例如, 下面的第1行是错误的, 第2行是正确的:

if (i0) { i ++ }; // 错误, { 和 } 在同一行

if (i0) {

i ++

}; // 正确, { 单独作为一行

} 语句永远单独作为一行.如果 } 语句应该缩进到与其相对应的 { 那一行相对齐的位置。

括号

左括号和后一个字符之间不应该出现空格, 同样, 右括号和前一个字符之间也不应该出现空格. 下面的例子说明括号和空格的错误及正确使用:

CallProc( AParameter ); // 错误

CallProc(AParameter); // 正确

不要在语句中使用无意义的括号. 括号只应该为达到某种目的而出现在源代码中。下面的例子说明错误和正确的用法:

if ((I) = 42) { // 错误 - 括号毫无意义

if (I == 42) or (J == 42) then // 正确 - 的确需要括号

9、代码编译

1.编写代码时要注意随时保存,并定期备份,防止由于断电、硬盘损坏等原因造成代码丢失。

2.同一项目组内,最好使用相同的编辑器,并使用相同的设置选项。

3.合理地设计软件系统目录,方便开发人员使用。

4.打开编译器的所有告警开关对程序进行编译。

5.在同一项目组或产品组中,要统一编译开关选项。

6.使用工具软件(如Visual SourceSafe)对代码版本进行维护。如果大家有不明白的可以到安安DIY创作室留言。

10、可移植性

Borland Jbulider 不喜欢 synchronized 这个关键字,如果你的断点设在这些关键字的作用域内的话,调试的时候你会发现的断点会到处乱跳,让你不知所措。除非必须,尽量不要使用。

换行

如果需要换行的话,尽量用 println 来代替在字符串中使用\n。

你不要这样:

System.out.print(Hello,world!\n);

要这样:

System.out.println(Hello,world!);

或者你构造一个带换行符的字符串,至少要象这样:

String newline = System.getProperty(line.separator);

System.out.println(Hello world + newline);

PrintStream

PrintStream 已经被不赞成(deprecated)使用,用 PrintWrite 来代替它。

求一个java或c++程,最好是java的。需要能运行,代码尽量详细,最好有说明,通过一定追加分数!

时间比较有限,所以给你一个java多线程的程序,可以将该程序看做是分时系统中线程的运行。已经测试过了,能运行,可以改变参数,或者添加线程来实现更难的问题。悬赏分才5分啊,呵呵,有点低了,不是有点,是相当低了....

public class ThreadTwo extends Thread

{

private String str;

private int delayTime;

public ThreadTwo(String s,int time)

{

str=s;

delayTime=time;

}

public void run()

{

try

{

for(;;)

{

System.out.print(str+" ");

Thread.sleep(delayTime);

}

}

catch (Exception e)

{

System.out.println(e);

}

}

public static void main(String[] args)

{

String[] str=new String[2];

str[0]="First";

str[1]="Second";

new ThreadTwo(str[0],1000).start();

new ThreadTwo(str[1],500).start();

}

}

如何优化java虚拟机,提高性能

关于性能调优:

1 需要一个性能探测器,找到调用最频繁的代码段,优化这部分代码(优化算法)

2 往往1%的代码运行时间占99%。所以优化这些代码就能事半功倍。

3 最好是能看懂编译后的代码,这样分析最彻底。

Java的性能分析使用JProfiler

堆栈分析使用的Jstack

Java性能调优 SSH框架优化以适应特定的项目

一、JVM调优

1 各种垃圾回收算法及其优劣;

2 针对不同应用类型如何选择JVM参数

3 常用调优工具的使用(jps/jstat/jmap/jstack/jinfo/jhat)

4 调优案例分析(如何选择不同内存块的大小,如何选择不同的算法来提升性能、响应时间)

二、Java应用中CPU占用率、使用情况分析,线程死锁等锁

系统性能瓶颈的分析定位

1 JStack的深度使用

2 各种Linux监控命令的配合使用(top,vmstat,iostat,sar 不要轻信自己能完全掌控这些命令)、分析

(前一阵Java漏洞通过制造Hash冲突来占尽CPU资源就可以通过top命令快速定位到,你肯定没有这么用过)

3 JProfiler的详细使用

三、Java内存溢出分析

1 用EMA来分析内存占用情况

2 通过案例分析来定位内存泄漏

互联网中的性能主要是两个方面:

1 吞吐量,就是系统支持的访问量。

2 延迟,就是一个请求提交后,相应的时间。

一般硬件不变的情况下,两方面各自优化到极限后,相互会制约,也就是吞吐量增强的话比如需要延迟加大,反之亦然。

Java编程的特点是什么呢

Java编程的特点是什么呢?

Java由美国SUN公司(被oracle公司收购)发明于1995年,是目前业界应用最广泛、使用人数最多的语言,连续多年排名世界第一,可以称之为“计算机语言界的英语”。

那么Java这么高的评价它的特点有哪些,下面我来为题主解答:

一、跨平台/可移植性

这是Java的核心优势。Java在设计时就很注重移植和跨平台性。比如:Java的int永远都是32位。不像C++可能是16,32,可能是根据编译器厂商规定的变化。这样的话程序的移植就会非常麻烦。

Java首先利用文本编辑器编写 Java源程序,源文件的后缀名为.java;再利用编译器(javac)将源程序编译成字节码文件,字节码文件的后缀名为.class; 最后利用虚拟机(解释器,java)解释执行。如下图所示:

二、安全性

Java适合于网络/分布式环境,为了达到这个目标,在安全性方面投入了很大的精力,使Java可以很容易构建防病毒,防篡改的系统。比如Java取消了强大但又危险的指针。由于指针可进行移动运算,指针可随便指向一个内存区域,而不管这个区域是否可用,这样做是危险的。

三、面向对象

面向对象是一种程序设计技术,非常适合大型软件的设计和开发。由于C++为了照顾大量C语言使用者而兼容了C,使得自身仅仅成为了带类的C语言,多少影响了其面向对象的彻底性!Java则是完全的面向对象语言。

四、简单性

Java就是C++语法的简化版,我们也可以将Java称之为“C++-”。跟我念“C加加减”,指的就是将C++的一些内容去掉;比如:头文件,指针运算,结构,联合,操作符重载,虚基类等等。同时,由于语法基于C语言,因此学习起来完全不费力。

五、高性能

Java最初发展阶段,总是被人诟病“性能低”;客观上,高级语言运行效率总是低于低级语言的,这个无法避免。Java语言本身发展中通过虚拟机的优化提升了几十倍运行效率。比如,通过JIT(JUST IN TIME)即时编译技术提高运行效率。 将一些“热点”字节码编译成本地机器码,并将结果缓存起来,在需要的时候重新调用。这样的话,使Java程序的执行效率大大提高,某些代码甚至接近C++的效率。

因此,Java低性能的短腿,已经被完全解决了。业界发展上,我们也看到很多C++应用转到Java开发,很多C++程序员转型为Java程序员。

六、分布式

Java是为Internet的分布式环境设计的,因为它能够处理TCP/IP协议。事实上,通过URL访问一个网络资源和访问本地文件是一样简单的。Java还支持远程方法调用(RMI,Remote Method Invocation),使程序能够通过网络调用方法。

七、多线程

多线程的使用可以带来更好的交互响应和实时行为。 Java多线程的简单性是Java成为主流服务器端开发语言的主要原因之一。

八、健壮性

Java是一种健壮的语言,吸收了C/C++ 语言的优点,但去掉了其影响程序健壮性的部分(如:指针、内存的申请与释放等)。Java程序不可能造成计算机崩溃。即使Java程序也可能有错误。如果出现某种出乎意料之事,程序也不会崩溃,而是把该异常抛出,再通过异常处理机制加以处理。

以上几种特性你了解到啦吗?    记得给个赞!

如何用Java实现遗传算法?

通过遗传算法走迷宫。虽然图1和图2均成功走出迷宫,但是图1比图2的路径长的多,且复杂,遗传算法可以计算出有多少种可能性,并选择其中最简洁的作为运算结果。

示例图1:

示例图2:

实现代码:

import java.util.ArrayList;

import java.util.Collections;

import java.util.Iterator;

import java.util.LinkedList;

import java.util.List;

import java.util.Random;

/**

* 用遗传算法走迷宫

*

* @author Orisun

*

*/

public class GA {

int gene_len; // 基因长度

int chrom_len; // 染色体长度

int population; // 种群大小

double cross_ratio; // 交叉率

double muta_ratio; // 变异率

int iter_limit; // 最多进化的代数

Listboolean[] individuals; // 存储当代种群的染色体

Labyrinth labyrinth;

int width;      //迷宫一行有多少个格子

int height;     //迷宫有多少行

public class BI {

double fitness;

boolean[] indv;

public BI(double f, boolean[] ind) {

fitness = f;

indv = ind;

}

public double getFitness() {

return fitness;

}

public boolean[] getIndv() {

return indv;

}

}

ListBI best_individual; // 存储每一代中最优秀的个体

public GA(Labyrinth labyrinth) {

this.labyrinth=labyrinth;

this.width = labyrinth.map[0].length;

this.height = labyrinth.map.length;

chrom_len = 4 * (width+height);

gene_len = 2;

population = 20;

cross_ratio = 0.83;

muta_ratio = 0.002;

iter_limit = 300;

individuals = new ArrayListboolean[](population);

best_individual = new ArrayListBI(iter_limit);

}

public int getWidth() {

return width;

}

public void setWidth(int width) {

this.width = width;

}

public double getCross_ratio() {

return cross_ratio;

}

public ListBI getBest_individual() {

return best_individual;

}

public Labyrinth getLabyrinth() {

return labyrinth;

}

public void setLabyrinth(Labyrinth labyrinth) {

this.labyrinth = labyrinth;

}

public void setChrom_len(int chrom_len) {

this.chrom_len = chrom_len;

}

public void setPopulation(int population) {

this.population = population;

}

public void setCross_ratio(double cross_ratio) {

this.cross_ratio = cross_ratio;

}

public void setMuta_ratio(double muta_ratio) {

this.muta_ratio = muta_ratio;

}

public void setIter_limit(int iter_limit) {

this.iter_limit = iter_limit;

}

// 初始化种群

public void initPopulation() {

Random r = new Random(System.currentTimeMillis());

for (int i = 0; i population; i++) {

int len = gene_len * chrom_len;

boolean[] ind = new boolean[len];

for (int j = 0; j len; j++)

ind[j] = r.nextBoolean();

individuals.add(ind);

}

}

// 交叉

public void cross(boolean[] arr1, boolean[] arr2) {

Random r = new Random(System.currentTimeMillis());

int length = arr1.length;

int slice = 0;

do {

slice = r.nextInt(length);

} while (slice == 0);

if (slice length / 2) {

for (int i = 0; i slice; i++) {

boolean tmp = arr1[i];

arr1[i] = arr2[i];

arr2[i] = tmp;

}

} else {

for (int i = slice; i length; i++) {

boolean tmp = arr1[i];

arr1[i] = arr2[i];

arr2[i] = tmp;

}

}

}

// 变异

public void mutation(boolean[] individual) {

int length = individual.length;

Random r = new Random(System.currentTimeMillis());

individual[r.nextInt(length)] ^= false;

}

// 轮盘法选择下一代,并返回当代最高的适应度值

public double selection() {

boolean[][] next_generation = new boolean[population][]; // 下一代

int length = gene_len * chrom_len;

for (int i = 0; i population; i++)

next_generation[i] = new boolean[length];

double[] cumulation = new double[population];

int best_index = 0;

double max_fitness = getFitness(individuals.get(best_index));

cumulation[0] = max_fitness;

for (int i = 1; i population; i++) {

double fit = getFitness(individuals.get(i));

cumulation[i] = cumulation[i - 1] + fit;

// 寻找当代的最优个体

if (fit max_fitness) {

best_index = i;

max_fitness = fit;

}

}

Random rand = new Random(System.currentTimeMillis());

for (int i = 0; i population; i++)

next_generation[i] = individuals.get(findByHalf(cumulation,

rand.nextDouble() * cumulation[population - 1]));

// 把当代的最优个体及其适应度放到best_individual中

BI bi = new BI(max_fitness, individuals.get(best_index));

// printPath(individuals.get(best_index));

//System.out.println(max_fitness);

best_individual.add(bi);

// 新一代作为当前代

for (int i = 0; i population; i++)

individuals.set(i, next_generation[i]);

return max_fitness;

}

// 折半查找

public int findByHalf(double[] arr, double find) {

if (find  0 || find == 0 || find arr[arr.length - 1])

return -1;

int min = 0;

int max = arr.length - 1;

int medium = min;

do {

if (medium == (min + max) / 2)

break;

medium = (min + max) / 2;

if (arr[medium] find)

min = medium;

else if (arr[medium] find)

max = medium;

else

return medium;

} while (min max);

return max;

}

// 计算适应度

public double getFitness(boolean[] individual) {

int length = individual.length;

// 记录当前的位置,入口点是(1,0)

int x = 1;

int y = 0;

// 根据染色体中基因的指导向前走

for (int i = 0; i length; i++) {

boolean b1 = individual[i];

boolean b2 = individual[++i];

// 00向左走

if (b1 == false  b2 == false) {

if (x  0  labyrinth.map[y][x - 1] == true) {

x--;

}

}

// 01向右走

else if (b1 == false  b2 == true) {

if (x + 1  width labyrinth.map[y][x + 1] == true) {

x++;

}

}

// 10向上走

else if (b1 == true  b2 == false) {

if (y  0  labyrinth.map[y - 1][x] == true) {

y--;

}

}

// 11向下走

else if (b1 == true  b2 == true) {

if (y + 1  height labyrinth.map[y + 1][x] == true) {

y++;

}

}

}

int n = Math.abs(x - labyrinth.x_end) + Math.abs(y -labyrinth.y_end) + 1;

//      if(n==1)

//          printPath(individual);

return 1.0 / n;

}

// 运行遗传算法

public boolean run() {

// 初始化种群

initPopulation();

Random rand = new Random(System.currentTimeMillis());

boolean success = false;

while (iter_limit--  0) {

// 打乱种群的顺序

Collections.shuffle(individuals);

for (int i = 0; i population - 1; i += 2) {

// 交叉

if (rand.nextDouble() cross_ratio) {

cross(individuals.get(i), individuals.get(i + 1));

}

// 变异

if (rand.nextDouble() muta_ratio) {

mutation(individuals.get(i));

}

}

// 种群更替

if (selection() == 1) {

success = true;

break;

}

}

return success;

}

//  public static void main(String[] args) {

//      GA ga = new GA(8, 8);

//      if (!ga.run()) {

//          System.out.println("没有找到走出迷宫的路径.");

//      } else {

//          int gen = ga.best_individual.size();

//          boolean[] individual = ga.best_individual.get(gen - 1).indv;

//          System.out.println(ga.getPath(individual));

//      }

//  }

// 根据染色体打印走法

public String getPath(boolean[] individual) {

int length = individual.length;

int x = 1;

int y = 0;

LinkedListString stack=new LinkedListString();

for (int i = 0; i length; i++) {

boolean b1 = individual[i];

boolean b2 = individual[++i];

if (b1 == false  b2 == false) {

if (x  0  labyrinth.map[y][x - 1] == true) {

x--;

if(!stack.isEmpty() stack.peek()=="右")

stack.poll();

else

stack.push("左");

}

} else if (b1 == false  b2 == true) {

if (x + 1  width labyrinth.map[y][x + 1] == true) {

x++;

if(!stack.isEmpty() stack.peek()=="左")

stack.poll();

else

stack.push("右");

}

} else if (b1 == true  b2 == false) {

if (y  0  labyrinth.map[y - 1][x] == true) {

y--;

if(!stack.isEmpty() stack.peek()=="下")

stack.poll();

else

stack.push("上");

}

} else if (b1 == true  b2 == true) {

if (y + 1  height labyrinth.map[y + 1][x] == true) {

y++;

if(!stack.isEmpty() stack.peek()=="上")

stack.poll();

else

stack.push("下");

}

}

}

StringBuilder sb=new StringBuilder(length/4);

IteratorString iter=stack.descendingIterator();

while(iter.hasNext())

sb.append(iter.next());

return sb.toString();

}

}

学java最重要的是学java的什么内容

学java最重要的是下面四个内容:1、掌握Java语言的使用:语言语法、程序逻辑,OOP(面向对象)思想,封装、继承、多态,集合框架、泛型、File I\O技术,多线程技术、socket网络编程,XML技术。编程有关的操作系统基本使用,HTML5规范、HTML5文档结构、HTML5元素、Web语义化;CSS3规范、CSS3选择器、层叠与继承、盒模型与视觉格式化模型、现代CSS布局、CSS3基本属性千锋教育就有线上免费Java线上公开课。2、掌握Java Web开发技术:Java开发中使用到的Web前端技术,HTML5+CSS3,JavaScript操作BOM和DOM,JQuery的选择器、事件处理、动画效果,MySQL数据库技术,JDBC技术、JSP、Servlet、EL和JSTL、过滤器和监听器、AJax异步请求等,Linux技术、SVN、Linux环境下项目发布部署等。 3、掌握使用流行框架SSM\SSH技术实现企业级项目开发:重点学习MyBatis、Spring、Spring MVC框架的应用,Git、Java设计模式等,重点学习Struts2 、Spring、Hibernate框架的应用,Maven、Oracle数据库应用技术,了解大数据生态体系,Hadoop基础入门。4、JavaWeb框架:Spring体系结构、Spring IOC、AOP、FactoryBean与BeanFactory、声明性事务处理、Spring 5新特性。Maven与Gradle的使用。Spring Boot自动配置、Spring Boot CLI与Initializr、Spring Boot Starter、Actuator。SpringMVC工作原理和工作流程;拦截器、数据绑定转换和格式化、全局异常处理、转发与重定向、AJAX请求处理。如果想了解更多相关知识,建议到千锋教育了解一下。千锋教育总部位于北京,已在18个城市成立分公司,现有教研讲师团队300余人,每年培养泛IT人才近2万人,十年间累计培养超10余万泛IT人才 。


网站栏目:最优适应算法java代码,最佳适应算法例题讲解
网站地址:http://shouzuofang.com/article/dsehgse.html

其他资讯