package aco.ant;

import java.util.ArrayList;

import util.RouletteWheel;//引入轮盘类
import aco.ACO;//引入蚁群类 /**
* The AS Ant Class
*
* @author Thiago Nascimento
* @since 2014-07-27
* @version 1.0
*/
public class Ant4AS extends Ant { /*父类的构造函数*/
public Ant4AS(ACO aco) {
super(aco);
}
/*实现父类的explore结口,完成构造路径的工作*/
@Override
public void explore() {
while (!nodesToVisit.isEmpty()) {
int nextNode = doExploration(currentNode);//找到下一个访问的节点 //Save next node
tour.add(new Integer(nextNode));//将下一个节点的编号加入路径
path[currentNode][nextNode] = 1;//将标志位矩阵中当前节点与下一节点间的边的访问标志置为1
path[nextNode][currentNode] = 1;//将标志位矩阵中下一节点与当前节点间的边的访问标志置为1 aco.p.updateTheMandatoryNeighborhood(this);//更新领域 currentNode = nextNode;//把下一节点作为当前节点
}
} /**
* 返回下一个访问节点的编号
*
* @param i :当前节点的编号
* @return 下一节点的编号,该函数是利用轮盘赌的方法选择下一个要访问的节点
*/
protected int doExploration(int i) {
int nextNode = -1;
double sum = 0.0; // Update the sum
for (Integer j : nodesToVisit) {
if (aco.getTau(i, j) == 0.0) {
throw new RuntimeException("tau == 0.0");
} double tij = Math.pow(aco.getTau(i, j), ALPHA);
double nij = Math.pow(aco.p.getNij(i, j), BETA);
sum += tij * nij;
} if (sum == 0.0) {
throw new RuntimeException("sum == 0.0");
} double[] probability = new double[aco.p.getNodes()];
double sumProbability = 0.0; for (Integer j : nodesToVisit) {
double tij = Math.pow(aco.getTau(i, j), ALPHA);
double nij = Math.pow(aco.p.getNij(i, j), BETA);
probability[j] = (tij * nij) / sum;
sumProbability += probability[j];
} // Select the next node by probability
nextNode = RouletteWheel.select(probability, sumProbability); if (nextNode == -1) {
throw new RuntimeException("nextNode == -1");
} nodesToVisit.remove(new Integer(nextNode)); return nextNode;
} @Override 实现父类的clone接口,复制ant对象
public Ant clone() {
Ant ant = new Ant4AS(aco);
ant.id = id;
ant.currentNode = currentNode;
ant.tourLength = tourLength;
ant.tour = new ArrayList<Integer>(tour);
ant.path = path.clone();
return ant;
}
}

JavaACOFramework的各个类介绍(part2 : Ant4AS类)的更多相关文章

  1. istringstream、ostringstream、stringstream 类介绍 和 stringstream类 clear函数的真正用途

    istringstream.ostringstream.stringstream 类介绍 和 stringstream类 clear函数的真正用途 来源: http://blog.csdn.net/T ...

  2. JavaACOFramework的各个类介绍(part1 : Ant类)

    public abstract class Ant extends Observable implements Runnable { public static int ANT_ID = 1; // ...

  3. JavaACOFramework的各个类介绍(part3 : Ant4ACS类)

    package aco.ant; import java.util.ArrayList; import sys.Settings; import util.PseudoRandom; import a ...

  4. SimpleDateFormat类介绍和 DateFormat类的format方法和parse方法

    使用 SimpleDateFormat格式化日期 SimpleDateFormat 是一个以语言环境敏感的方式来格式化和分析日期的类.SimpleDateFormat 允许你选择任何用户自定义日期时间 ...

  5. CYQ.Data.Orm.DBFast 新增类介绍(含类的源码及新版本配置工具源码)

    前言: 以下功能在国庆期就完成并提前发布了,但到今天才有时间写文介绍,主要是国庆后还是选择就职了,悲催的是上班的地方全公司都能上网,唯独开发部竟不让上网,是个局域网. 也不是全不能上,房间里有三台能上 ...

  6. Bullet核心类介绍(Bullet 2.82 HelloWorld程序及其详解,附程序代码)

    实验平台:win7,VS2010 先上结果截图: 文章最后附有生成该图的程序. 1. 刚体模拟原理 Bullet作为一个物理引擎,其任务就是刚体模拟(还有可变形体模拟).刚体模拟,就是要计算预测物体的 ...

  7. MediaRecorder类介绍

    audiocallbackvideojavadescriptorencoding 目录(?)[+] 找到个MediaRecorder类介绍和大家分享一下. Mediarecorder类在官网的介绍和在 ...

  8. Object类介绍

    一.Object类介绍

  9. C#文件读写常用类介绍

    首先要熟悉.NET中处理文件和文件夹的操作.File类和Directory类是其中最主要的两个类.了解它们将对后面功能的实现提供很大的便利.      本节先对和文件系统相关的两个.NET类进行简要介 ...

随机推荐

  1. nginx 配置优化(简单)

    配置文件     正常运行的必备配置:         1.user username [groupname]:(推荐nginx)         以那个用户身份运行,以在configure指定的用户 ...

  2. shell中对字符串的处理

    1.替换字符串1为字符串2 sed "s/str1/str2/g" 2.获取字符串中的一部分 例:boke-blade 取得boke:sed -e "s/-.*//g&q ...

  3. ClearTrace

    一年前两次手动使用fn_trace_gettable对跟踪文件进行分析,按TextData排序,通过截取TextData左边N位尝试分组,观察总体相同的过程或语句中的关键字,逐一得出跟踪分析报表,罗列 ...

  4. Yaf(Yet Another Framework)用户手册 yii框架手册

    地址:http://www.laruence.com/manual/ yaf框架手册:http://pan.baidu.com/s/1bnHFPHd yii框架手册:http://pan.baidu. ...

  5. 原生js拖拽

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  6. sql 中convert和cast区别

    SQL中的cast和convert的用法和区别 更多 来源:SQL学习浏览量: 学习标签: cast convert sql 本文导读:SQL中的cast 和convert都是用来将一种数据类型的表达 ...

  7. mpt_voronoi demo

    % %demo1% A=rand(3,10);% pbound=Polyhedron([0 0 0;150 0 0;150 150 0;0 150 0; 0 0 1;150 0 1;150 150 1 ...

  8. opencv 抠图联通块(c接口)

    #include "stdio.h" #include "iostream" #include "opencv/cv.h" #include ...

  9. 总结Android中遇见的OOM

    一 .Android应用中内存泄漏几种的原因: 1.单例模式导致的内存泄漏: 当调用getInstance时,如果传入的context是Activity的context.只要这个单例没有被释放,这个A ...

  10. 如何在自己的代码中实现分享视频文件或者是图片文件到微信 QQ微博 新浪微博等!!!

    首先在文档第一句我先自嘲下 , 我是大傻逼, 弄了两天微信是视频分享,一直被说为啥跟系统的相册分享的不一样,尼玛!!! 这里来说正文,我这里不像多少太多,大家都是程序猿,具体的阔以看代码. 搞代码之前 ...