🐋 OptimDashboard

İ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()