好紧张啊,写一个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;
}
}
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;
}
}