import numpy as np
# تابع هدف (در اینجا تابع Sphere)
def sphere_function(x):
return np.sum(x ** 2)
# الگوریتم گرگ خاکستری
class GWO:
def __init__(self, obj_function, dim, n_agents, max_iter, lb, ub):
self.obj_function = obj_function # تابع هدف
self.dim = dim # تعداد ابعاد
self.n_agents = n_agents # تعداد گرگها
self.max_iter = max_iter # تعداد تکرارها
self.lb = lb # کران پایین
self.ub = ub # کران بالا
# مقداردهی اولیه گرگها (موقعیت تصادفی در فضای جستجو)
self.positions = np.random.uniform(self.lb, self.ub, (self.n_agents, self.dim))
# بهترین گرگها: آلفا، بتا و دلتا
self.alpha_pos = np.zeros(self.dim)
self.alpha_score = float("inf")
self.beta_pos = np.zeros(self.dim)
self.beta_score = float("inf")
self.delta_pos = np.zeros(self.dim)
self.delta_score = float("inf")
# حلقه اصلی الگوریتم
def optimize(self):
for iter in range(self.max_iter):
for i in range(self.n_agents):
# محدود کردن موقعیت گرگها به محدوده مشخصشده
self.positions[i, :] = np.clip(self.positions[i, :], self.lb, self.ub)
# محاسبه تابع هدف
fitness = self.obj_function(self.positions[i, :])
# بهروزرسانی آلفا، بتا و دلتا
if fitness < self.alpha_score:
self.alpha_score = fitness
self.alpha_pos = self.positions[i, :].copy()
elif fitness < self.beta_score:
self.beta_score = fitness
self.beta_pos = self.positions[i, :].copy()
elif fitness < self.delta_score:
self.delta_score = fitness
self.delta_pos = self.positions[i, :].copy()
# بهروزرسانی پارامترها
a = 2 - iter * (2 / self.max_iter) # کاهش خطی پارامتر a
for i in range(self.n_agents):
A1 = 2 * a * np.random.random(self.dim) - a
C1 = 2 * np.random.random(self.dim)
A2 = 2 * a * np.random.random(self.dim) - a
C2 = 2 * np.random.random(self.dim)
A3 = 2 * a * np.random.random(self.dim) - a
C3 = 2 * np.random.random(self.dim)
# موقعیت آلفا
D_alpha = abs(C1 * self.alpha_pos - self.positions[i, :])
X1 = self.alpha_pos - A1 * D_alpha
# موقعیت بتا
D_beta = abs(C2 * self.beta_pos - self.positions[i, :])
X2 = self.beta_pos - A2 * D_beta
# موقعیت دلتا
D_delta = abs(C3 * self.delta_pos - self.positions[i, :])
X3 = self.delta_pos - A3 * D_delta
# بهروزرسانی موقعیت گرگها
self.positions[i, :] = (X1 + X2 + X3) / 3
# نمایش بهترین نتیجه در هر تکرار
print(f"Iteration {iter + 1}, Best score: {self.alpha_score}")
# نتیجه نهایی
return self.alpha_pos, self.alpha_score
# تنظیمات الگوریتم
dim = 5 # تعداد ابعاد
n_agents = 30 # تعداد گرگها
max_iter = 500 # تعداد تکرارها
lb = -10 # کران پایین
ub = 10 # کران بالا
# اجرای الگوریتم
gwo = GWO(sphere_function, dim, n_agents, max_iter, lb, ub)
best_position, best_score = gwo.optimize()
print("Best position:", best_position)
print("Best score:", best_score)
- تابع هدف: تابع
sphere_function
برای محاسبه مقدار تابع هدف استفاده میشود. این تابع به راحتی قابل تغییر است.
- کلاس GWO:
- این کلاس شامل تمامی مراحل الگوریتم گرگ خاکستری است، از جمله مقداردهی اولیه، بهروزرسانی موقعیتها و بهینهسازی.
- موقعیت گرگهای آلفا، بتا و دلتا در طول فرآیند بهروزرسانی میشود.
- تابع
optimize
: این تابع حلقه اصلی الگوریتم را شامل میشود و موقعیت گرگها را در هر تکرار بهروزرسانی میکند.
- پارامترها:
dim
: تعداد ابعاد مسئله.
n_agents
: تعداد گرگها یا عاملهای جستجو.
max_iter
: تعداد تکرارهای الگوریتم.
lb
و ub
: کرانهای پایین و بالای فضای جستجو.
این کد به راحتی قابل تغییر و تنظیم برای مسائل مختلف بهینهسازی است. کافی است تابع هدف و پارامترهای مسئله خود را بهروزرسانی کنید.