Java 写的图形化蚁群算法 功能非常齐全 完整源码

今天为大家分享一个java语言编写的图形化蚁群算法,目前系统功能已经很全面,后续会进一步完善。整个系统界面漂亮,有完整得源码,希望大家可以喜欢。喜欢的帮忙点赞和关注。一起编程、一起进步

开发环境

开发语言为Java,开发环境Eclipse或者IDEA都可以,数据为MySQL。运行主程序,或者执行打开JAR文件即可以运行本程序。

系统框架

利用JDK自带的SWING框架开发,下载。纯窗体模式,直接运行Main文件即可以。同时带有详细得设计文档。

系统主要功能

蚁群算法简介

蚁群算法是受到对真实蚂蚁群觅食行为研究的启发而提出。生物学研究表明:一群相互协作的蚂蚁能够找到食物和巢穴之间的最短路径,而单只蚂蚁则不能。生物学家经过大量细致观察研究发现,蚂蚁个体之间的行为是相互作用相互影响的。蚂蚁在运动过程中,能够在它所经过的路径上留下一种称之为信息素的物质,而此物质恰恰是蚂蚁个体之间信息传递交流的载体。蚂蚁在运动时能够感知这种物质,并且习惯于追踪此物质爬行,当然爬行过程中还会释放信息素。一条路上的信息素踪迹越浓,其它蚂蚁将以越高的概率跟随爬行此路径,从而该路径上的信息素踪迹会被加强,因此,由大量蚂蚁组成的蚁群的集体行为便表现出一种信息正反馈现象。某一路径上走过的蚂蚁越多,则后来者选择该路径的可能性就越大。蚂蚁个体之间就是通过这种间接的通信机制实现协同搜索最短路径的目标的。

假设m只蚂蚁在图的相邻节点间移动,从而协作异步地得到问题的解。每只蚂蚁的一步转移概率由图中的每条边上的两类参数决定:1. 信息素值也称信息素痕迹。2.可见度,即先验值。

2.信息素的更新方式有2种,一是挥发,也就是所有路径上的信息素以一定的比率进行减少,模拟自然蚁群的信息素随时间挥发的过程;二是增强,给评价值“好”(有蚂蚁走过)的边增加信息素。

3.蚂蚁向下一个目标的运动是通过一个随机原则来实现的,也就是运用当前所在节点存储的信息,计算出下一步可达节点的概率,并按此概率实现一步移动,逐此往复,越来越接近最优解。

4.蚂蚁在寻找过程中,或者找到一个解后,会评估该解或解的一部分的优化程度,并把评价信息保存在相关连接的信息素中。

设置参数

运行本蚁群算法,需要设置一些参数,这些参数是在Java 窗体里面根据需要进行动态的设置。

private Ant[] ants; // 蚂蚁

private int cityNum; // 城市数量

private int[] x; // X坐标矩阵

private int[] y; // Y坐标矩阵

private double[][] distance; // 距离矩阵

private double[][] pheromone; // 信息素矩阵

private int bestLength; // 最佳长度

private int[] bestTour; // 最佳路径

private int antNum; // 蚂蚁数量

private int generation; // 迭代次数

private double alpha; // 信息素重要程度系数

private double beta; // 城市间距离重要程度系数

private double rho; // 信息素残留系数

private int Q; // 蚂蚁循环一周在经过的路径上所释放的信息素总量

private int deltaType; // 信息素更新方式模型,0: Ant-quantity; 1: Ant-density; 2: Ant-cycle

运行方法和原理

1 下载压缩包后进行解压,把项目源码导入的IDEA或者EClIPSE中,运行Main.Java文件,启动应用程序

2 在界面上设置相关的参数

3 点击相关的参数,点击开始。

4 程序运行完成后,弹窗除计算出来的最佳的路径,并且展示程序运行时间

5 程序所有点都经过,而且避开障碍物。

系统运行效果

关键代码


package com.aco;


import java.io.IOException;

public class ACO {
    private Ant[] ants; // 蚂蚁
    private int cityNum; // 城市数量

    private int[] x; // X坐标矩阵
    private int[] y; // Y坐标矩阵
    private double[][] distance; // 距离矩阵
    private double[][] pheromone; // 信息素矩阵

    private int bestLength; // 最佳长度
    private int[] bestTour; // 最佳路径

    private int antNum; // 蚂蚁数量
    private int generation; // 迭代次数
    private double alpha; // 信息素重要程度系数
    private double beta; // 城市间距离重要程度系数
    private double rho; // 信息素残留系数
    private int Q; // 蚂蚁循环一周在经过的路径上所释放的信息素总量
    private int deltaType; // 信息素更新方式模型,0: Ant-quantity; 1: Ant-density; 2: Ant-cycle

    /**
     * 构造方法
     * @param cityNum
     * @param antNum
     * @param generation
     * @param alpha
     * @param beta
     * @param rho
     * @param Q
     */
    public ACO(int cityNum, int antNum, int generation, double alpha, double beta, double rho, int Q, int deltaType) {
        this.cityNum = cityNum;
        this.antNum = antNum;
        this.generation = generation;
        this.alpha = alpha;
        this.beta = beta;
        this.rho = rho;
        this.Q = Q;
        this.deltaType = deltaType;

        ants = new Ant[antNum];
    }

    /**
     * 初始化
     * @param filename
     * @throws IOException
     */
    public void init(String filename) throws IOException {
        // 从文件中获取X坐标矩阵、Y坐标矩阵
        x = ReadFile.getX(cityNum, filename);
        y = ReadFile.getY(cityNum, filename);

        // 计算距离矩阵
        getDistance(x, y);

        // 初始化信息素矩阵
        pheromone = new double[cityNum][cityNum];
        double start = 1.0 / ((cityNum - 1) * antNum); // 计算初始信息素数值
        for (int i = 0; i < cityNum; i++) {
            for (int j = 0; j < cityNum; j++) {
                pheromone[i][j] = start;
            }
        }

        // 初始化最佳长度及最佳路径
        bestLength = Integer.MAX_VALUE;
        bestTour = new int[cityNum + 1];

        // 初始化antNum个蚂蚁
        for (int i = 0; i < antNum; i++) {
            ants[i] = new Ant(cityNum);
            ants[i].init(distance, alpha, beta);
        }
    }

    /**
     * 计算距离矩阵
     * @param x
     * @param y
     * @throws IOException
     */
    private void getDistance (int[] x, int[] y) throws IOException {
        // 计算距离矩阵
        distance = new double[cityNum][cityNum];
        for (int i = 0; i < cityNum - 1; i++) {
            distance[i][i] = 0; // 对角线为0
            for (int j = i + 1; j < cityNum; j++) {
                distance[i][j] = Math.sqrt(((x[i] - x[j]) * (x[i] - x[j]) + (y[i] - y[j]) * (y[i] - y[j])) / 10.0);
                distance[j][i] = distance[i][j];
            }
        }
        distance[cityNum - 1][cityNum - 1] = 0;
    }

    /**
     * 解决TSP问题
     */
    public void solve() {
        // 迭代generation次
        for (int g = 0; g < generation; g++) {
            // 对antNum只蚂蚁分别进行操作
            for (int ant = 0; ant < antNum; ant++) {
                // 为每只蚂蚁分别选择一条路径
                for (int i = 1; i < cityNum; i++) {
                    ants[ant].selectNextCity(pheromone);
                }

                // 把这只蚂蚁起始城市再次加入其禁忌表中,使禁忌表中的城市最终形成一个循环
                ants[ant].getTabu().add(ants[ant].getFirstCity());

                // 若这只蚂蚁走过所有路径的距离比当前的最佳距离小,则覆盖最佳距离及最佳路径
                if (ants[ant].getTourLength() < bestLength) {
                    bestLength = ants[ant].getTourLength();
                    for (int k = 0; k < cityNum + 1; k++) {
                        bestTour[k] = ants[ant].getTabu().get(k).intValue();
                    }
                }

                // 更新这只蚂蚁信息素增量矩阵
                double[][] delta = ants[ant].getDelta();
                for (int i = 0; i < cityNum; i++) {
                    for (int j : ants[ant].getTabu()) {
                        if (deltaType == 0) {
                            delta[i][j] = Q; // Ant-quantity System
                        }
                        if (deltaType == 1) {
                            delta[i][j] = Q / distance[i][j]; // Ant-density System
                        }
                        if (deltaType == 2) {
                            delta[i][j] = Q / ants[ant].getTourLength(); // Ant-cycle System
                        }
                    }
                }
                ants[ant].setDelta(delta);
            }

            // 更新信息素
            updatePheromone();

            // 重新初始化蚂蚁
            for (int i = 0; i < antNum; i++) {
                ants[i].init(distance, alpha, beta);
            }
        }

        // 打印最佳结果
        print();
    }

    /**
     * 更新信息素
     */
    private void updatePheromone() {
        // 按照rho系数保留原有信息素
        for (int i = 0; i < cityNum; i++) {
            for (int j = 0; j < cityNum; j++) {
                pheromone[i][j] = pheromone[i][j] * rho;
            }
        }

        // 按照蚂蚁留下的信息素增量矩阵更新信息素
        for (int i = 0; i < cityNum; i++) {
            for (int j = 0; j < cityNum; j++) {
                for (int ant = 0; ant < antNum; ant++) {
                    pheromone[i][j] += ants[ant].getDelta()[i][j];
                }
            }
        }
    }

    /**
     * 在控制台中输出最佳长度及最佳路径
     */
    private void print() {
        System.out.println("最佳长度: " + bestLength);
        System.out.print("最佳路径: ");
        for (int i = 0; i < cityNum - 1; i++) {
            System.out.print(bestTour[i] + 1 + "-");
        }
        System.out.println(bestTour[cityNum - 1] + 1);
    }

    /**
     * 输出最佳路径
     * @return
     */
    public int[] getBestTour() {
        return bestTour;
    }

    /**
     * 输出最佳长度
     * @return
     */
    public int getBestLength() {
        return bestLength;
    }

    /**
     * 输出X坐标矩阵
     * @return
     */
    public int[] getX() {
        return x;
    }

    /**
     * 输出Y坐标矩阵
     * @return
     */
    public int[] getY() {
        return y;
    }
}

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 基于Powell蚁群算法图像配准的MATLAB源码主要包括以下几个步骤: 1. 读取待配准的原始图像和参考图像,并将其转换为灰度图像。 2. 对原始图像和参考图像进行预处理,如噪声去除、平滑等操作。 3. 初始化蚂蚁群算法的参数,包括蚂蚁数量、迭代次数、步长等。 4. 随机生成初始位置,并计算每只蚂蚁的适应度函数值。 5. 利用Powell优化算法进行迭代优化,不断更新蚂蚁的位置和适应度函数值。 6. 根据优化后的位置参数,对原始图像进行变换,将其与参考图像进行配准。 7. 计算配准后的图像与参考图像之间的相似度指标,如互信息、相对误差等。 8. 将配准后的图像保存,并输出相似度指标结果。 整个MATLAB源码实现的基本思路是通过Powell蚁群算法不断优化寻找原始图像与参考图像之间的最佳配准变换参数,并根据相似度指标判断配准效果的好坏。该算法综合了蚁群算法的全局搜索能力和Powell优化算法的局部搜索能力,使得图像配准结果更为准确和稳定。 需要注意的是,该源码只是一个简单的实例,实际应用中可能需要根据具体情况进行参数调整和优化。同时,配准图像的质量、噪声环境、分辨率等因素也会对配准效果产生一定影响。 ### 回答2: Powell蚁群算法图像配准(图像对齐)是一种基于蚁群算法和Powell算法的图像配准方法。该算法利用蚁群算法的搜索能力和Powell算法的优化能力,通过优化图像的平移、旋转和缩放参数,实现两幅图像的最佳对齐。 该算法的Matlab源码实现主要包括以下几个步骤: 1. 读取待配准的两幅图像,并将它们转换为灰度图像。 2. 初始化蚁群算法的参数,包括蚂蚁数量、最大迭代次数、信息素挥发因子等。 3. 初始化Powell算法的参数,包括待优化参数的初始值、允许的最大迭代次数等。 4. 根据蚁群算法和Powell算法的要求,设置适应度函数或误差函数。该函数用来衡量两幅图像之间的差异或对齐的效果。 5. 在蚂蚁数量和最大迭代次数范围内,通过蚁群算法寻找图像的最佳对齐参数,即找到最小误差函数值对应的参数。 6. 将找到的最佳对齐参数作为初始参数,通过Powell算法对参数进行进一步优化,使误差函数值进一步减小。 7. 根据最终的优化参数,对图像进行平移、旋转和缩放操作,实现图像的对齐。 8. 显示对齐后的图像,以及对齐参数的优化结果。 以上就是基于Powell蚁群算法图像配准的Matlab源码实现的步骤。需要注意的是,不同的算法实现可能会有一些变化,具体的源码实现可根据实际情况进行调整和优化。 ### 回答3: POWELL蚁群算法是一种基于模拟退火思想的全局优化算法,用于图像配准是为了找到图像之间的最佳变换参数,使得两幅图像能够对齐。以下是关于基于POWELL蚁群算法的图像配准MATLAB源码的回答。 首先,需要安装MATLAB软件,确保能够使用其图像处理工具箱和优化工具箱。 在MATLAB中,可以通过以下步骤实现基于POWELL蚁群算法的图像配准: 1. 读入两幅待配准的图像,可以使用imread函数。 2. 对图像进行预处理,如去噪、调整大小等,以减少噪声对配准结果的影响。 3. 定义配准的评价函数,例如评价两幅图像之间的相似度,可以使用结构相似性指数(SSIM)或均方误差(MSE)等。 4. 定义POWELL蚁群算法的参数,如迭代次数、蚁群数量、退火初始温度等。 5. 初始化蚁群的位置和速度,可以随机初始化或根据某种策略初始化。 6. 进行POWELL蚁群算法的迭代过程,包括更新蚁群位置、计算适应度值、更新速度等。 7. 在每次迭代中,根据当前位置和速度计算下一次迭代的位置,可以使用速度更新公式。 8. 计算适应度值,即将当前位置的图像与目标图像进行配准,得到一个评价指标。 9. 根据适应度值和设定的优化目标,更新蚁群位置和速度,使蚁群朝着更优的方向移动。 10. 重复步骤6到9,直到满足停止条件,如达到迭代次数或收敛。 11. 输出最佳的变换参数,即实现了图像配准的结果,可以使用imwarp函数将源图像进行相应的变换得到配准后的图像。 以上是基于POWELL蚁群算法的图像配准MATLAB源码的基本步骤,具体实现中还需根据具体问题进行相应修改和优化。MATLAB提供了丰富的图像处理和优化函数,有助于实现图像配准的过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机程序

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值