MATLABによるサインコサインアルゴリズム(SCA)の実装

1. パラメータ設定

% パラメータ設定
population = 30; % 個体数
dimensions = 2; % 問題次元
upper_bounds = [5, 5]; % 変数の上限値
lower_bounds = [-5, -5]; % 変数の下限値
max_iterations = 150; % 最大反復回数
objective_func = @(x) sum(x.^2); % 適合度関数、必要に応じて調整可能

2. 初期個体群生成

% 初期個体群生成関数
function solutions = create_initial_population(pop_size, upper_bounds, lower_bounds, dims)
    solutions = zeros(pop_size, dims);
    for i = 1:pop_size
        for j = 1:dims
            solutions(i, j) = (upper_bounds(j) - lower_bounds(j)) * rand() + lower_bounds(j);
        end
    end
end

% 初期個体群の生成
initial_solutions = create_initial_population(population, upper_bounds, lower_bounds, dimensions);

3. 境界値チェック

% 境界値チェック関数
function solutions = enforce_boundaries(solutions, upper_bounds, lower_bounds, dims)
    num_solutions = size(solutions, 1);
    for i = 1:num_solutions
        for j = 1:dims
            if solutions(i, j) > upper_bounds(j)
                solutions(i, j) = upper_bounds(j);
            end
            if solutions(i, j) < lower_bounds(j)
                solutions(i, j) = lower_bounds(j);
            end
        end
    end
end

4. SCAアルゴリズム本体

% SCAアルゴリズム本体
function [best_solution, best_fitness, convergence_curve] = sine_cosine_algorithm(pop_size, dims, upper_bounds, lower_bounds, obj_func, max_iter)
    a_param = 3; % 制御パラメータ
    solutions = create_initial_population(pop_size, upper_bounds, lower_bounds, dims); % 初期個体群生成
    fitness_values = zeros(1, pop_size); % 適合度値の初期化
    for i = 1:pop_size
        fitness_values(i) = obj_func(solutions(i, :)); % 適合度値の計算
    end
    [sorted_fitness, indices] = sort(fitness_values);
    global_best_solution = solutions(indices(1), :);
    global_best_fitness = sorted_fitness(1);
    convergence_curve = zeros(1, max_iter); % 収束曲線

    for iteration = 1:max_iter
        r1 = a_param - iteration * (a_param / max_iter); % r1の計算
        for i = 1:pop_size
            for j = 1:dims
                r2 = rand() * (2 * pi);
                r3 = 2 * rand();
                r4 = rand();
                if r4 < 0.5
                    % サイン更新
                    solutions(i, j) = solutions(i, j) + r1 * sin(r2) * abs(r3 * global_best_solution(j) - solutions(i, j));
                else
                    % コサイン更新
                    solutions(i, j) = solutions(i, j) + r1 * cos(r2) * abs(r3 * global_best_solution(j) - solutions(i, j));
                end
            end
            solutions(i, :) = enforce_boundaries(solutions(i, :), upper_bounds, lower_bounds, dims); % 境界値チェック
        end
        for i = 1:pop_size
            fitness_values(i) = obj_func(solutions(i, :));
            if fitness_values(i) < global_best_fitness
                global_best_fitness = fitness_values(i);
                global_best_solution = solutions(i, :);
            end
        end
        convergence_curve(iteration) = global_best_fitness;
    end
    best_solution = global_best_solution;
    best_fitness = global_best_fitness;
end

5. SCAアルゴリズムの実行

% SCAアルゴリズムの実行
[optimal_solution, optimal_fitness, convergence] = sine_cosine_algorithm(population, dimensions, upper_bounds, lower_bounds, objective_func, max_iterations);

% 結果の表示
disp(['最適解: ', num2str(optimal_solution)]);
disp(['最適適合度値: ', num2str(optimal_fitness)]);

% 収束曲線のプロット
figure;
plot(convergence, 'b-', 'LineWidth', 2);
title('サインコサインアルゴリズムの収束曲線');
xlabel('反復回数');
ylabel('適合度値');

説明

  1. パラメータ設定:個体数、問題次元、変数の上下限値、最大反復回数、および適合度関数を定義します。
  2. 初期個体群生成:ランダムに初期個体群を生成します。
  3. 境界値チェック:個体群の個体が変数の上下限値を超えないようにします。
  4. SCAアルゴリズム本体:サインコサインアルゴリズムの核心ロジックを実装し、グローバル探索と局所開発の両方の段階を含みます。
  5. SCAアルゴリズムの実行:SCAアルゴリズムを実行し、最適解と適合度値を出力し、収束曲線をプロットします。

タグ: MATLAB 最適化アルゴリズム サインコサインアルゴリズム 計算機科学

7月14日 00:21 投稿