2. 유전자 초기화 및 각종 작업 프로시저
앞에서 이야기한 것처럼 오델로플레이어가 기존에 마주치지 못했던 패턴을 만난다면 그 패턴을 추가합니다. 그러므로 초기화는 유전자묶음을 비우는 것으로 할 수 있습니다.
procedure GeneInitialize(gene)
.. gene.Size := 0;
end
그리고, 현 상황에서 만든 패턴을 가지고 가중치를 가져오기 위한 프로시저(함수)입니다.
fuction WeightOfPattern(gene, pattern)
.. for k := 0, gene.Size do
..... // gene.Pair[k]는 패턴과 가중치의 쌍
..... if IsSamePattern(gene.Pair[k].Pattern, pattern) then
........ // 패턴이 일치할 경우
........ return gene.Pair[k].Weight;
..... end
.. end
.. // 같은 패턴을 찾지 못했을 경우 패턴추가
.. // gene.Size위치에 추가
.. rndweight := Random(0, 1) // 0~1 사이의 랜덤값
.. gene.Pair[gene.Size].Pattern := pattern;
.. gene.Pair[gene.Size].Weight := rndweight;
.. gene.Size := gene.Size + 1;
.. return rndweight;
end
즉 패턴을 찾았으면 해당패턴의 가중치를, 찾지 못했으면 임의의 가중치로 추가한 후 가중치를 리턴합니다.
이 함수에서 사용한 IsSamePattern은 다음과 같이 방향을 무시하고 비교하는 함수입니다.
function IsSamePattern(patternA, patternB)
.. lenA := patternA.PatternLength;
.. lenB := patternB.PatternLength;
.. if lenA != lenB then // 길이가 다를 경우
..... return false;
.. end
.. for k := 0, lenA do
..... if patternA[k] !=patternB[k] then // 다를 경우
........ break; // for루프 빠져나감
..... end
.. end
.. if k == lenA then // 루프를 다 돌았음 - 일치
..... return true;
.. end
.. for k := 0, lenA do
..... if patternA[k] != patternB[lenB - k - 1] then // 역순으로 비교, 다를경우
........ return false
..... end
.. end
.. return true; // 비교완료, 동일함
end
댓글 없음:
댓글 쓰기