- 浏览: 602205 次
-
文章分类
最新评论
-
hzxlb910:
nich002 写道我喜欢你的头像。
maven依赖关系中Scope的作用 -
eBusinessMan:
我喜欢你的头像。
maven依赖关系中Scope的作用 -
猜猜猜:
nich002 写道我喜欢你的头像。昵称也不错
maven依赖关系中Scope的作用 -
eastseven:
good
Shiro基于Spring的实现 -
foreach4:
public class Test{
public ...
“ORA-01461: 仅可以为插入 LONG 列的 LONG 值赋值”解决办法
一、概述
现在已经是World Wide Web的时代,无数的web应用框架被创造出来从而大大的提高了web开发的速度。抛开WWW的这个优势,我们知道还有很多协议是HTTP协议所无法替代的。有时,我们仍然需要构造c/s应用来实现适当的协议。
二、MINA是什么?
你有没有曾经使用java或者其他语言实现过某个协议栈?就像你所经历过的那样,编写网络应用即使对于有经验的开发者也不是容易的事情。这归咎于以下几个方面:
* 没有为开发者设计的合适的网络应用框架.
* 使你无法在有限的时间内创建你的应用.
* 网络I/O编码,消息的编/解码,业务逻辑常常纠缠在一起.
* 使程序失去可维护性和可复用性
* 网络应用难于进行单元测试
* 你失去了敏捷性
MINA是一个网络应用框架,在不牺牲性能和可扩展性的前提下用于解决上面的所有问题。
三、编写一个 Echo Server
MINA包含两层:IO层和协议层。我们首先仅使用IO层来实现一个echo服务,因为协议层通常是建立在IO层之上的。
上面的图展示了MINA的IO层同客户端的交互。IoAcceptor执行所有底层IO,将他们翻译成抽象的IO事件,并把翻译过的事件和关联的 IoSession 发送给IoHandler。
1、IoSession
通过IoSession,你可以写出message到远程实体,访问session的配置,并且更改session的属性。
2、IoHandler
通过IoHandler,你可以写出Iosession各个状态时执行的内容。
* sessionCreated: 当一个IO连接建立时被调用,这个方法在任何IO操作之前被调用,以便socket参数或session属性能够最先被设置。
* sessionOpened: 在sessionCreated调用之后被调用。
* sessionClosed: 当IO连接被关闭时被调用。
* sessionIdle: 当在远程实体和用户程序之间没有数据传输的时候被调用。
* exceptionCaught: 当IoAcceptor 或者你的IoHandler.中出现异常时被调用。
* messageReceived: 当从远程实体读取数据时被调用。
* messageSent: 当向远程实体发送数据时被调用。
下面是一个简单的IoHandler实例:
3、IoFilters
IoFilter提供了更加有力的方式来扩展MINA。它拦截所有的IO事件进行事件的预处理和后处理。你可以把它想象成Servlet的 filters。IoFilter能够实现以下几种目的:
* 事件日志
* 性能检测
* 数据转换(e.g. SSL support)
* 防火墙…等等
4、协议层(解码器)
MINA提供了一个协议层来解决复杂的协议解析。协议层将ByteBuffer事件转换成高层的POJO事件。
要实现一个完整的解码器,需要实现以下接口
* ProtocolCodecFactory
* ProtocolEncoder encodes message objects into binary or protocol-specific data
* ProtocolDecoder decodes binary or protocol-specific data into message objects
MINA提供了一个文本格式的解码器。
最后我们将我们写好的解码器加入到IoFilters(ProtocolCodecFilter)中就可以了。
5、ByteBuffers
MINA没有直接使用使用java NIO的ByteBuffer类。它使用一个自制的ByteBuffer来扩展java NIO ByteBuffer的功能。
以下是它们的一些区别:
* MINA ByteBuffer是一个抽象类,用户可以自由的扩展它。
* MINA 管理 MINA ByteBuffers 并对其提供对象池。
* MINA ByteBuffer提供很多便利的方法,如:无符号数值的getter和基于String的getter和putter。
如果你使用 MINA,你将不需要直接使用NIO buffers,因为仅使用MINA buffers就可以完成大多数buffer操作。
MINA有一个全局的ByteBuffer池,它被在同一个虚拟机下的所有MINA应用共享。任何分配的buffers将在IO操作或者事件处理方法被执行之后被释放。所以你可以调用ByteBuffer.allocate()来从池中得到一个ByteBuffer而不需要将它返回到池中。请查阅 ByteBuffer JavaDocs获得更多信息。
6、线程模式
MINA有三种线程模式都是以NIO的方式实现的。
* Acceptor thread 服务端接收线程,然后交给I/O processor thread来执行数据的读写,默认是每个SocketAcceptor服务创建一个线程。
* Connector thread 客户端连接远程服务线程,连接成功后交给I/O processor thread来执行数据的读写,默认是每个SocketConnector创建一个线程。
* I/O processor thread 直到连接关闭前,实际执行数据读写操作的线程。
例如:
7、服务端实现类
8、客户端实现类
客户端也需要一个Handler,所以写一个只打印平台端发过来的数据。
四、与Spring的结合
Spring框架是目前使用非常广泛的一个开源框架,所以其他框架势在要与Spring进行一些整合,下面我们就介绍Apache Mina是如何与Spring结合的。
其实就是增加一个配置文件,注意这里不能使用延迟加载和“byName”的方式找bean
现在已经是World Wide Web的时代,无数的web应用框架被创造出来从而大大的提高了web开发的速度。抛开WWW的这个优势,我们知道还有很多协议是HTTP协议所无法替代的。有时,我们仍然需要构造c/s应用来实现适当的协议。
二、MINA是什么?
你有没有曾经使用java或者其他语言实现过某个协议栈?就像你所经历过的那样,编写网络应用即使对于有经验的开发者也不是容易的事情。这归咎于以下几个方面:
* 没有为开发者设计的合适的网络应用框架.
* 使你无法在有限的时间内创建你的应用.
* 网络I/O编码,消息的编/解码,业务逻辑常常纠缠在一起.
* 使程序失去可维护性和可复用性
* 网络应用难于进行单元测试
* 你失去了敏捷性
MINA是一个网络应用框架,在不牺牲性能和可扩展性的前提下用于解决上面的所有问题。
三、编写一个 Echo Server
MINA包含两层:IO层和协议层。我们首先仅使用IO层来实现一个echo服务,因为协议层通常是建立在IO层之上的。

上面的图展示了MINA的IO层同客户端的交互。IoAcceptor执行所有底层IO,将他们翻译成抽象的IO事件,并把翻译过的事件和关联的 IoSession 发送给IoHandler。
1、IoSession
通过IoSession,你可以写出message到远程实体,访问session的配置,并且更改session的属性。
2、IoHandler
通过IoHandler,你可以写出Iosession各个状态时执行的内容。
* sessionCreated: 当一个IO连接建立时被调用,这个方法在任何IO操作之前被调用,以便socket参数或session属性能够最先被设置。
* sessionOpened: 在sessionCreated调用之后被调用。
* sessionClosed: 当IO连接被关闭时被调用。
* sessionIdle: 当在远程实体和用户程序之间没有数据传输的时候被调用。
* exceptionCaught: 当IoAcceptor 或者你的IoHandler.中出现异常时被调用。
* messageReceived: 当从远程实体读取数据时被调用。
* messageSent: 当向远程实体发送数据时被调用。
下面是一个简单的IoHandler实例:
import java.text.SimpleDateFormat; import java.util.Calendar; import org.apache.mina.common.ByteBuffer; import org.apache.mina.common.IdleStatus; import org.apache.mina.common.IoHandlerAdapter; import org.apache.mina.common.IoSession; import org.apache.mina.util.SessionLog; public class EchoProtocolHandler extends IoHandlerAdapter { public void sessionOpened(IoSession session) throws Exception { super.sessionOpened(session); SessionLog.info(session, "session is operned"); } public void sessionClosed(IoSession session) throws Exception { super.sessionClosed(session); SessionLog.info(session, "session is closed"); } public void sessionIdle(IoSession session, IdleStatus status) throws Exception { super.sessionIdle(session, status); SessionLog.info(session, "session is Idle"); } public void exceptionCaught(IoSession session, Throwable cause) throws Exception { super.exceptionCaught(session, cause); } public void messageReceived(IoSession session, Object message) throws Exception { super.messageReceived(session, message); if (message instanceof ByteBuffer) { // 接收数据 ByteBuffer buffer = (ByteBuffer) message; byte[] fromClinet = new byte[buffer.remaining()]; buffer.get(fromClinet); String clientContext = new String(fromClinet); System.out.println(clientContext); // 返回收据 byte[] echoContext = ("已收到" + clientContext).getBytes(); ByteBuffer byteBuffer = ByteBuffer.allocate(echoContext.length); byteBuffer.put(echoContext); byteBuffer.flip(); session.write(byteBuffer); } else if (message instanceof String) { String str = message.toString(); if (str.trim().equalsIgnoreCase("quit")) { session.close(); return; } else if (str.trim().equalsIgnoreCase("now")) { Calendar cal = Calendar.getInstance(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String now = dateFormat.format(cal.getTime()); session.write("当前时间:" + now); } else { session.write("错误的指令"); } } } public void messageSent(IoSession session, Object message) throws Exception { super.messageSent(session, message); SessionLog.info(session, message.toString()); } }
3、IoFilters
IoFilter提供了更加有力的方式来扩展MINA。它拦截所有的IO事件进行事件的预处理和后处理。你可以把它想象成Servlet的 filters。IoFilter能够实现以下几种目的:
* 事件日志
* 性能检测
* 数据转换(e.g. SSL support)
* 防火墙…等等
4、协议层(解码器)
MINA提供了一个协议层来解决复杂的协议解析。协议层将ByteBuffer事件转换成高层的POJO事件。
要实现一个完整的解码器,需要实现以下接口
* ProtocolCodecFactory
* ProtocolEncoder encodes message objects into binary or protocol-specific data
* ProtocolDecoder decodes binary or protocol-specific data into message objects
MINA提供了一个文本格式的解码器。
最后我们将我们写好的解码器加入到IoFilters(ProtocolCodecFilter)中就可以了。
5、ByteBuffers
MINA没有直接使用使用java NIO的ByteBuffer类。它使用一个自制的ByteBuffer来扩展java NIO ByteBuffer的功能。
以下是它们的一些区别:
* MINA ByteBuffer是一个抽象类,用户可以自由的扩展它。
* MINA 管理 MINA ByteBuffers 并对其提供对象池。
* MINA ByteBuffer提供很多便利的方法,如:无符号数值的getter和基于String的getter和putter。
如果你使用 MINA,你将不需要直接使用NIO buffers,因为仅使用MINA buffers就可以完成大多数buffer操作。
MINA有一个全局的ByteBuffer池,它被在同一个虚拟机下的所有MINA应用共享。任何分配的buffers将在IO操作或者事件处理方法被执行之后被释放。所以你可以调用ByteBuffer.allocate()来从池中得到一个ByteBuffer而不需要将它返回到池中。请查阅 ByteBuffer JavaDocs获得更多信息。
6、线程模式
MINA有三种线程模式都是以NIO的方式实现的。
* Acceptor thread 服务端接收线程,然后交给I/O processor thread来执行数据的读写,默认是每个SocketAcceptor服务创建一个线程。
* Connector thread 客户端连接远程服务线程,连接成功后交给I/O processor thread来执行数据的读写,默认是每个SocketConnector创建一个线程。
* I/O processor thread 直到连接关闭前,实际执行数据读写操作的线程。
例如:
SocketAcceptor acceptor = new SocketAcceptor(Runtime.getRuntime().availableProcessors() + 1, Executors.newCachedThreadPool());
SocketConnector connector = new SocketConnector(Runtime.getRuntime().availableProcessors() + 1, Executors.newCachedThreadPool());
IoAcceptor acceptor = new SocketAcceptor(); ExecutorService executor = Executors.newCachedThreadPool(); DefaultIoFilterChainBuilder filterChainBuilder = acceptor.getDefaultConfig().getFilterChain(); filterChainBuilder.addLast("threadPool", new ExecutorFilter(executor));
7、服务端实现类
import java.io.IOException; import java.net.InetSocketAddress; import java.nio.charset.Charset; import org.apache.mina.common.ByteBuffer; import org.apache.mina.common.IoAcceptor; import org.apache.mina.common.SimpleByteBufferAllocator; import org.apache.mina.filter.LoggingFilter; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.nio.SocketAcceptor; import org.apache.mina.transport.socket.nio.SocketAcceptorConfig; public class EchoServer { private static final int PORT = 9999; public static void main(String[] args) throws IOException { //The following two lines change the default buffer type to 'heap', //which yields better performance.c ByteBuffer.setUseDirectBuffers(false); ByteBuffer.setAllocator(new SimpleByteBufferAllocator()); IoAcceptor acceptor = new SocketAcceptor(); SocketAcceptorConfig cfg = new SocketAcceptorConfig(); cfg.getFilterChain().addLast("logger", new LoggingFilter()); cfg.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("GBK")))); acceptor.bind(new InetSocketAddress(PORT), new EchoProtocolHandler(), cfg); System.out.println("MINA Echo server started."); } }
8、客户端实现类
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.nio.charset.Charset; import org.apache.mina.common.ConnectFuture; import org.apache.mina.common.IoSession; import org.apache.mina.filter.LoggingFilter; import org.apache.mina.filter.codec.ProtocolCodecFilter; import org.apache.mina.filter.codec.textline.TextLineCodecFactory; import org.apache.mina.transport.socket.nio.SocketConnector; import org.apache.mina.transport.socket.nio.SocketConnectorConfig; public class EchoClient { public static final String ADDRESS = "127.0.0.1:9999"; private IoSession session; public static void main(String[] args) throws IOException { EchoClient client = new EchoClient(); client.connect(ADDRESS); BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); while (true) { String in = reader.readLine(); if (in.trim().equalsIgnoreCase("quit")) { break; } client.send(in); } client.session.close(); System.exit(0); } public boolean connect(String address) { try { if (session != null && session.isConnected()) { throw new IllegalStateException("Already connected. Disconnect first."); } SocketConnector connector = new SocketConnector(); // connector.getFilterChain().addLast("logger", new LoggingFilter()); connector.getFilterChain().addLast("codec", new ProtocolCodecFilter(new TextLineCodecFactory(Charset.forName("GBK")))); connector.setWorkerTimeout(1); SocketConnectorConfig config = new SocketConnectorConfig(); ConnectFuture future = connector.connect(parseSocketAddress(address), new EchoClientHandler(), config); future.join(); if (!future.isConnected()) { return false; } session = future.getSession(); return true; } catch (Exception e) { e.printStackTrace(); return false; } } public void send(String data) { if (session != null && !session.isClosing()) { session.write(data); } else { throw new RuntimeException("session is closed or empty data"); } } private SocketAddress parseSocketAddress(String s) { s = s.trim(); int colonIndex = s.indexOf(":"); if (colonIndex > 0) { String host = s.substring(0, colonIndex); int port = parsePort(s.substring(colonIndex + 1)); return new InetSocketAddress(host, port); } else { int port = parsePort(s.substring(colonIndex + 1)); return new InetSocketAddress(port); } } private int parsePort(String s) { try { return Integer.parseInt(s); } catch (NumberFormatException nfe) { throw new IllegalArgumentException("Illegal port number: " + s); } } }
客户端也需要一个Handler,所以写一个只打印平台端发过来的数据。
import org.apache.mina.common.IoHandlerAdapter; import org.apache.mina.common.IoSession; public class EchoClientHandler extends IoHandlerAdapter { public void messageReceived(IoSession session, Object message) throws Exception { System.out.println(message.toString()); } }
四、与Spring的结合
Spring框架是目前使用非常广泛的一个开源框架,所以其他框架势在要与Spring进行一些整合,下面我们就介绍Apache Mina是如何与Spring结合的。
其实就是增加一个配置文件,注意这里不能使用延迟加载和“byName”的方式找bean
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd" default-lazy-init="false"> <!-- This makes it possible to specify java.net.SocketAddress values (e.g. :80 below) as Strings. They will be converted into java.net.InetSocketAddress objects by Spring. --> <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"> <property name="customEditors"> <map> <entry key="java.net.SocketAddress"> <bean class="org.apache.mina.integration.spring.InetSocketAddressEditor" /> </entry> </map> </property> </bean> <bean id="moAcceptor" class="org.apache.mina.integration.spring.IoAcceptorFactoryBean"> <property name="target"> <bean class="org.apache.mina.transport.socket.nio.SocketAcceptor" /> </property> <property name="bindings"> <list> <ref bean="echoBinding" /> </list> </property> </bean> <bean id="echoBinding" class="org.apache.mina.integration.spring.Binding"> <property name="address" value=":9999" /> <property name="handler" ref="moMinaServiceHandler" /> <property name="serviceConfig" ref="serviceConfig" /> </bean> <!-- The IoHandler implementation --> <bean id="echoHandler" class="com.justinmobile.echo.mina.EchoProtocolHandler" /> <bean id="serviceConfig" class="org.apache.mina.transport.socket.nio.SocketAcceptorConfig"> <property name="filterChainBuilder" ref="filterChainBuilder" /> <property name="reuseAddress" value="true" /> <property name="threadModel" ref="threadModel" /> </bean> <bean id="filterChainBuilder" class="org.apache.mina.integration.spring.DefaultIoFilterChainBuilderFactoryBean"> <property name="filters"> <list> <bean class="org.apache.mina.filter.LoggingFilter" /> <bean class="org.apache.mina.filter.codec.ProtocolCodecFilter"> <constructor-arg> <bean class="org.apache.mina.filter.codec.textline.TextLineCodecFactory" /> </constructor-arg> </bean> </list> </property> </bean> <!-- By default MINA uses an ExecutorThreadModel. This demonstrates how to use your own with some non default settings. The threadModel will be set on the SocketAcceptorConfig defined below. To configure a ExecutorFilter directly you will have to use the ThreadModel.MANUAL ThreadModel instead. --> <bean id="threadModel" class="org.apache.mina.integration.spring.ExecutorThreadModelFactoryBean"> <property name="serviceName" value="TlvService" /> <property name="executor"> <bean class="org.apache.mina.integration.spring.ThreadPoolExecutorFactoryBean"> <property name="corePoolSize" value="1" /> <property name="maxPoolSize" value="20" /> <property name="keepAliveSeconds" value="30" /> </bean> </property> </bean> </beans>
发表评论
-
Java8初体验(二)Stream语法详解
2016-07-01 14:08 1710Java8初体验(二)Stream语法详解 感谢同事【天锦】 ... -
Java8初体验(一)lambda表达式语法
2016-07-01 14:04 1274我就是一个搬运工,有 ... -
使用Maven建立我们的项目及简单的项目管理
2011-10-18 16:48 3363第一步:建立项目 主要工作是选择一个目录,用命令 ... -
事务传播行为类型
2011-01-18 13:29 1412事务传播行为类型 说明 PROPAGATION_REQUI ... -
Apache mina 与Spring整合设计
2010-02-25 13:14 15442其实很简单,看了网上很多例子,但是发现还是Apache自己写的 ... -
Linux下源码方式安装apache 2.2.14 & svn 1.6.6
2009-12-30 10:29 4067附件文档大纲: 环境 1. ... -
maven依赖关系中Scope的作用
2008-12-22 12:27 141464maven依赖关系中Scope的作用 Dependency ... -
CVS在Linux中的配置和使用
2008-06-04 11:41 65551、 CVS简述:略 2、 CVS服务 ... -
用线程池执行任务
2007-05-25 14:56 4855如果你开发项目的时候用到很多的short-lived任务,这里 ... -
理解JAVA的SWT的应用
2007-05-24 16:32 1547介绍Layout的 连接地址: http://www.ecli ... -
Java数字证书及应用实践
2007-04-29 13:34 4675主要说明的是用Java的工具生成数字证书,和用程序给数字证书签 ... -
不同进制的数字字符串互相转换
2007-04-20 16:30 3078是一些数字类型的转换……抄的 import java.i ...
相关推荐
Apache MINA(Multipurpose Infrastructure for Network Applications)是一个Java框架,专为开发高...通过这个2.0.2版本的jar包,你可以开始你的MINA之旅,虽然可能需要更新到更现代的版本以获得最新的特性和改进。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
cmd-bat-批处理-脚本-MakeToolWindow.zip
“华为杯”第十八届中国研究生数学建模竞赛是一项全国性赛事,致力于提升研究生的数学建模与创新实践能力。数学建模是将实际问题转化为数学模型,并运用数学方法求解以解决实际问题的科学方法。该竞赛为参赛者提供了展示学术水平和团队协作精神的平台。 论文模板通常包含以下内容:封面需涵盖比赛名称、学校参赛队号、队员姓名以及“华为杯”和中国研究生创新实践系列大赛的标志;摘要部分应简洁明了地概括研究工作,包括研究问题、方法、主要结果和结论,使读者无需阅读全文即可了解核心内容;目录则列出各章节标题,便于读者快速查找;问题重述部分需详细重新阐述比赛中的实际问题,涵盖背景、原因及重要性;问题分析部分要深入探讨每个问题的内在联系与解决思路,分析各个子问题的特点、难点及可能的解决方案;模型假设与符号说明部分需列出合理假设以简化问题,并清晰定义模型中的变量和符号;模型建立与求解部分是核心,详细阐述将实际问题转化为数学模型的过程,以及采用的数学工具和求解步骤;结果验证与讨论部分展示模型求解结果,评估模型的有效性和局限性,并对结果进行解释;结论部分总结研究工作,强调模型的意义和对未来研究的建议;参考文献部分列出引用文献,遵循规范格式。 在准备竞赛论文时,参赛者需注重逻辑清晰、论述严谨,确保模型科学实用。良好的团队协作和时间管理也是成功的关键。通过竞赛,研究生们不仅锻炼了数学应用能力,还提升了团队合作、问题解决和科研写作能力。
希望这会对大家有用,共同发挥互联网精神!
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
cmd-bat-批处理-脚本-Run python script.zip
内容概要:本文详细介绍了利用Matlab/Simulink平台,通过无迹扩展卡尔曼滤波(UKF/EKF)进行路面附着系数估计的方法及其仿真功能。文中首先阐述了Dugoff轮胎模型的构建方法,强调了避免代数环的重要性,并提供了具体的模块连接方式。接着,描述了7自由度整车模型的搭建步骤,特别是质心加速度和轮速之间的耦合关系。最后,深入探讨了UKF和EKF滤波器的配置细节,包括状态变量选择、观测值设定以及协方差矩阵的初始化等关键参数调整。仿真结果显示,在80km/h的速度下,UKF相比EKF的均方误差降低了18%,但CPU耗时增加了40%。 适合人群:从事车辆控制系统研究的专业人士,尤其是对卡尔曼滤波有一定了解的研究人员和技术人员。 使用场景及目标:适用于需要精确估计路面附着系数的应用场合,如汽车电子稳定程序(ESP)的设计与优化。通过提高附着系数估计的准确性,可以有效提升车辆行驶的安全性和稳定性。 其他说明:文章不仅提供了理论指导,还给出了实际操作的具体步骤和注意事项,帮助读者更好地理解和应用相关技术。
实体建模技术研究进展.zip
基于4G通信的高负载电动汽车远程监控平台软件设计与开发.zip
IMG_20250521_201207.jpg
cmd-bat-批处理-脚本-数学-isInteger.zip
基于改进DeepLabv3+的高分辨率遥感影像屋顶提取方法.pdf
cmd-bat-批处理-脚本-post-install.zip
遗传算法优化BP神经网络(GABP)是一种结合了遗传算法(GA)和BP神经网络的优化预测方法。BP神经网络是一种多层前馈神经网络,常用于模式识别和预测问题,但其容易陷入局部最优。而遗传算法是一种模拟自然选择和遗传机制的全局优化方法,能够有效避免局部最优 。GABP算法通过遗传算法优化BP神经网络的权重和阈值,从而提高网络的学习效率和预测精度 。 种群:遗传算法中个体的集合,每个个体代表一种可能的解决方案。 编码:将解决方案转化为适合遗传操作的形式,如二进制编码。 适应度函数:用于评估个体解的质量,通常与目标函数相反,目标函数值越小,适应度越高。 选择:根据适应度保留优秀个体,常见方法有轮盘赌选择、锦标赛选择等。 交叉:两个父代个体交换部分基因生成子代。 变异:随机改变个体的部分基因,增加种群多样性。 终止条件:当迭代次数或适应度阈值达到预设值时停止算法 。 初始化种群:随机生成一组神经网络参数(权重和阈值)作为初始种群 。 计算适应度:使用神经网络模型进行训练和预测,根据预测误差计算适应度 。 选择操作:根据适应度选择优秀个体 。 交叉操作:对选择的个体进行交叉,生成新的子代个体 。 变异操作:对子代进行随机变异 。 替换操作:用新生成的子代替换掉一部分旧种群 。 重复步骤2-6,直到满足终止条件 。 适应度函数通常以预测误差为基础,误差越小,适应度越高。常用的误差指标包括均方根误差(RMSE)或平均绝对误差(MAE)等 。 GABP代码中包含了适应度函数的定义、种群的生成、选择、交叉、变异以及训练过程。代码注释详尽,便于理解每个步骤的作用 。 GABP算法适用于多种领域,如时间序列预测、经济预测、工程问题的优化等。它特别适合解决多峰优化问题,能够有效提高预测的准确性和稳定性 。
太阳高度角和方位角建模及核桃树阴影变化分析.pdf
cmd-bat-批处理-脚本-param2.zip
Uniapp原生适配日期时间选择器,可动态设置分钟显示间隔
cmd-bat-批处理-脚本-日期-W32DOW.zip
logo ant design 的