资源简介

使用蚁群算法实现了单维的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


评论

共有 条评论