Main Content

이 번역 페이지는 최신 내용을 담고 있지 않습니다. 최신 내용을 영문으로 보려면 여기를 클릭하십시오.

유전 알고리즘을 사용하여 적합도 함수 코딩 및 최소화하기

이 예제에서는 다음과 같은 3가지 기법을 사용하여 유전 알고리즘 솔버 ga에 대한 적합도 함수를 만들고 최소화하는 방법을 보여줍니다.

  • 기본

  • 추가 파라미터 포함

  • 속도를 위한 벡터화

기본 적합도 함수

기본 적합도 함수는 최적화 함수의 일반적인 테스트 함수인 로젠브록 함수입니다. 이 함수는 제곱합입니다.

f(x)=100(x12-x2)2+(1-x1)2.

함수는 점 [1,1]에서 최솟값 0을 가집니다. 로젠브록 함수는 매우 가파르기 때문에 1 더하기 함수의 로그를 플로팅합니다.

fsurf(@(x,y)log(1 + 100*(x.^2 - y).^2 + (1 - x).^2),[0,2])
title('log(1 + 100*(x(1)^2 - x(2))^2 + (1 - x(1))^2)')
view(-13,78)
hold on
h1 = plot3(1,1,0.1,'r*','MarkerSize',12);
legend(h1,'Minimum','Location','best');
hold off

적합도 함수 코드

simple_fitness 함수 파일은 로젠브록 함수를 구현합니다.

type simple_fitness
function y = simple_fitness(x)
%SIMPLE_FITNESS fitness function for GA

%   Copyright 2004 The MathWorks, Inc. 

  y = 100 * (x(1)^2 - x(2)) ^2 + (1 - x(1))^2;

적합도 함수는 하나의 입력값 x를 받아야 합니다. 여기서 x는 문제의 변수 개수만큼의 요소를 가진 행 벡터입니다. 적합도 함수는 함수의 값을 계산하고 하나의 반환 인수 y에서 해당 스칼라 값을 반환합니다.

ga를 사용하여 최소화하기

ga를 사용하여 적합도 함수를 최소화하려면 함수 핸들과 문제의 변수 개수를 모두 적합도 함수로 전달합니다. ga가 관련 영역을 검토하도록 하려면 범위 -3 <= x(i) <= 3를 포함합니다. 범위를 numberOfVariables 뒤의 다섯 번째와 여섯 번째 인수로 전달합니다. ga 구문의 세부 정보는 ga 항목을 참조하십시오.

ga는 무작위 알고리즘입니다. 재현이 가능하도록 난수 스트림을 설정합니다.

rng default % For reproducibility
FitnessFunction = @simple_fitness;
numberOfVariables = 2;
lb = [-3,-3];
ub = [3,3];
[x,fval] = ga(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub)
Optimization terminated: maximum number of generations exceeded.
x = 1×2

    1.5083    2.2781

fval = 0.2594

솔버가 반환한 xga가 계산한 최종 모집단의 최적점입니다. fval은 점 x에서 실행된 함수 simple_fitness의 값입니다. ga는 특별히 양호하다고 할 만한 해를 찾지 못했습니다. 해를 개선하는 방법을 확인하려면 유전 알고리즘 옵션의 영향 항목을 참조하십시오.

추가 파라미터를 포함하는 적합도 함수

때때로 적합도 함수는 최적화 중에 상수로 작용하는 추가 파라미터를 가집니다. 예를 들어, 일반화된 로젠브록 함수는 상수 100과 1을 나타내는 추가 파라미터를 가질 수 있습니다.

f(x,a,b)=a(x12-x2)2+(b-x1)2.

ab는 최적화 중에 상수로 작용하는, 적합도 함수에 대한 파라미터입니다(최소화 과정의 일부로 변경되지 않음). parameterized_fitness.m 파일은 이 파라미터화된 적합도 함수를 구현합니다.

type parameterized_fitness
function y = parameterized_fitness(x,p1,p2)
%PARAMETERIZED_FITNESS fitness function for GA

%   Copyright 2004 The MathWorks, Inc.        
 
y = p1 * (x(1)^2 - x(2)) ^2 + (p2 - x(1))^2;

추가 파라미터를 사용하여 최소화하기

익명 함수를 사용하여 추가 인수, 즉 상수 ab의 값을 캡처합니다. 하나의 입력값 x를 받아 x, a, b와 함께 parameterized_fitness을 호출하는 익명 함수에 대한 함수 핸들 FitnessFunction을 만듭니다. 익명 함수에는 함수 핸들이 만들어질 때 존재한 a와 b의 값이 포함됩니다.

a = 100;
b = 1; % define constant values
FitnessFunction = @(x) parameterized_fitness(x,a,b);
[x,fval] = ga(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub)
Optimization terminated: maximum number of generations exceeded.
x = 1×2

    1.3198    1.7434

fval = 0.1025

추가 파라미터 전달하기 항목을 참조하십시오.

벡터화된 적합도 함수

속도를 높이려면 적합도 함수를 벡터화합니다. 벡터화된 적합도 함수는 점 모음의 적합도를 한 번에 계산하므로, 일반적으로 이러한 점을 개별적으로 실행하는 것보다 시간을 절약할 수 있습니다. 벡터화된 적합도 함수를 작성하려면 함수가 각 행렬 행이 한 점을 나타내는 행렬을 허용하고 적합도 함수가 적합도 함수 값으로 구성된 열 벡터를 반환하도록 합니다.

parameterized_fitness 함수 파일을 벡터화된 형식으로 변경하려면 다음을 수행합니다.

  • 각 변수 x(i)x(:,i)로 변경합니다. 즉, x(i)에 대응하는 변수의 열 벡터를 의미합니다.

  • 각 벡터 곱셈 *.*으로 변경하고 각 지수 ^.^로 변경하여 연산이 요소별로 이루어짐을 나타냅니다. 이 코드에는 벡터 곱셈이 없으므로 지수를 변경하기만 하면 됩니다.

type vectorized_fitness
function y = vectorized_fitness(x,p1,p2)
%VECTORIZED_FITNESS fitness function for GA

%   Copyright 2004-2010 The MathWorks, Inc.  

y = p1 * (x(:,1).^2 - x(:,2)).^2 + (p2 - x(:,1)).^2;

이 적합도 함수의 벡터화된 버전은 무작위 점 개수, 의미 및 무작위 행 수를 가진 행렬 x를 받고, x와 동일한 행 수를 가진 열 벡터 y를 반환합니다.

솔버에 적합도 함수가 'UseVectorized' 옵션에서 벡터화되었다고 알려줍니다.

options = optimoptions(@ga,'UseVectorized',true);

옵션을 마지막 인수로 ga에 포함합니다.

VFitnessFunction = @(x) vectorized_fitness(x,100,1);
[x,fval] = ga(VFitnessFunction,numberOfVariables,[],[],[],[],lb,ub,[],options)
Optimization terminated: maximum number of generations exceeded.
x = 1×2

    1.6219    2.6334

fval = 0.3876

속도의 차이는 어떻습니까? 벡터화를 사용한 최적화 시간과 사용하지 않는 최적화 시간을 모두 잽니다.

tic
[x,fval] = ga(VFitnessFunction,numberOfVariables,[],[],[],[],lb,ub,[],options);
Optimization terminated: maximum number of generations exceeded.
v = toc;
tic
[x,fval] = ga(FitnessFunction,numberOfVariables,[],[],[],[],lb,ub);
Optimization terminated: maximum number of generations exceeded.
nv = toc;
fprintf('Using vectorization took %f seconds. No vectorization took %f seconds.\n',v,nv)
Using vectorization took 0.153337 seconds. No vectorization took 0.212880 seconds.

이 경우, 적합도 함수를 계산하는 데 시간이 거의 걸리지 않기 때문에 벡터화에 의한 속도 개선이 크지는 않았습니다. 그러나 시간이 더 오래 걸리는 적합도 함수의 경우 벡터화가 유용할 수 있습니다. Vectorize the Fitness Function 항목을 참조하십시오.

관련 항목