资源简介
使用蚁群算法实现了单维的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 毕业设计 进销存管理系统 源码
- java图片浏览器跨平台运行程序与源码
- 基于java的在线考试系统-毕业设计
- 微博系统(Java源码,servlet+jsp),适
- java串口通信全套完整代码-导入eclip
- jsonarray所必需的6个jar包.rar
- 三角网构TIN生成算法,Java语言实现
- java代码编写将excel数据导入到mysql数据
- Java写的cmm词法分析器源代码及javacc学
- JAVA JSP公司财务管理系统 源代码 论文
- JSP+MYSQL旅行社管理信息系统
- 推荐算法的JAVA实现
- 基于Java的酒店管理系统源码(毕业设
- java-图片识别 图片比较
- android毕业设计
- java23种设计模式+23个实例demo
- java Socket发送/接受报文
- JAVA828436
- java界面美化 提供多套皮肤直接使用
- 在线聊天系统(java代码)
- 基于Java的图书管理系统807185
- java中实现将页面数据导入Excel中
- java 企业销售管理系统
- java做的聊天系统(包括正规课程设计
- Java编写的qq聊天室
- 商店商品管理系统 JAVA写的 有界面
- JAVA开发聊天室程序
- 在linux系统下用java执行系统命令实例
- java期末考试试题两套(答案) 选择(
- JAVA3D编程示例(建模、交互)
川公网安备 51152502000135号
评论
共有 条评论