JavaACOFramework的各个类介绍(part3 : Ant4ACS类)
package aco.ant; import java.util.ArrayList; import sys.Settings;
import util.PseudoRandom;
import aco.ACO; public class Ant4ACS extends Ant4AS { /** 进行Exploitation的概率 */
protected double Q0 = Settings.Q0; /** 信息素挥发的概率*/
protected double P = Settings.P; public Ant4ACS(ACO aco) {
super(aco);
}
/*实现了父类的explore操作的接口*/
@Override
public void explore() {
while (!nodesToVisit.isEmpty()) {
int nextNode = -1; if (PseudoRandom.randDouble(0, 1) <= Q0) {
nextNode = doExploitation(currentNode);//Exploitation操作
} else {
nextNode = doExploration(currentNode);//Exploration操作
} localUpdateRule(currentNode, nextNode);//挥发连接当前节点和下一个节点边的信息素 // Save next node
tour.add(new Integer(nextNode));//将下一个节点存入蚂蚁的路径列表
path[currentNode][nextNode] = 1;//将当前节点与下一节点间的边标记为已访问过
path[nextNode][currentNode] = 1;//将下一节点与当前节点间的边标记为已访问过 aco.p.updateTheMandatoryNeighborhood(this);//更新邻域 currentNode = nextNode;//将下一节点作为当前节点
}
}
/* 信息素挥发 */
protected void localUpdateRule(int i, int j) {
double evaporation = (1.0 - P) * aco.getTau(i, j);
double deposition = P * aco.p.getT0(); aco.setTau(i, j, evaporation + deposition);
aco.setTau(j, i, evaporation + deposition);
}
/*该操作选择和当前节点i相邻的所有未被访问过的节点中tij * nij值最高的节点作为下一个节点*/
protected int doExploitation(int i) {
int nextNode = -1;
double maxValue = Double.MIN_VALUE; // Update the sum
for (Integer j : nodesToVisit) {
if (aco.getTau(i, j) == 0.0) {
throw new RuntimeException("tau == 0.0");
} double tij = aco.getTau(i, j);
double nij = Math.pow(aco.p.getNij(i, j), BETA);
double value = tij * nij; if(value > maxValue){
maxValue = value;
nextNode = j;
}
} if (nextNode == -1) {
throw new RuntimeException("nextNode == -1");
} nodesToVisit.remove(new Integer(nextNode)); return nextNode;
} @Override
/*实现父类的clone接口,复制蚂蚁*/
public Ant clone() {
Ant ant = new Ant4ACS(aco);
ant.id = id;
ant.currentNode = currentNode;
ant.tourLength = tourLength;
ant.tour = new ArrayList<Integer>(tour);
ant.path = path.clone();
return ant;
}
}
JavaACOFramework的各个类介绍(part3 : Ant4ACS类)的更多相关文章
- istringstream、ostringstream、stringstream 类介绍 和 stringstream类 clear函数的真正用途
istringstream.ostringstream.stringstream 类介绍 和 stringstream类 clear函数的真正用途 来源: http://blog.csdn.net/T ...
- JavaACOFramework的各个类介绍(part1 : Ant类)
public abstract class Ant extends Observable implements Runnable { public static int ANT_ID = 1; // ...
- JavaACOFramework的各个类介绍(part2 : Ant4AS类)
package aco.ant; import java.util.ArrayList; import util.RouletteWheel;//引入轮盘类 import aco.ACO;//引入蚁群 ...
- SimpleDateFormat类介绍和 DateFormat类的format方法和parse方法
使用 SimpleDateFormat格式化日期 SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类.SimpleDateFormat 允许你选择任何用户自定义日期时间 ...
- CYQ.Data.Orm.DBFast 新增类介绍(含类的源码及新版本配置工具源码)
前言: 以下功能在国庆期就完成并提前发布了,但到今天才有时间写文介绍,主要是国庆后还是选择就职了,悲催的是上班的地方全公司都能上网,唯独开发部竟不让上网,是个局域网. 也不是全不能上,房间里有三台能上 ...
- Bullet核心类介绍(Bullet 2.82 HelloWorld程序及其详解,附程序代码)
实验平台:win7,VS2010 先上结果截图: 文章最后附有生成该图的程序. 1. 刚体模拟原理 Bullet作为一个物理引擎,其任务就是刚体模拟(还有可变形体模拟).刚体模拟,就是要计算预测物体的 ...
- MediaRecorder类介绍
audiocallbackvideojavadescriptorencoding 目录(?)[+] 找到个MediaRecorder类介绍和大家分享一下. Mediarecorder类在官网的介绍和在 ...
- Object类介绍
一.Object类介绍
- C#文件读写常用类介绍
首先要熟悉.NET中处理文件和文件夹的操作.File类和Directory类是其中最主要的两个类.了解它们将对后面功能的实现提供很大的便利. 本节先对和文件系统相关的两个.NET类进行简要介 ...
随机推荐
- iOS网络相关知识总结
iOS网络相关知识总结 1.关于请求NSURLRequest? 我们经常讲的GET/POST/PUT等请求是指我们要向服务器发出的NSMutableURLRequest的类型; 我们可以设置Reque ...
- Trace-如何跟踪某个Job的开销
1.背景 下面是从以往Profiler收集的跟踪文件中提取Job有关数据 ;with cte as( Duration_ms ,CPU CPU_ms,Reads,Writes,StartTime,En ...
- ios开发证书
文章写得很透彻 https://segmentfault.com/a/1190000004144556?f=tt&hmsr=toutiao.io
- cocos的helloworld写法
我觉得吧,做工作是找一份自己喜欢的工作,然后一做很多年,想做安卓就去做,做苹果也去做,现在想转行做游戏,游戏方向有很多,选定前段吧,选定平台COCOS,COOCS有2D和3D,先玩2D吧,写一个hel ...
- android 横向滚动条
/*** * 横向滚动条,修改版,从左向右滚动,支持html代码和html里面的网络图片 */public class MarqueeView extends LinearLayout { priva ...
- 2.4 C#的变量
在C#中,不仅有常量,还有变量,而且最常用的还是变量.下面是变量的知识. C#的变量有3个步骤:声明.赋值.使用. 变量声明的方法:数据类型 变量名; 变量赋值的方法:变量名=变量的值: 下面是这3个 ...
- 纯html、css3、js的时钟
之前在网上看了一些使用js写的时钟,但感觉实现的方法有点麻烦,所以就自己重新写了一个例子,样子有点丑,但方法比较简单,大家就凑合看吧 其中采用的主要方法是原生js里面的Data(时期)对象,以及它的. ...
- Node.js Express 框架 GET方法
GET 方法 以下实例演示了在表单中通过 GET 方法提交两个参数,我们可以使用 server.js 文件内的 process_get 路由器来处理输入: index.htm 文件代码如下: < ...
- WebBrowser内核指定
一.背景 这几天在维护公司的一个项目,嗯…到现在七八年没人动过了(也是老古董了),都说N年前的代码碰不得 处处是坑 不能挖坑还得一步一步的填坑,恰好今天就填了一坑 此处作为记录 供以后翻阅,对代码除了 ...
- 接口测试第十二课(fidller过滤)(转)
转自: 经常有人问我,如何只抓手机上某个应用的请求包?在使用fiddler抓手机包的过程中,fiddler会话框上瞬间就满屏了,因为它不仅抓到手机上的请求数据包,也抓到了PC端的网络请求包.这时候很难 ...