Matlab에서 두 포인트 크로스 오버를 구현하는 가장 좋은 방법은 무엇입니까? 2 포인트 크로스 오버는 here으로 설명됩니다. 내 응용 프로그램에서는 어디서나 목록을 분할 할 수 없습니다. 그것들은 4 개로 그룹 지어지기 때문에리스트를 분리 할 수있는 곳 (염색체)은 4, 8, 12 등입니다 (내 응용 프로그램은 선형 유전 프로그래밍 문제이기 때문에).Matlab의 두 포인트 크로스 오버
나는 이것을 시도했지만 때로는 4로 균등하게 나눌 수없는 많은 수의 요소가있는 염색체를 얻지 못한다. 어떻게 작동시키는 지 알아내는 데 도움이 필요합니다.
function newPopulation = Crossover(population, p)
newPopulation = population;
for i=1:2:length(population)
if p < rand
[newPopulation{i}, newPopulation{i+1}] = PerformCrossover(newPopulation{i}, newPopulation{i+1});
end
end
end
function [newChromosome1, newChromosome2] = PerformCrossover(c1, c2)
l1 = length(c1)/4;
l2 = length(c2)/4;
i1 = 4*sort(randperm(l1, 2))-[3 4];
i2 = 4*sort(randperm(l2, 2))-[3 4];
newChromosome1 = [ c1(1:l1<i1(1)) c2(i2(1):i2(2)) c1(1:l1>i1(2)) ];
newChromosome2 = [ c2(1:l2<i2(1)) c1(i1(1):i1(2)) c2(1:l2>i2(2)) ];
end
EDIT. 혼란이있는 것 같습니다. 내 코드에서 설명하는 크로스 오버 버전을 원한다. 이 코드에서 각 염색체의 세그먼트는 같은 길이가 아닙니다. 이것은 스왑을 할 때 염색체의 크기를 변경한다는 의미입니다. 맥마 (McMa)에 대한 더 자세한 설명은 논평에서 찾아 볼 수있다.
난수는 생성하기가 상당히 저렴합니다. 라운드 (rand (1) * length (chromosomeLength)/4) * 4를 통해 첫 번째 난수를 생성 한 다음 동일한 수식을 통해 두 번째 난수를 생성하고 이것이 과거와 동일한 지 확인하십시오. – ASantosRibeiro
@ASantosRibeiro 왜 내가 현재하고있는 것보다 더 나아질까요? –
그것은 이미 최적화 된 문제를 이해하지 못하기 때문에 정확히 같은 (임의의 생성자와 동일한 이데올로기) 동일합니다. – ASantosRibeiro