首页 云计算🌐

由于选择在云计算仿真平台CloudSim中进行算法的仿真实验,又恰巧CloudSim只能运行在Java虚拟机中,那用到的算法也就只能用Java代码实现
身为CV工程师,竟然在众多搜索引擎中没有找到BAS算法的Java代码,没办法 ,只好用手敲一遍咯~

PS.当我把这个代码复现后,真想说一句,Python和MATLAB真香
复现过程中,单单是矩阵运算就让我感觉你这Java分明是在为难我胖虎 ,最后找了很长一段时间才发现一个比较好用的 矩阵类库 ,可人家Python只需要一个符号就解决了哎

代码如下:

import org.ujmp.core.Matrix;

import static java.lang.Math.signum;

/**
 * BAS:天牛须搜索智能优化算法
 */
public class BAS {

    //迭代次数
    private static final int iter = 20;

    //维数
    private static final int dimension = 2;

    //质心坐标
    private static Matrix x;

    //左须气味强度
    private static double fLeft;

    //右须气味强度
    private static double fRight;


    /**
     * 计算左右须气味强度
     * @param X 左右须坐标
     * @return 左右须气味强度
     */
    public static double f(Matrix X){
        double y;
        y = 0.5 * (Math.pow(X.getAsDouble(0,0),2) + Math.pow(X.getAsDouble(1,0),2));
        return y;
    }

    /**
     * 计算下一步位置
     * @param X 左右须气味强度
     * @return 下一步位置
     */
    public static Matrix next(Matrix X, double step, Matrix dir, double fLeft, double fRight){
        Matrix Y;
        Y = X.minus(dir.times(step).times(signum(fLeft-fRight)));
        return Y;
    }

    /**
     * 算法主要流程
     */
    public static void process() {
        //初始质心坐标
        x = Matrix.Factory.randn(1,dimension);
        System.out.println("质心坐标:");
        System.out.println(x);
        //设置步长
        //步长
        double step = 1;
        System.out.println("步长:" + step);
        //迭代
        for (int i = 0; i < iter; i++) {
            System.out.println("\n\n# 第" + (i+1) + "次");

            //第一步
            //须的方向
            Matrix dir = Matrix.Factory.randn(1,dimension);
            System.out.println("须的方向:");
            System.out.print(dir);
            //步长处理
            step = 0.95 * step;
            System.out.println("处理完步长:" + step);
            //两须之间距离
            //两须之间距离
            double d0 = step / 2;
            System.out.println("两须之间距离:" + d0);
            //左须坐标
            Matrix xLeft = x.plus(dir.times(d0).times(0.5));
            System.out.println("左须坐标:");
            System.out.print(xLeft);
            //右须坐标
            Matrix xRight = x.minus(dir.times(d0).times(0.5));
            System.out.println("右须坐标:");
            System.out.print(xRight);

            //第二步
            //左须气味强度
            fLeft = f(xLeft);
            System.out.println("左须气味强度" + fLeft);
            //右须气味强度
            fRight = f(xRight);
            System.out.println("右须气味强度" + fRight);
            //下一步位置
            x = next(x,step,dir,fLeft,fRight);
        }
    }

    public static void main(String[] args) {
        System.out.println("----开始使用天牛须算法----");
        process();
        System.out.println("----共" + iter + "迭代次----");

        if (fLeft < fRight)
            System.out.println(fLeft);
        else
            System.out.println(fRight);

        System.out.println(x);
    }

}



文章评论