好紧张啊,写一个WOA算法吧

Java 版  WOA算法

public class WOA {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        long startTime = System.currentTimeMillis();    //获取开始时间
        int SearchAgents_no = 130; //种群规模
        double Max_iter = 500;//最大迭代次数
        int dim = 30; //测试函数维度
        int ub = 100;//搜索上限
        int lb = -100;//下限
        System.out.println((WOA0(SearchAgents_no, Max_iter, dim, ub, lb)));
        long endTime = System.currentTimeMillis();    //获取结束时间
        System.out.println("程序运行时间:" + (endTime - startTime) + "ms");    //输出程序运行时间
    }

    public static double WOA0(int SearchAgents_no, double Max_iter, int dim, int ub, int lb) {
        double[] Leader_pos = new double[(int)dim+1];
        double Leader_score = Integer.MAX_VALUE;
        double[][] Positions = initialization(SearchAgents_no, dim, ub, lb);
        double[] Convergence_curve = new double[(int) Max_iter];
        int t = 0;
        while (t < Max_iter) {
//                看是否越界
            for (int i = 0; i < SearchAgents_no; i++) {
                for (int j = 0; j < dim; j++) {
                    if (Positions[i][j] > ub)
                        Positions[i][j] = ub;
                    if (Positions[i][j] < lb)
                        Positions[i][j] = lb;
                }
//                选择目标函数
                double fitness = fobj2(Positions, i);
                if (fitness < Leader_score) {
                    Leader_score = fitness;
                    Leader_pos = Positions[i];
                }
            }
            
            double a = 2.0 - t * ((2) / Max_iter);
            double a2 = -1.0 + t * ((-1) / Max_iter);
            double r1;
            double r2;
            double p;
            for (int i = 0; i < SearchAgents_no; i++) {
                r1 = Math.random();
                r2 = Math.random();

                double A = 2 * a * r1 - a;
                double C = 2 * r2;
                int b = 1;
                double l = (a2 - 1) * Math.random() + 1;
                p = Math.random();

                for (int j = 0; j < dim; j++) {
                    if (p < 0.5) {
                        if (Math.abs(A) >= 1) {
                            int rand_leader_index = (int) Math.floor(SearchAgents_no * Math.random() );
                            double[] X_rand = Positions[rand_leader_index];
                            double D_X_rand = Math.abs(C * X_rand[j] - Positions[i][j]);
                            Positions[i][j] = X_rand[j] - A * D_X_rand;
                        } else {
                            double D_Leader = Math.abs(C * Leader_pos[j] - Positions[i][j]);
                            Positions[i][j] = Leader_pos[j] - A * D_Leader;
                        }
                    } else {
                        double distance2Leader = Math.abs(Leader_pos[j] - Positions[i][j]);
                        Positions[i][j] = distance2Leader * Math.exp(b * l) * Math.cos(l * 2 * Math.PI) + Leader_pos[j];
                    }
                }

            }
            Convergence_curve[t] = Leader_score;
            t = t + 1;
        }
//        Leader_pos[dim-1] = Leader_score;
        return Leader_score;
    }

    private static double fobj(double[][] Positions, int i) {
        double fit = 0;
        for (int j = 0; j < Positions[0].length; j++) {
            fit = Positions[i][j] * Positions[i][j] + fit;
        }
        return fit;
    }

    private static double fobj2(double[][] Positions, int i) {
        double fit2 = 0;
        double fit1 = 1;
        for (int j = 0; j < Positions[0].length; j++) {
            fit2 = Math.abs(Positions[i][j]) + fit2;
            fit1 = fit1 * Math.abs(Positions[i][j]);
        }
        return fit1 + fit2;
    }
    
    public static double[][] initialization(int SearchAgents_no, int dim, int ub, int lb) {
        double[][] position = new double[SearchAgents_no][dim];
        for (int i = 0; i < SearchAgents_no; i++) {
            for (int j = 0; j < dim; j++) {
                position[i][j] = Math.random() * (ub - lb) + lb;
            }
        }

        return position;

    }
}


全部评论

相关推荐

07-29 14:49
门头沟学院 Java
ResourceUt...:浙大✌️吉祥
点赞 评论 收藏
分享
机械打工仔:有说的你怀疑一下就行了,直接问也太实诚了
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务