资源简介
使用蚁群算法实现了单维的01背包问题,自己写的,可直接运行AcoKP.java文件即可输出结果,收敛速度还可以,可根据自己需要修改参数
代码片段和文件信息
package AcoKP;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
/**
* AcoBP
* Author: wychen
* Date: 2017/12/13
* Time: 9:08
*/
public class AcoKP {
private int NC = 200;//迭代次数
private int antNum = 20;//蚂蚁数量
private float Q = 1.0f; //用于控制信息素增量到适度范围
private float rho = 0.1f;//蒸发系数
private float alpha = 3; //信息素重要程度
private float beta = 2; //启发式因子重要程度
private float eta; //启发式因子
private ArrayList ants = new ArrayList(); //蚁群
//所有物品对象
ArrayList resArrayList = new ArrayList();
/**
* 初始化蚁群
*
*/
public void intAnts(){
ants.clear();
for(int i = 0 ; i < antNum; i++){
Ant ant = new Ant(0.0f0.0f);
ants.add(ant);
}
}
/**
* 找出选取物体价值最优的蚂蚁
*
*/
public Ant getBestAnt(ArrayList ants){
Ant bestAnt = ants.get(0);
for(Ant ant : ants){
if(ant.getResValue() > bestAnt.getResValue()){
bestAnt = ant;
}
}
return bestAnt;
}
/**
* 初始化物品重量、价值、信息素浓度
*
*/
public void init(){
for (int i = 0 ; i < Constant.num; i++) {
Res res = new Res(Constant.thing[i][1]Constant.thing[i][0]Constant.pheromone);
res.setId(i);
resArrayList.add(res);
}
}
/**
* 赌轮法选择物品
*
* @param resList
* @return
*/
public int getMaxP(Ant curAnt ArrayList resList){
ArrayList canSelect = new ArrayList();//可选择物品列表
float totalVAP = 0.0f;
for(int i = 0 ; i < resList.size(); i++){
Res res = resList.get(i);
if(!curAnt.isSelectedRes(i)){
eta = res.getValue()/res.getWeight(); //启发信息
float vap = (float) (Math.pow(res.getPheromone()alpha) * Math.pow(etabeta));
totalVAP += vap;
CanSelectRes canSelectRes = new CanSelectRes(res.getId()vap);
canSelect.add(canSelectRes);
}
}
//计算每一个物品被选中的概率
ListIterator iterator = canSelect.listIterator();
while(iterator.hasNext()){
CanSelectRes obj = iterator.next();
obj.setP(obj.getVAP()/totalVAP);
}
//赌轮法获取选取物品对象
float rate = (float)Math.random();
ListIterator iter = canSelect.listIterator();
while(iter.hasNext()){
CanSelectRes canRes = iter.next();
if(rate <= canRes.getP()){
return canRes.getId();
} else {
rate = rate - canRes.getP();
}
}
//人为返回最后一个物品,精度导致
// iter = canSelect.listIterator();
// while(iter.hasNext()){
// CanSelectRes canSelect1 = iter.next();
//
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 5943 2017-12-17 10:51 AcoKP\AcoKP.java
文件 1261 2017-12-14 11:12 AcoKP\Ant.java
文件 733 2017-12-15 08:40 AcoKP\CanSelectRes.java
文件 826 2017-12-14 19:05 AcoKP\Constant.java
文件 1517 2017-12-14 15:37 AcoKP\Res.java
目录 0 2017-12-17 10:52 AcoKP
----------- --------- ---------- ----- ----
10280 6
相关资源
- 简单的java scoket p2p聊天程序
- 2018华为软件精英挑战赛复赛代码 by
- java微信版飞机大战
- 基于JAVA的windows经典纸牌游戏,适用于
- MQ工具类java
- java实验实现圆类Circle,Cylinder
- Spring技术栈构建完整java前后台团购网
- JAVA简历更新,三年工作经验
- 最新JAVA教学视频-共810G
- Myshopping购物系统
- 华南理工大学java期末考试真题
- Java基于Socket文件传输
- java音像店管理系统
- installanywhere 2009打包java桌面程序安装
- 滑动窗口协议模拟 JAVA.zip
- svm_java版本代码详细解释
- java实现汉诺塔小游戏
- 4.3读取摄像头并显示
- java2word jar包
- 图书管理系统 servlet+jsp适合初学者
- Java证书打印工具类
- java openCV 人脸识别 找茬
- 基于java旅游网站毕业论文
- JAVA动物识别系统266510
- java猴子选王
- java8+tomcat8+struts2.5+spring4.3+hibernate5.2框
- jdbc+控制台java+oracle模拟银行程序MVC思
- Java版剑指Offer全部测试用例
- java秒杀(高并发)视频教程
- 基于UDP协议的数据包收发程序代码+报
评论
共有 条评论