İterasyon
🔄
0/100
En İyi Fitness
⭐
—
Popülasyon
👥
30
Durum
İşleniyor...
⏳ Bekliyor
📈 Yakınsama Eğrisi
🎯 Arama Uzayı (2D)
import numpy as np
import matplotlib.pyplot as plt
# =================================================================
# Whale Optimization Algorithm (WOA)
# Mirjalili & Lewis, 2016
# Generated by balina.alienes.me
# =================================================================
def objective_function(x):
"""Sphere Function - Global minimum at origin"""
return np.sum(x**2)
def WOA(obj_func, dim, pop_size, max_iter, lb, ub):
\"\"\"
Whale Optimization Algorithm
Parameters:
-----------
obj_func : callable - Objective function to minimize
dim : int - Number of dimensions
pop_size : int - Population size
max_iter : int - Maximum iterations
lb, ub : float - Lower and upper bounds
Returns:
--------
best_pos : array - Best solution found
best_fitness : float - Best fitness value
convergence : list - Convergence history
\"\"\"
# Initialize population
positions = np.random.uniform(lb, ub, (pop_size, dim))
fitness = np.array([obj_func(pos) for pos in positions])
# Find initial best
best_idx = np.argmin(fitness)
best_pos = positions[best_idx].copy()
best_fitness = fitness[best_idx]
convergence = [best_fitness]
for t in range(max_iter):
# Linearly decrease from 2 to 0
a = 2 - t * (2 / max_iter)
a2 = -1 + t * (-1 / max_iter)
for i in range(pop_size):
r1 = np.random.random()
r2 = np.random.random()
A = 2 * a * r1 - a
C = 2 * r2
b = 1
l = (a2 - 1) * np.random.random() + 1
p = np.random.random()
if p < 0.5:
if abs(A) < 1:
# Encircling prey (Exploitation)
D = abs(C * best_pos - positions[i])
positions[i] = best_pos - A * D
else:
# Search for prey (Exploration)
rand_idx = np.random.randint(pop_size)
X_rand = positions[rand_idx]
D = abs(C * X_rand - positions[i])
positions[i] = X_rand - A * D
else:
# Spiral update (Bubble-net attacking)
D = abs(best_pos - positions[i])
positions[i] = D * np.exp(b * l) * np.cos(2 * np.pi * l) + best_pos
# Boundary check
positions[i] = np.clip(positions[i], lb, ub)
# Evaluate
new_fitness = obj_func(positions[i])
fitness[i] = new_fitness
if new_fitness < best_fitness:
best_fitness = new_fitness
best_pos = positions[i].copy()
convergence.append(best_fitness)
print(f"Iteration {t+1}/{max_iter}, Best Fitness: {best_fitness:.6e}")
return best_pos, best_fitness, convergence
# ==================== MAIN ====================
if __name__ == "__main__":
# Parameters
dim = 2
pop_size = 30
max_iter = 100
lb = -10
ub = 10
# Run WOA
best_pos, best_fitness, convergence = WOA(
objective_function, dim, pop_size, max_iter, lb, ub
)
print("\n" + "="*50)
print("OPTIMIZATION RESULTS")
print("="*50)
print(f"Best Position: {best_pos}")
print(f"Best Fitness: {best_fitness:.10e}")
# Plot convergence curve
plt.figure(figsize=(10, 6))
plt.plot(convergence, 'b-', linewidth=2)
plt.xlabel('Iteration')
plt.ylabel('Best Fitness')
plt.title('WOA Convergence Curve')
plt.grid(True, alpha=0.3)
plt.yscale('log')
plt.tight_layout()
plt.savefig('woa_convergence.png', dpi=150)
plt.show()