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. 基于DevExpress ImageSlider实现图片轮播效果

    工具:DevExpress版本为15.2.7 1.控件类型全称:DevExpress.XtraEditors.Controls.ImageSlider 2.控件所在程序集:DevExpress.Xtr ...

  2. category用法

    1.今天在复习之前的category的时候,遇到一个这样子的问题.查来一下,原来苹果的官方文档中有说明,苹果时不提倡我们在类别中重写原文件的内容,如果要重写,就继承他,然后重写,但是在项目中,有很多前 ...

  3. 戴尔3542安装ubuntu时出现:failed to lead ldlinux.c32

    解决办法: 1. 开机未进入系统是连续敲击F2,进入BIOS2.在 BIOS 的Boot菜单下,将Secure Boot 改为 Disabled3. 将Boot List Option 改为 Lega ...

  4. servlet内置对象

    request                请求对象       类型javax.servlet.ServletRequest   作用域Request response              ...

  5. 移动端 触摸事件 ontouchstart、ontouchmove、ontouchend、ontouchcancel

    1.Touch事件简介 pc上的web页面鼠 标会产生onmousedown.onmouseup.onmouseout.onmouseover.onmousemove的事件,但是在移动终端如 ipho ...

  6. WebAPI使用多个xml文件生成帮助文档

    一.前言 上篇有提到在WebAPI项目内,通过在Nuget里安装(Microsoft.AspNet.WebApi.HelpPage)可以根据注释生成帮助文档,查看代码实现会发现是基于解析项目生成的xm ...

  7. iOS socket 笔记

    ios 客服端: 下载 AsyncSocket 开发框架,拖到项目中 //建立 #import "ViewController.h" #import <sys/socket. ...

  8. ORACLE设置id自增长

    1.创建序列create sequence sequence_userinfo start with 1 increment by 1 minvalue 1 maxvalue 999999 nocyc ...

  9. 使用Apache Ambari管理Hadoop

    随着Hadoop越来越普及,对合适的管理平台的需求成为当前亟待解决的问题.已经有几个商业性的Hadoop管理平台,如Cloudera Enterprise Manager,但Apache Ambari ...

  10. Lombok 安装、入门 - 消除冗长的 java 代码

    lombok 提供了简单的注解的形式来帮助我们简化消除一些必须有但显得很臃肿的 java 代码. lombok 的官方网址:http://projectlombok.org/  lombok 安装1. ...