JavaACOFramework的各个类介绍(part2 : Ant4AS类)

本文介绍了一个名为ASAnt的具体蚁群算法实现类。该类通过轮盘赌的方式选择下一个要访问的节点,并实现了路径构建和复制功能。文章详细展示了ASAnt类的构造方法、路径探索逻辑及对象克隆过程。
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; } }

 

转载于:https://www.cnblogs.com/zhaogeatdlnu/p/5707947.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值