このディレクトリの索引

'多点交叉'(_親1,_親2,_交叉点の個数,_1点交叉後の親1,_1点交叉後の親2) :-
        '1点交叉の素直な拡張である多点交叉は,親1,親2の文字列上で交叉点"|"をランダムに複数個選び,交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する'(_親1,_親2,_交叉点の個数,_1点交叉後の親1,_1点交叉後の親2).


'1点交叉の素直な拡張である多点交叉は,親1,親2の文字列上で交叉点"|"をランダムに複数個選び,交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する'(_親1,_親2,_交叉点の個数,_1点交叉後の親1,_1点交叉後の親2) :-
        '交叉点をランダムに複数個選び、'(_親1,_親2,_交叉点の個数,_交叉点ならび),
        '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する'(_親1,_親2,_交叉点ならび,_1点交叉後の親1,_1点交叉後の親2).


'交叉点をランダムに複数個選び、'(_親1,_親2,_交叉点の個数,_交叉点ならび) :-
        length(_親1,_長さ1),
        length(_親2,_長さ2),
        '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点の個数,_交叉点ならび).

'交叉点をランダムに複数個選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点の個数,_交叉点ならび) :-
        _長さ1 =< _長さ2,
        '交差点をランダムに複数個選び、'(_長さ1,_交叉点の個数,_交叉点ならび),!.
'交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点の個数,_交叉点) :-
        '交差点をランダムに複数個選び、'(_長さ2,_交叉点の個数,_交叉点ならび),!.

'交差点をランダムに複数個選び、'(_長さ1,_交叉点の個数,_交叉点ならび) :-
        '交差点をランダムに複数個選び、'(_長さ1,_交叉点の個数,[],_交叉点ならび).
'交差点をランダムに複数個選び、'(_,0,_交叉点ならび,_交叉点ならび) :- !.
'交差点をランダムに複数個選び、'(_長さ1,N,L1,_交叉点ならび) :-
        R is random(_長さ1),
        整列を保ちつつ挿入する(R,L1,L2),
        N_1 is N - 1,
        '交差点をランダムに複数個選び、'(_長さ1,N_1,L2,_交叉点ならび),!.
'交差点をランダムに複数個選び、'(_長さ1,N,L1,_交叉点ならび) :-
        '交差点をランダムに複数個選び、'(_長さ1,N,L1,_交叉点ならび).

整列を保ちつつ挿入する(M,[],[M]).
整列を保ちつつ挿入する(M,[N|R],[M,N|R]) :-
        M < N,!.
整列を保ちつつ挿入する(M,[N|R1],[N|R2]) :-
        M > N,
        整列を保ちつつ挿入する(M,R1,R2),!.

'交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2をならびとして生成する'(_親1,_親2,_交叉点ならび,_1点交叉後の親1,_1点交叉後の親2) :-
        '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,_交叉点ならび,_1点交叉後の親1の部分文字列ならび,_1点交叉後の親2の部分文字列ならび),
        atomic_list_concat(_1点交叉後の親1の部分文字列ならび,_1点交叉後の親1).
        atomic_list_concat(_1点交叉後の親2の部分文字列ならび,_1点交叉後の親2).

'交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,[],[],[]).
'交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,[_交叉点],[_親1部分文字列],[_親2部分文字列]) :-
        sub_atom(_親1,_交叉点,_,0,_親1部分文字列),
        sub_atom(_親2,_交叉点,_,0,_親2部分文字列).
'交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,[_交叉点1,_交叉点2|R1],[_親1部分文字列_1,_親2部分文字列_2|R2],[_親2部分文字列_1,_親1部分文字列_2|R3]) :-
        sub_atom(_親1,0,_交叉点1,_,_親1部分文字列_1),
        sub_atom(_親2,0,_交叉点2,_,_親2部分文字列_1),
        _交叉2の長さ is _交叉点2 - _交叉点1,
        sub_atom(_親1,_交叉点1,_交叉2の長さ,_,_親1部分文字列_2),
        sub_atom(_親2,_交叉点1,_交叉2の長さ,_,_親2部分文字列_2),
        '交叉点の間で交互に2つの親の部分文字列をそっくりそのまま交換して,子1,子2を部分文字列ならびとして生成する'(_親1,_親2,R1,R2,R3).