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