吸引-排斥优化算法
论文参考
Karol Cymerys, Mariusz Oszust,Attraction–Repulsion Optimization Algorithm for Global Optimization Problems,Swarm and Evolutionary Computation,Volume 84, 2024, 101459, https://doi.org/10.1016/j.swevo.2023.101459.
demoGlobalOptimization.m
1 |
|
定义参数与设置:
SearchAgents_no = 40
:设定搜索代理(即种群个体)的数量为40。
Max_FES = 3000
:设置最大适应度函数评估次数为3000,作为算法的迭代终止条件。
NoRepeats = 3
:设置算法重复运行次数为3次,以获取多次运行结果的统计信息。
定义目标函数与问题维度:
fobj = @(x)F22(x)
:将目标函数F22封装为匿名函数fobj,用于计算给定解x的目标函数值。
dim = 100
:设定问题的维度为100,即目标函数的自变量为100维向量。
lb = -5.12 * ones(1,dim)
:设定搜索空间下界为-5.12的100维全1向量,即每个自变量的最小值均为-5.12。
ub = 5.12 * ones(1,dim)
:设定搜索空间上界为5.12的100维全1向量,即每个自变量的最大值均为5.12。
%%fmin = 0;
:注释行,未启用(可能原本打算设置目标函数最小值为0,但被注释掉了)。
初始化结果存储数组:
outputF=[]
:创建空矩阵outputF,用于存储每次运行得到的最佳目标函数值。
outputX=[]
:创建空矩阵outputX,用于存储每次运行得到的最佳解(即最优自变量值)。
主循环:重复运行AROA算法并记录结果
for k = 1:NoRepeats
:对于设定的重复次数(3次),执行以下操作。
1. tic
:开始计时,记录本次AROA算法运行时间。 2.
[Best_score, Best_pos, cg_curve] = AROA(SearchAgents_no,dim,lb,ub, fobj,Max_FES);
:调用AROA函数,输入参数包括搜索代理数量、问题维度、搜索空间上下界、目标函数以及最大适应度函数评估次数。函数返回本次运行的最佳目标函数值(Best_score)、最佳解(Best_pos)以及收敛曲线数据(cg_curve)。
3. toc
:结束计时,输出本次AROA算法运行时间。 4.
Best_score
:显示本次运行的最佳目标函数值。 5.
outputF = [outputF;Best_score];
:将本次最佳目标函数值添加到outputF矩阵中。
6.
outputX = [outputX;Best_pos];
:将本次最佳解添加到outputX矩阵中。
统计分析多次运行结果:
[Y,I] = min(outputF)
:从outputF矩阵中找出最小目标函数值(Y)及其对应的索引(I)。
Y
:显示最小目标函数值。
meanV = mean(outputF)
:计算outputF矩阵中所有最佳目标函数值的平均值(meanV)。
stdV = std(outputF)
:计算outputF矩阵中所有最佳目标函数值的标准差(stdV)。
综上所述,该代码使用AROA算法对具有100维搜索空间的问题进行全局优化,重复运行3次,并记录每次运行的最佳解和目标函数值。最后,对多次运行结果进行统计分析,输出最小目标函数值、平均值及标准差。
F22.m
1 |
|
AROA.m
1 |
|
解释: - N
: 搜索代理(种群个体)数量 -
dim
: 问题维度 - lb
: 搜索空间下界向量 -
ub
: 搜索空间上界向量 - fobj
:
目标函数(匿名函数) - maxEvals
: 最大适应度函数评估次数
函数返回以下输出结果:
fbest
: 找到的最小目标函数值xbest
: 对应最小目标函数值的最优解Convergence_curve
: 收敛曲线数据
算法参数定义 - 定义了AROA算法中涉及的多个常数参数,如c、fr1、fr2等,这些参数用于控制算法中不同操作的比例、强度等。
初始化 -
计算最大迭代次数tmax
,初始化评价计数器evalCounter
。
-
初始化用于记录全局最优解的fbest
、xbest
,以及用于记录收敛曲线的Convergence_curve
。
- 初始化搜索空间边界向量Xmin
、Xmax
。 -
随机生成初始种群X
,并对其进行适应度评估(通过evaluate_population
函数),得到目标函数值F
。根据F
找到当前全局最优解fbest
、xbest
,以及保存当前种群状态的X_memory
和F_memory
。
主循环(tmax次迭代) -
计算种群间距离矩阵D
(欧氏距离)。 -
根据当前迭代次数t
计算参数m
。 -
对每个搜索代理(i
)执行以下操作: - 计算吸引力-排斥力操作:
- 计算当前搜索代理与其他邻居间的吸引力-排斥力向量delta_ni
。
- 合并所有邻居的贡献得到ni
。 - 吸引至全局最优解操作: -
根据概率p1
决定是否使用随机缩放的全局最优解。 -
计算吸引至全局最优解的向量bi
。 - 局部搜索操作: -
根据概率p2
决定采用哪种局部搜索策略(高斯扰动、邻域扰动或均匀扰动)。
- 根据所选策略计算局部搜索向量ri
。 -
更新搜索代理位置:X(i,:) = X(i,:) + ni + bi + ri
。 -
对更新后的种群X
进行适应度评估(通过evaluate_population
函数),并检查是否找到新的全局最优解。
-
执行记忆操作(通过memory_operator
函数),更新种群X
和目标函数值F
,同时更新记忆中的种群状态X_memory
和F_memory
。
-
执行混沌扰动操作,对种群进行混沌移动,再次进行适应度评估并检查全局最优解。
- 再次执行记忆操作,更新相关变量。 -
记录当前迭代的全局最优解fbest
至收敛曲线Convergence_curve
。
辅助函数 -
evaluate_population(X, fobj, ub, lb, evalCounter, maxEvals)
:
评估种群X
在目标函数fobj
下的适应度,确保解位于搜索空间内,并更新评价计数器。
- memory_operator(X, F, X_memory, F_memory)
:
根据记忆中的最优解和当前种群的最优解,选择保留更好的解。 -
tanh(t, tmax, range)
:
计算双曲正切函数(tanh)的值,用于调整算法参数。 -
index_roulette_wheel_selection(F, k)
:
使用轮盘赌选择法在前k
个个体中按适应度比例选取一个个体的索引。
- roulette_wheel_selection(weights)
:
实现基本的轮盘赌选择算法,根据权重向量weights
随机选择一个索引。
选一个函数做测试(2维0-10范围的最小值为:-18.5547) 1
2
3
4
5
6
7function z = F22(x)
X = x(:, 1);
Y = x(:, 2);
%z = X.^2 + Y.^2 + (25 * (sin(X).^2 + sin(Y).^2));
z=X.*sin(4.*X)+ 1.1.*Y.*sin(2.*Y);
y = z;
end 1
2
3
4
5
6
7
8
9
10
11
12
13...
Y =
-18.5547
meanV =
-18.5547
stdV =
1.4862e-14
>>
测试函数: ## Rastrigin 1
2
3
4
5
6function z = F22(x)
% F22- Rastrigin lower=[-5.12], upper=[5.12] gminimum=[0], dim=30
n = size(x, 2);
A = 10;
z = (A * n) + (sum(x .^2 - A * cos(2 * pi .* x), 2));
end1
2
3
4
5
6
7
8
9
10
11Y =
1.0630e-11
meanV =
24.0180
stdV =
23.2159
1 |
|
Schwefel’s Problem 1.2
Schwefel’s Problem 1.2
https://al-roomi.org/component/content/article?id=188:schwefel-s-function-no-1-2-double-sum-or-rotated-hyper-ellipsoid-function
https://www.oreilly.com/library/view/evolutionary-computation-with/9781848218079/16_appendix01.xhtml
https://blog.csdn.net/abc991835105/article/details/127936204
1 |
|
1 |
|