Äîêóìåíò âçÿò èç êýøà ïîèñêîâîé ìàøèíû. Àäðåñ îðèãèíàëüíîãî äîêóìåíòà : http://www.abitu.ru/en2002/closed/viewwork.html?work=24
Äàòà èçìåíåíèÿ: Fri May 5 15:25:32 2006
Äàòà èíäåêñèðîâàíèÿ: Tue Oct 2 02:18:07 2012
Êîäèðîâêà: koi8-r

Ïîèñêîâûå ñëîâà: ï ï ï ï ï ï ï ï

Ãåíåòè÷åñêèå àëãîðèòìû

Àâòîð: Êîðåíþøêèí Àíòîí Âàñèëüåâè÷


11 À êëàññ, Ñìîëåíñêèé Ïåäàãîãè÷åñêèé Ëèöåé.


ã. Ñìîëåíñê, e-mail toshakor@yandex.ru


Èñòîðèÿ

Òåîðèÿ ýâîëþöèè Äàðâèíà íå ìîãëà íå ïîäâèãíóòü ïðîãðàììèñòîâ íà
ñîçäàíèå ñèñòåì, äåéñòâóþùèõ ïî òåì æå ïðèíöèïàì, ÷òî è áèîëîãè÷åñêèå.
Ñíà÷àëà ýòî äåëàëîñü ëèøü äëÿ òîãî, ÷òîáû ïîñìîòðåòü, ÷òî ïîëó÷èòñÿ ïðè
ìîäåëèðîâàíèè åñòåñòâåííîé æèçíè íà êîìïüþòåðå, ýòîò ðàçäåë
ïðîãðàììèðîâàíèÿ ðàçâèâàëñÿ è ñåé÷àñ ìû åãî íàçûâàåì Artificial Life
(Èñêóññòâåííàÿ Æèçíü). Êîíêðåòíîãî ïðèìåíåíèÿ â äàííûé ìîìåíò åìó íå
íàéäåíî, íî â áóäóùåì âèäÿòñÿ íåâîîáðàçèìûå âûñîòû.
Íî êðîìå Èñêóññòâåííîé æèçíè ñóùåñòâóþò äðóãèå êîìïüþòåðíî-
áèîëîãè÷åñêèå ñèñòåìû, êîòîðûå óæå ñåé÷àñ ïðèìåíÿþòñÿ äëÿ ðåøåíèÿ ðàçëè÷íûõ
çàäà÷. Ê íèì ìîæíî îòíåñòè Ãåíåòè÷åñêîå Ïðîãðàììèðîâàíèå (Genetic
Programming), Ýâîëþöèîííûå Ñòðàòåãèè (Evolutionary Strategies), íó è
Ãåíåòè÷åñêèå Àëãîðèòìû (Genetic Algorithms, äàëåå ÃÀ), î êîòîðûõ ïîéä¸ò
ðå÷ü â äàííîé ñòàòüå.
Àâòîð ïîñòàâèë ñåáå öåëü îáúÿñíèòü ÷èòàòåëþ, ÷òî ÃÀ - ýòî íå êàêèå-òî
çàîáëà÷íûå äàëè, î êîòîðûõ èìåþò ïðàâî ãîâîðèòü òîëüêî ïðîôåññîðà, ýòî
âïîëíå ïðèìåíèìûé ìåòîä ðåøåíèÿ çàäà÷, êîòîðûå ñòàíîâÿòñÿ íà òåðíèñòîì ïóòè
íàïèñàíèÿ ïðîãðàìì! Äëÿ ïîíÿòíîñòè â õîäå ñòàòüè ìû ðàññìîòðèì ðåøåíèå
èçâåñòíîé çàäà÷è î êîììèâîÿæåðå ñ ïîìîùüþ ÃÀ. Äà, å¸ ìîæíî ðåøèòü ëèøü
ïîëíûì ïåðåáîðîì, íî ÃÀ è íå äàþò òî÷íûõ ðåøåíèé (îáû÷íî îøèáàþòñÿ íà 5-
10%), çàòî âïîëíå ñíîñíûé îòâåò äëÿ äâàäöàòè ãîðîäîâ íàøà ïðîãðàììà áóäåò
âûäàâàòü çà ïàðó ñåêóíä, à ñòàíäàðòíîìó àëãîðèòìó ïðèäåòñÿ ïîìó÷àòüñÿ,
ïåðåáèðàÿ 20! âàðèàíòîâ.

Òåîðèÿ

Ïðåæäå ÷åì ïðèñòóïèòü ê ðåøåíèþ íàøåé çàäà÷è, íóæíî èçó÷èòü íåìíîãî
òåîðèè, ïîýòîìó íàñòðîéòåñü íà ñîîòâåòñòâóþùèé ëàä.
 îáùèõ ÷åðòàõ ðàáîòó ÃÀ ìîæíî îïèñàòü òàê: îí ñîçäàåò ïîïóëÿöèþ
îñîáåé, êàæäàÿ èç êîòîðûõ ÿâëÿåòñÿ ðåøåíèåì çàäà÷è, à çàòåì ýòè îñîáè
ýâîëþöèîíèðóþò ïî ïðèíöèïó «âûæèâàåò ñèëüíåéøèé», òî åñòü îñòàþòñÿ ëèøü
ñàìûå îïòèìàëüíûå ðåøåíèÿ.
Òåïåðü ðàçáåðåìñÿ ïîïîäðîáíåå. Êàæäóþ îñîáü îïèñûâàåò õðîìîñîìà (â
íàøåì ñëó÷àå ýòî áóäåò ìàññèâ èç íîìåðîâ ãîðîäîâ, êîòîðûå ïî î÷åðåäè
ïðîõîäèò êîììèâîÿæåð), õðîìîñîìà ñîñòîèò èç ãåíîâ (íîìåðà ãîðîäîâ), êîòîðûå
ðàñïîëàãàþòñÿ â îïðåäåëåííûõ ïîçèöèÿõ (ëîêóñàõ) õðîìîñîìû. Âîîáùå, â
áîëüøèíñòâå ñëó÷àåâ õðîìîñîìà ïðåäñòàâëÿåò ñîáîé áèòîâóþ ñòðîêó, ãäå êàæäûé
áèò - ãåí, íî ïðîãðàììèñò âîëåí âûáèðàòü òó ôîðìó, êîòîðàÿ óäîáíåå äëÿ
ðåøåíèÿ åãî çàäà÷è. Èòàê, âñÿ íàñëåäñòâåííàÿ èíôîðìàöèÿ, èëè ãåíîòèï,
õðàíèòñÿ â õðîìîñîìàõ.
Ðàáîòà ÃÀ èìèòèðóåò åñòåñòâåííóþ æèçíü, òîëüêî ñèëüíî óïðîùåííóþ. Íà
ðèñ1 ïðåäñòàâëåíà áëîê-ñõåìà ñòàíäàðòíîãî ÃÀ. Ðàññìîòðèì êàæäûé èç
îïåðàòîðîâ ÃÀ:




























1)Ñîçäàíèå ïîïóëÿöèè.
Íà ýòîì ýòàïå ñ ïîìîùüþ ñ÷åò÷èêà ñëó÷àéíûõ ÷èñåë ìû ñîçäàåì
íà÷àëüíóþ èëè ñòàðòîâóþ ïîïóëÿöèþ îñîáåé.

2)Ñåëåêöèÿ.
Çäåñü àëãîðèòì âûáèðàåò îñîáåé â ñëåäóþùåå ïîêîëåíèå. Ïðè ýòîì
áîëüøèå øàíñû èìåþò áîëåå ïðèñïîñîáëåííûå (â íàøåì ñëó÷àå ýòî îñîáè ñ
íàèìåíüøåé äëèííîé ïóòè êîììèâîÿæåðà).
Ñóùåñòâóåò íåñêîëüêî ìåòîäîâ ñåëåêöèè, íî íàèáîëåå ðàñïðîñòðàíåí
ìåòîä ðóëåòêè(roulette-wheel selection), êîòîðûì ìû è áóäåì ïîëüçîâàòüñÿ.
Çàêëþ÷àåòñÿ îí â òîì, ÷òî äëÿ êàæäîé îñîáè âû÷èñëÿåòñÿ ôóíêöèÿ
ïðèñïîñîáëåííîñòè è øàíñû âûæèòü îíà ïîëó÷àåò ïðîïîðöèîíàëüíûå çíà÷åíèþ
ýòîé ôóíêöèè. Òî åñòü êîëåñî ðóëåòêè äåëèòñÿ íà ñåêòîðû îñîáåé,
ïðîïîðöèîíàëüíûå ïðèñïîñîáëåííîñòè, è, çàïóñòèâ ðóëåòêó ñòîëüêî ðàç,
ñêîëüêî ó íàñ îñîáåé, ìû ïîëó÷àåì íîâîå ïîêîëåíèå (â íåãî ïåðåõîäÿò òå
îñîáè, íàïðîòèâ ñåêòîðà êîòîðûõ îñòàíîâèëñÿ âîë÷îê).
Òàêæå íåëüçÿ íå óïîìÿíóòü î òàêîì ìåòîäå îòáîðà, êàê ýëèòèçì - ïðè
íåì ñàìàÿ ïðèñïîñîáëåííàÿ îñîáü âñåãäà ïåðåõîäèò â ñëåäóþùåå ïîêîëåíèå.
Ýëèòèçì îáû÷íî âíåäðÿþò â äðóãèå ìåòîäû îòáîðà - ñîõðàíÿþò «ýëèòíóþ»
îñîáü âíå çàâèñèìîñòè îò äðóãèõ óñëîâèé ñåëåêöèè.

3)Ñêðåùèâàíèå èëè êðîññîâåð (crossover)
 ýòîé ÷àñòè ÃÀ ñëó÷àéíûì îáðàçîì âûáèðàþòñÿ äâå îñîáè, êîòîðûå
çàòåì ïî îïðåäåëåííûì ïðàâèëàì îáìåíèâàþòñÿ ãåíàìè.
Ñàìûì ïðîñòûì è, â òî æå âðåìÿ , ïî ìíåíèþ àâòîðà, ñàìûì
ýôôåêòèâíûì, ìåòîäîì ñêðåùèâàíèÿ ÿâëÿåòñÿ îäíîòî÷å÷íûé êðîññîâåð. Îí
ðàáîòàåò òàê: ãåíåðèðóåòñÿ ñëó÷àéíîå íàòóðàëüíîå ÷èñëî n, ìåíüøåå äëèíû
õðîìîñîìû, è êàæäàÿ ðîäèòåëüñêàÿ õðîìîñîìà äåëèòñÿ íà äâå ÷àñòè, ïåðâàÿ
èç êîòîðûõ ñîäåðæèò ïåðâûå n ãåíîâ, à âòîðàÿ - îñòàâøèéñÿ ãåíîòèï. Êàæäàÿ
äî÷åðíÿÿ îñîáü ñîñòîèò èç ïåðâîé ÷àñòè îäíîé ðîäèòåëüñêîé îñîáè è âòîðîé
÷àñòè äðóãîé, òî åñòü ðîäèòåëè êàê áû îáìåíèâàþòñÿ ÷àñòÿìè. Ðèñ.2 -
èëëþñòðàöèÿ îäíîòî÷å÷íîãî êðîññîâåðà äëÿ õðîìîñîì-áèòîâûõ ñòðîê.

[pic]

Òàêæå äîâîëüíî ðàñïðîñòðàíåí äâóõòî÷å÷íûé êðîññîâåð. Ïðè íåì
âûáèðàþòñÿ äâå òî÷êè ðàçðûâà è ðîäèòåëè îáìåíèâàþòñÿ ó÷àñòêîì õðîìîñîì
ìåæäó íèìè. Ðàâíîìåðíûé êðîññîâåð ðåàëèçóåò íàñëåäîâàíèå äåòüìè êàæäîãî
èç ãåíîâ ðîäèòåëåé ñ çàäàííîé âåðîÿòíîñòüþ.

4)Ìóòàöèÿ(mutation)
Ýòîò îïåðàòîð ÃÀ ñ çàäàííîé (îáû÷íî î÷åíü ìàëåíüêîé) âåðîÿòíîñòüþ
ñëó÷àéíûì îáðàçîì èçìåíÿåò ñëó÷àéíûé ãåí îñîáè (äëÿ áèòîâûõ ñòðîê -
èíâåðòèðóåò). Ýòî, ïîæàëóé, ïðîñòåéøàÿ ÷àñòü ÃÀ, è äðóãèå êîììåíòàðèè ê
íåé èçëèøíè.

Ïðàêòèêà

Íó âîò, ñ îñíîâàìè òåîðèè ÃÀ âðîäå áû ðàçîáðàëèñü - ïîðà ïåðåõîäèòü
ê ïðàêòèêå. Äëÿ íà÷àëà ÷åòêî ïîñòàâèì çàäà÷ó: êîììèâîÿæåð ðåøèë îáúåõàòü
20 ãîðîäîâ ïî êðàò÷àéøåìó ïóòè. Îí íà÷èíàåò ñâîé ïóòü â ëþáîì èç íèõ è
çàêàí÷èâàåò â êàêîì-òî äðóãîì, ïðè ýòîì íè â îäíîì ãîðîäå îí íå äîëæåí
ïîáûâàòü äâàæäû. Àáñîëþòíî âñå ãîðîäà ñîåäèíåíû äîðîãàìè è èõ äëèíû
ãåíåðèðóþòñÿ ñ÷åò÷èêîì ñëó÷àéíûõ ÷èñåë. Íàì íåîáõîäèìî çà êîðîòêîå âðåìÿ
íàéòè ïóòü, áëèçêèé ê êðàò÷àéøåìó.
 êà÷åñòâå êîìïèëÿòîðà áóäåì èñïîëüçîâàòü Borland Delphi. Ñîçäàåì
êîíñîëüíîå ïðèëîæåíèå: File->New->Console Application. Ñíà÷àëà îáúÿâèì
íåîáõîäèìûå ãëîáàëüíûå êîíñòàíòû, òèïû è ïåðåìåííûå:

const n_t=20; //êîë-âî ãîðîäîâ
n_os=50; //êîë-âî îñîáåé
v_mut=1; //âåðîÿòíîñòü ìóòàöèè äëÿ êàæäîé îñîáè(â %)
v_cross=60;//âåðîÿòíîñòü ñêðåùèâàíèÿ äëÿ êàæäîé ïàðû
//îñîáåé(â %)
max=10; //ìàêñèìàëüíîå ðàññòîÿíèå ìåæäó ãîðîäàìè
type TTowns=array[1..n_t,1..n_t]of byte;
//ìàññèâ, îïèñûâàþùèé ðàññòîÿíèÿ ìåæäó ãîðîäàìè
TOsobi=array[1..n_os+1,1..n_t]of byte;
//ìàññèâ õðîìîñîì

var towns:TTowns;//ïåðåìåííàÿ ãîðîäîâ
i,j,k,p,n:word;//ïåðåìåííûå äëÿ öèêëîâ è ò.ä. è ò.ï.
osobi,new_osobi,pr:TOsobi;//ïåðåìåííûå îñîáåé
c:char;//ïðîñòî ñèìâîëüíàÿ ïåðåìåííàÿ

Íåêîòîðûå çàìå÷àíèÿ ïî ëèñòèíãó: towns[i,j] - ðàññòîÿíèå ìåæäó i-ì
è j-ì ãîðîäîì. Åñòåñòâåííî, äîëæíû âûïîëíÿòüñÿ ðàâåíñòâà:
towns[i,j]=towns[j,i] è towns[i,i]=0 (ïîñëåäíåå ñêîðåå äëÿ ïðèëè÷èÿ - îíî
íàì íå ïîíàäîáèòñÿ). Äëÿ ìàññèâà îñîáåé osobi[i,j] - íîìåð j-ãî ãîðîäà â
ïóòè êîììèâîÿæåðà, îïèñûâàåìîãî i-é õðîìîñîìîé. Àâòîð âçÿë (n_os+1)îñîáåé
äëÿ óäîáñòâà - ïîñëåäíþþ íå áóäóò êàñàòüñÿ ñêðåùèâàíèå è ìóòàöèÿ, îíà
âñåãäà áóäåò ïåðåõîäèòü â ñëåäóþùåå ïîêîëåíèå - ýòî òà ñàìàÿ ýëèòíàÿ
îñîáü. Îáúÿâëåíî òðè ïåðåìåííûõ îñîáåé äëÿ ïðîöåäóðû ñåëåêöèè.
Òåïåðü íàïèøåì ïðîöåäóðó, êîòîðàÿ, ñîãëàñíî óñëîâèþ, ãåíåðèðóåò
towns (ðàññòîÿíèå ìåæäó ãîðîäàìè îò 1 äî max âêëþ÷èòåëüíî):

procedure gen_towns;
begin
for i:=1 to n_t do
begin
for k:=i+1 to n_t do
begin
towns[i,k]:=random(max)+1;
towns[k,i]:=towns[i,k];
end;
towns[i,i]:=0;
end;
end;

Ò.ê. êîììåíòàðèè ê ïðåäûäóùåìó ëèñòèíãó èçëèøíè, ïåðåéäåì ê
ïðîöåäóðå ñîçäàíèÿ ïîïóëÿöèè, îíà íåìíîãî ïîñëîæíåå, âñå ïîÿñíåíèÿ
ïðèâåäåíû ïðÿìî â ëèñòèíãå:

procedure gen_pop;
begin
for i:=1 to n_os+1 do
begin
//çàïîëíÿåì îñîáü ãîðîäàìè 1,2,3...20
for k:=1 to n_t do osobi[i,k]:=k;
{ìåíÿåì ìåñòàìè ïåðâûé ãåí è ñëó÷àéíûé,
çàòåì âòîðîé è äðóãîé ñëó÷àéíûé è ò.ä.
 ðåçóëüòàòå êàæäûé ãîðîä âñòðåòèòñÿ â
õðîìîñîìå ëèøü îäèí ðàç}
for k:=1 to n_t do
begin
j:=osobi[i,k];
p:=random(n_t)+1;
osobi[i,k]:=osobi[i,p];
osobi[i,p]:=j;
end;
end;
end;

Òåïåðü äîøëà î÷åðåäü äî îïåðàòîðà ñåëåêöèè, ýòî ñàìàÿ ñëîæíàÿ
ïðîöåäóðà â íàøåé ïðîãðàììå, òàê ÷òî ñêîíöåíòðèðóéòåñü:

procedure selection;
var best:byte;//íîìåð ëó÷øåé îñîáè
prisp:array[0..n_os+1]of word;
//ìàññèâ ïðèñïîñîáëåííîñòåé îñîáåé
begin
prisp[0]:=0;
p:=200;
best:=0;
//öèêë çàïîëíåíèÿ ìàññèâà prisp
for i:=1 to n_os+1 do
begin
j:=0;
for k:=2 to n_t do
j:=j+towns[osobi[i,k-1],osobi[i,k]];
prisp[i]:=prisp[i-1]+10000 div j;
if p>j then begin
p:=j;
best:=i;
end;
end;
//êîïèðîâàíèå ëó÷øåé îñîáè íà (n_os+1)-å ýëèòíîå ìåñòî
for i:=1 to n_t do new_osobi[n_os+1,i]:=osobi[best,i];
//ðåàëèçàöèÿ ðóëåòêè
for i:=1 to n_os do
begin
j:=random(prisp[n_os]);
for k:=1 to n_os do
if prisp[k]>j then
begin
j:=k;
break;
end;
for k:=1 to n_t do new_osobi[i,k]:=osobi[j,k];
end;
//îáìåí ïåðåìåííûõ osobi è new_osobi ÷åðåç pr
pr:=osobi;
osobi:=new_osobi;
new_osobi:=pr;
//âûâîäèì íàèìåíüøèé ïóòü äëÿ êàæäîãî 250-ãî ïîêîëåíèÿ
//n-ñ÷åò÷èê ïîêîëåíèé (â îñíîâíîé ôóíêöèè)
if n mod 250=0 then writeln(p);
end;

Ðàçáåðåì ýòîò ëèñòèíã. Ñíà÷àëà îáíóëÿåì ïåðåìåííûå best è prisp[0]
- ïîñëåäíÿÿ ñëóæèò ëèøü äëÿ ïðîñòîé îðãàíèçàöèè öèêëà. Ïåðåìåííîé p, â
êîòîðîé áóäåò õðàíèòüñÿ êðàò÷àéøèé ïóòü ïðèñâàèâàåì çíà÷åíèå 200,
êîòîðîå áîëüøå ìàêñèìàëüíîãî.
Äàëåå â öèêëå äëÿ êàæäîé îñîáè âû÷èñëÿåì äëèíó ïóòè j, åñëè îíà
ìåíüøàÿ èç âû÷èñëåííûõ äî ýòîãî, ïðèñâàèâàåì p åå çíà÷åíèå. Ìàññèâ prisp
çàïîëíÿåì òàê: prisp[n]=prisp[n-1]+f(n) ,ãäå f(n) - ôóíêöèÿ
ïðèñïîñîáëåííîñòè îñîáè (÷åì áîëüøå ïðèñïîñîáëåííîñòü, òåì áîëüøå f(n)).
Ò.ê. ìû ðåøàåì çàäà÷ó ìèíèìèçàöèè, òî ïðèõîäèòñÿ áðàòü f(n)=10000 div j.
Çà÷åì ìàññèâ prisp çàïîëíÿåòñÿ èìåííî òàê, Âû óçíàåòå ÷óòü ïîçæå, à ïîêà
çàìåòüòå, ÷òî «ýëèòíàÿ» îñîáü òîæå ó÷àñòâóåò â âû÷èñëåíèè
ïðèñïîñîáëåííîñòè - à âäðóã íàéäåòñÿ îñîáü ñ ìåíüøåé äëèíîé ïóòè.
 ñëåäóþùåì öèêëå ìû ïðîñòî êîïèðóåì ëó÷øóþ îñîáü íà (n_os+1)-å
ìåñòî è áîëüøå íå òðîãàåì åå äî ñëåäóþùåãî âû÷èñëåíèÿ ïðèñïîñîáëåííîñòåé.

[pic]
Ìàññèâ prisp êàê áû ðàçáèâàåò ìíîæåñòâî öåëûõ íåîòðèöàòåëüíûõ
÷èñåë, ìåíüøèõ prisp[n_os], íà ïðîìåæóòêè îñîáåé, äëèíà êàæäîãî èç
êîòîðûõ - ýòî ïðèñïîñîáëåííîñòü îñîáè, òî åñòü ìû «ðàçìå÷àåì» òó ñàìóþ
ðóëåòêó(ñì. ðèñ.3). Ñ ïîìîùüþ ôóíêöèè random ãåíåðèðóåì 0˜j ìåñòî, íà êîòîðîì îñòàíîâèëîñü êîëåñî ðóëåòêè, à çàòåì èùåì, â êàêîì
ïîëóèíòåðâàëå ñîäåðæèòñÿ j, òî åñòü íàïðîòèâ êàêîãî ñåêòîðà îñòàíîâèëàñü
ðóëåòêà. Îñîáü, ñîîòâåòñòâóþùàÿ ýòîìó ïîëóèíòåðâàëó-ñåêòîðó, ïåðåõîäèò â
ñëåäóþùåå ïîêîëåíèå. Òàê ïðîâîäèì n_os çàïóñêîâ ðóëåòêè.
 ïîñëåäíåé ÷àñòè ïðîöåäóðû ìû ïðîñòî ìåíÿåì ñòàðîå(osobi) è
íîâîå(new_osobi) ïîêîëåíèÿ ÷åðåç ïåðåìåííóþ pr.
Òåïåðü ïîðà ïîäóìàòü îá àëãîðèòìå ñêðåùèâàíèÿ. Ñòàíäàðòíûé
îäíîòî÷å÷íûé êðîññîâåð íå ïîäîéäåò - â õðîìîñîìàõ ïîòîìêîâ îäèí ãîðîä
ìîæåò âñòðåòèòüñÿ äâà ðàçà, à äðóãîé - íè ðàçó, ïîýòîìó ïðèäåòñÿ
ïðèäóìûâàòü ÷òî-òî ñâîå. Àâòîð ðàçðàáîòàë àëãîðèòì íà áàçå îäíîòî÷å÷íîãî
êðîññîâåðà, íî ñîõðàíÿþùèé ñîñòàâ ãîðîäîâ, åãî ìû è ïðèìåíèì.
[pic]
Ñíà÷àëà ìû äåëèì ïåðâóþ ðîäèòåëüñêóþ õðîìîñîìó òî÷êîé ðàçðûâà íà
äâå ÷àñòè, äëèíà êàæäîé èç êîòîðûõ íå ìåíüøå äâóõ. Íàçîâåì íàáîð ãåíîâ èç
ïåðâîé ÷àñòè À. Òåïåðü íà÷èíàåì èñêàòü âî âòîðîé ðîäèòåëüñêîé õðîìîñîìå
ãåíû (òî åñòü íîìåðà ãîðîäîâ) èç íàáîðà À. Ïåðâûé íàéäåííûé ìåíÿåì
ìåñòàìè ñ ïåðâûì ãåíîì ïåðâîé õðîìîñîìû, âòîðîé - ñî âòîðûì è òàê äàëåå.
×òîáû ñòàëî ïîíÿòíåå, âçãëÿíèòå íà ðèñ.4, îí íåïëîõî èëëþñòðèðóåò äàííûé
àëãîðèòì. Êîíå÷íî, ëó÷øå áûëî áû îïèðàòüñÿ íà äâóõòî÷å÷íûé êðîññîâåð -
«îòùåïëÿòü» ïðîèçâîëüíóþ ÷àñòü õðîìîñîìû, à íå îáÿçàòåëüíî ëåæàùóþ ó
ëåâîãî êðàÿ, íî, öåëü ïðèìåðà ê ñòàòüå - ïîíÿòíîñòü, à íå ýôôåêòèâíîñòü.
Èòàê, ïèøåì ïðîöåäóðó:

procedure crossover;
var prom:array[1..n_t]of byte;
//ïðîìåæóòî÷íûé ìàññèâ äëÿ çàïèñè ãåíîâ
u:integer;//ñ÷åò÷èê äëÿ prom
begin
for i:=1 to n_os div 2 do
//ðåøàåì, ïðèçâîäèòü ëè ñêðåùèâàíèå
if random(100) begin
//óñòàíàâëèâàåì òî÷êó ðàçðûâà
p:=random(n_t-2)+2;
//óñòàíàâëèâàåì ñ÷åò÷èê äëÿ prom
u:=1;
//ñêàíèðîâàíèå «âòîðîé» õðîìîñîìû
for k:=1 to n_t do
//ïðîâåðÿåì, ñîäåðæèòñÿ ëè k-é ãåí â À
for j:=1 to p do
//åñëè ãåí ñîäåðæèòñÿ â íàáîðå À
if osobi[i*2-1,k]=osobi[i*2,j] then
begin
//êîïèðóåì åãî â prom
prom[u]:=osobi[i*2-1,k];
//íà åãî ìåñòî - ãåí èç íàáîðà À
osobi[i*2-1,k]:=osobi[i*2,u];
//óâåëè÷èâàåì ñ÷åò÷èê äëÿ prom íà 1
inc(u);
//âûõîäèì èç öèêëà ïî j
break;
end;
//çàìåíÿåì ãåíû íàáîðà À íà ãåíû èç prom
for j:=1 to p do osobi[i*2,j]:=prom[j];
end;
end;

Ýòà ïðîöåäóðà ïîëíîñòüþ ðåàëèçóåò îïèñàííûé âûøå àëãîðèòì. Ò.ê.
îñîáè â ñëåäóþùåå ïîêîëåíèå ïåðåõîäÿò â ïðîèçâîëüíîì ïîðÿäêå, íå
çàâèñÿùåì îò èõ ïîðÿäêà â ïðåäûäóùåì ïîêîëåíèè, òî àâòîð ïîçâîëèë ñåáå
ñêðåùèâàòü íå îñîáè ñ ïðîèçâîëüíûìè íîìåðàìè, à ïåðâóþ ñî âòîðîé, òðåòüþ
ñ ÷åòâåðòîé è òàê äàëåå.
Äëÿ êàæäîé òàêîé ïàðû âåðîÿòíîñòü ñêðåùèâàíèÿ v_cross è ìû ðåøàåì,
ïðîèçâîäèòü ëè ñêðåùèâàíèå, ñ ïîìîùüþ ôóíêöèè random. Åñëè áû ìû ìåíÿëè
ãåíû ñðàçó æå, êàê ýòî îïèñàíî âûøå, íàáîð ãåíîâ À íå ñîõðàíèëñÿ áû è
ïðîöåäóðà ðàáîòàëà áû íåêîððåêòíî, ïîýòîìó ãåíû, ïðåäíàçíà÷åííûå äëÿ
çàïèñè â «ïåðâóþ» õðîìîñîìó, ìû ïèøåì â ïðîìåæóòî÷íûé ìàññèâ prom, à
ïîñëå çàâåðøåíèÿ ñêàíèðîâàíèÿ «âòîðîé» õðîìîñîìû ïåðåïèñûâàåì èç prom â
«ïåðâóþ».
Ïåðåéäåì ê ñîçäàíèþ ïðîöåäóðû ìóòàöèè. Çäåñü, êàê è ïðè
ñêðåùèâàíèè, âîçíèêàþò ñëîæíîñòè èç-çà òîãî, ÷òî â êàæäîé îñîáè êàæäûé
ãîðîä äîëæåí âñòðå÷àòüñÿ îäèí, è òîëüêî îäèí ðàç, à åñëè ïðîèçâîëüíî
èçìåíèòü êàêîé-òî ãåí ýòî óñëîâèå íàðóøèòñÿ. Îäíàêî ïðåîäîëåòü ýòó
çàãâîçäêó ëåãêî: áóäåì ìåíÿòü ìåñòàìè äâà ïðîèçâîëüíûõ ãåíà â õðîìîñîìå!
Ýòîò îïåðàòîð ñàìûé ïðîñòîé â íàøåé ïðîãðàììå, äóìàþ, ÷òî ðàçîáðàòüñÿ ñ
ëèñòèíãîì âàì áóäåò íå ñëîæíî:

procedure mut;
var b:byte;//ïåðåìåííàÿ, ÷åðåç êîòîðóþ
//áóäåì ïðîèçâîäèòü îáìåí
begin
//ïåðåáèðàåì âñåõ îñîáåé
for i:=1 to n_os do
//ðåøàåì, ïðîèçâîäèòü ëè ìóòàöèþ
if random(100) begin
//k-íîìåð ïåðâîãî ïðîèçâîëüíîãî ãåíà
k:=random(n_t)+1;
//j-íîìåð âòîðîãî
j:=random(n_t)+1;
//îáìåí
b:=osobi[i,k];
osobi[i,k]:=osobi[i,j];
osobi[i,j]:=b;
end;
end;

Èòàê, íàì îñòàëîñü íàïèñàòü îñíîâíóþ ôóíêöèþ ïðîãðàììû, à ïîñëå
ïðîäåëàííîé ðàáîòû ýòî ïàðà ïóñòÿêîâ:

begin
//èíèöèàëèçèðóåì ñ÷åò÷èê ñëó÷àéíûõ ÷èñåë
randomize;
//ãåíåðèðóåì ãîðîäà
gen_towns;
//ãåíåðèðóåì íà÷àëüíóþ ïîïóëÿöèþ
gen_pop;
//çàïóñêàåì 5000 ïîêîëåíèé
for n:=0 to 5000 do
begin
//ñåëåêöèÿ
selection;
//êðîññîâåð
crossover;
//è ìóòàöèÿ
mut;
end;
read(c);
end.

Íó ÷òî æ, Âàøà ïåðâàÿ ïðîãðàììà íà îñíîâå ÃÀ ñîçäàíà, ïîçäðàâëÿþ!
Òåïåðü ìîæíî åå ïðîòåñòèðîâàòü. Çàïóñòèì åå íåñêîëüêî ðàç è ïðîñëåäèì çà
âûäàâàåìûìè ðåçóëüòàòàìè.
Âî-ïåðâûõ, çíà÷åíèå íàèìåíüøåãî ïóòè â ñàìîì ïåðâîì ïîêîëåíèè
ñèëüíî îòëè÷àåòñÿ îò ýòîãî æå çíà÷åíèÿ â 250-ì. Ýòî åùå ðàç äîêàçûâàåò,
êàê áûñòðî ðàáîòàþò ÃÀ.
Âî- âòîðûõ, êîíå÷íûé ðåçóëüòàò âûäàåòñÿ ÷åðåç ïàðó ñåêóíä.
Ïîïûòàåìñÿ îöåíèòü åãî òî÷íîñòü. Îáû÷íî îí ëåæèò â ãðàíèöàõ îò 30 äî 40,
èíîãäà âûõîäèò èç íèõ â òó èëè äðóãóþ ñòîðîíó, è ýòî ïðè òîì, ÷òî
íàèìåíüøåå âîçìîæíîå çíà÷åíèå äëèíû ïóòè 19, à íàèáîëüøåå 190!!! Äóìàþ,
î÷åâèäíî, ÷òî, åñëè îòâåò íå òî÷íûé, òî óæ òî÷íî áëèçîê ê íåìó. Íà ýòîì
ïðèìåðå ðàáîòà ÃÀ ïðîñòî ïîòðÿñàåò!
Íó à ÷òîá îíà ïîòðÿñàëà åùå áîëüøå, îöåíèì âðåìÿ, çà êîòîðîå ñ
äàííîé çàäà÷åé ñïðàâèëñÿ áû òî÷íûé àëãîðèòì ïåðåáîðà âñåõ âàðèàíòîâ.
Ïðåäïîëîæèì, ÷òî â êîìïüþòåðå ãèãàãåðöîâûé ïðîöåññîð, êîòîðûé ïðîâîäèò
íåîáõîäèìûå âû÷èñëåíèÿ äëÿ êàæäîãî âàðèàíòà çà 1 òàêò (íå ñëàáàÿ
àáñòðàêöèÿ). Âñåãî âàðèàíòîâ 20! âàðèàíòîâ, çíà÷èò ñóïåðïðîöåññîðó
ïîíàäîáèòñÿ 20!/1.000.000.000 ñåêóíä, à ÷òîáû ïåðåâåñòè âðåìÿ â ãîäà
íóæíî ÷èñëî ñåêóíä ðàçäåëèòü íà (60*60*24*365). Çàïóñêàåì MS Êàëüêóëÿòîð
è ïîëó÷àåì ïðèìåðíî 77 ëåò. Äóìàþ, êîììåíòàðèè èçëèøíè.

Ñíîâà òåîðèÿ

 ýòîé ãëàâå àâòîð ïîïûòàåòñÿ âêðàòöå îòâåòèòü íà âîïðîñ «À ïî÷åìó
ýòî ðàáîòàåò?» Òå, êòî íå î÷åíü ëþáèò ÷èñòóþ ìàòåìàòèêó, ìîãóò ñðàçó
ïåðåõîäèòü ê ðåêîìåíäàöèÿì ïî èñïîëüçîâàíèþ.
Îäíèì èç áàçîâûõ ïîíÿòèé òåîðèè ÃÀ ÿâëÿåòñÿ øèìà (schema). Øèìà -
ýòî øàáëîí äëÿ õðîìîñîì, îò êîòîðûõ îíà îòëè÷àåòñÿ ëèøü òåì, ÷òî â åå
ëîêóñàõ (ïîçèöèÿõ, åñëè êòî íå ïîìíèò) ìîãóò ñòîÿòü íå òîëüêî ãåíû, íî è
*-êè (íåîïðåäåëåííûå ãåíû). Åñëè â êà÷åñòâå ïðèìåðà õðîìîñîì
ðàññìàòðèâàòü áèòîâûå ñòðîêè äëèíû 5, òî øèìû ìîãóò áûòü òàêèìè: **10*1,
**110, 1***0 è òàê äàëåå.
Ó êàæäîé øèìû åñòü äâà âàæíûõ ïàðàìåòðà: ïîðÿäîê è îïðåäåëåííàÿ
äëèíà. Ïîðÿäîê - ýòî êîëè÷åñòâî îïðåäåëåííûõ ãåíîâ â øèìå, à îïðåäåëåííàÿ
äëèíà - ðàññòîÿíèå ìåæäó êðàéíèìè çíà÷àùèìè ãåíàìè. Íàïðèìåð, øèìà *1*00
èìååò ïîðÿäîê 3 è îïðåäåëåííóþ äëèíó 4.
«Íó è çà÷åì íóæíû ýòè øèìû?» - ñïðîñèòå Âû. À çàòåì, ÷òî ÃÀ
îáðàáàòûâàþò âîâñå íå õðîìîñîìû, à øèìû - íåÿâíî, è èìåííî â ýòî êðîåòñÿ
ñåêðåò ðàáîòû ÃÀ. Èç ïîêîëåíèÿ â ïîêîëåíèå ïåðåõîäÿò òîëüêî ëó÷øèå øèìû,
êîòîðûå íàçûâàþò ñòðîÿùèìè áëîêàìè.
Ñòðîÿùèå áëîêè - ýòî øèìû, îáëàäàþùèå òðåìÿ ïðèçíàêàìè:
1. Âûñîêàÿ ïðèñïîñîáëåííîñòü (âû÷èñëÿåòñÿ êàê ñðåäíåå ïðèñïîñîáëåííîñòåé
çàäàâàåìûõ øèìîé õðîìîñîì)
2. Íèçêèé ïîðÿäîê
3. Êîðîòêàÿ îïðåäåëåííàÿ äëèíà
Ïåðâûé ïðèçíàê ïîçâîëÿåò ïðîéòè ñåëåêöèþ (÷åì âûøå
ïðèñïîñîáëåííîñòü, òåì áîëüøå øàíñû âûæèòü), âòîðîé - ìóòàöèþ (ìåíüøå
çíà÷àùèõ ãåíîâ - ìåíüøå âåðîÿòíîñòü èõ èçìåíåíèÿ), òðåòèé - êðîññîâåð
(ìåíüøå îïðåäåëåííàÿ äëèíà - ìåíüøå âåðîÿòíîñòü òîãî, ÷òî òî÷êà ðàçðûâà
ïîïàäåò ìåæäó çíà÷àùèìè ãåíàìè è óíè÷òîæèò øèìó).
Ðàññìîòðèì ïðîñòîé ÃÀ, îí âûïîëíÿåò ñåëåêöèþ ïðîïîðöèîíàëüíî
ïðèñïîñîáëåííîñòè, ñêðåùèâàíèå îäíîòî÷å÷íûì êðîññîâåðîì è ìóòàöèþ
ñëó÷àéíûì èçìåíåíèåì ñëó÷àéíîãî ãåíà. Äëÿ òàêîãî ÃÀ ñïðàâåäëèâî
óòâåðæäåíèå: îí ýêñïîíåíöèàëüíî óâåëè÷èâàåò ÷èñëî ñòðîÿùèõ áëîêîâ.
Äîêàçàòåëüñòâîì ýòîãî ÿâëÿåòñÿ òåîðåìà øèì.
Ïóñòü øèìà X èìååò â k-ì ïîêîëåíèè n(X,k) ïðåäñòàâèòåëåé èëè
ïðèìåðîâ. Íóæíî îöåíèòü çíà÷åíèå n(X,k+1). Òàê êàê ó ïðîñòîãî ÃÀ
âåðîÿòíîñòü âûæèâàíèÿ îñîáè ïðîïîðöèîíàëüíà åå ïðèñïîñîáëåííîñòè, òî
îæèäàåìîå ÷èñëî ïðåäñòàâèòåëåé X ïîñëå ñåëåêöèè
n(X,k)*(prisp(X)/prispñð), ãäå prispñð - ñðåäíÿÿ ïðèñïîñîáëåííîñòü âñåõ
÷ëåíîâ ïîïóëÿöèè, à prisp(X) - òåõ, ÷òî ÿâëÿþòñÿ ïðåäñòàâèòåëÿìè X.
Âåðîÿòíîñòü óñïåøíîãî ïðîõîäà ÷åðåç êðîññîâåð íå ìåíüøå, ÷åì
âåðîÿòíîñòü òîãî, ÷òî òî÷êà ðàçðûâà ïîïàäåò ìåæäó çíà÷àùèìè ãåíàìè, òî
åñòü 1-v_cross*(d(X)/(l-1)), ãäå d(X) - îïðåäåëåííàÿ äëèíà øèìû, à l -
äëèíà õðîìîñîìû. «Íå ìåíüøå» çäåñü ïîòîìó, ÷òî â ñêðåùèâàíèè ìîãóò
ó÷àñòâîâàòü äâà ïðèìåðà îäíîé øèìû, è òîãäà îíà ñîõðàíèòñÿ.  ïîçäíèõ
ïîêîëåíèÿõ, êñòàòè, òàê ïðîèñõîäèò äîâîëüíî ÷àñòî.
Âåðîÿòíîñòü òîãî, ÷òî ìóòàöèÿ íå èçìåíèò çíà÷àùåãî ãåíà (1-
v_mut)p(X), p(X) - ïîðÿäîê øèìû. Òîãäà âåðîÿòíîñòü ñîõðàíåíèÿ øèìû ïîñëå
ïðîõîäà åå ïðåäñòàâèòåëÿ ÷åðåç ñêðåùèâàíèå è ìóòàöèþ íå ìåíüøå (1-
v_cross*(d(X)/(l-1)))* (1-v_mut)p(X),íî òàê êàê p(X) è v_mut ìàëû, òî ýòî
ïðèáëèæåííî 1-v_cross*(d(X)/(l-1))-v_mut*p(X), è òîãäà äëÿ n(X,k+1)
ïîëó÷èì:
n(X,k+1)™n(X,k)*(prisp(X)/prispñð)*(1-v_cross*(d(X)/(l-1))-
v_mut*p(X)))
Ýòî óòâåðæäåíèå è íàçûâàþò òåîðåìîé øèì.
Ýòî òåîðåìà äîâîëüíî ïðîñòà, îäíàêî, íå ñìîòðÿ íà ýòî, îíà äàåò
ïîíÿòèå î òîì, êàê ðàáîòàåò ïðîñòîé ÃÀ, äà è ïðîñòî ÃÀ. Èç ôîðìóëû âèäíî,
÷òî ÷èñëî ïðèìåðîâ ñòðîÿùèõ áëîêîâ ðàñòåò èç ïîêîëåíèÿ â ïîêîëåíèå ïî
ýêñïîíåíòå, â òî âðåìÿ êàê ÷èñëî ïðåäñòàâèòåëåé «áåñïîëåçíûõ» øèì óáûâàåò
ïî ýêñïîíåíòå.
Èç ñêàçàííîãî â ýòîé ãëàâå ìîæíî ñäåëàòü âàæíûé ïðàêòè÷åñêèé âûâîä:
åñëè óâåëè÷èòü v_cross è v_ mut, òî ïîïóëÿöèÿ áûñòðåå ñîéäåòñÿ ê
ðåçóëüòàòó, íî íå âñå ñòðîÿùèå áëîêè áóäóò èñïîëüçîâàíû, ïîýòîìó
ðåçóëüòàò ìîæåò îêàçàòüñÿ ëèøü ëîêàëüíûì ýêñòðåìóìîì. Åñëè æå óìåíüøèòü
v_cross è v_ mut, òî ðåçóëüòàò áóäåò èñêàòüñÿ ìåäëåííåå, íî áóäåò áîëåå
áëèçîê ê òî÷íîìó.

Ðåêîìåíäàöèè ïî èñïîëüçîâàíèþ

ÃÀ ïîêàçûâàþò ñåáÿ ñ ëó÷øåé ñòîðîíû ïðè ðåøåíèè äàëåêî íå âñåõ
çàäà÷, è â ýòîé ãëàâå ïîéäåò ðå÷ü î òîì, êîãäà æå ñëåäóåò ïðèìåíÿòü ÃÀ.
×åòêèé îòâåò íà ýòîò âîïðîñ íå íàéäåí, äà è âðÿä ëè ìîæåò áûòü íàéäåí,
âåäü çàäà÷è ñòîëü ðàçíîîáðàçíû, ïîýòîìó çäåñü áóäóò ïðèâåäåíû ëèøü îáùèå
ðåêîìåíäàöèè.
Íàèáîëüøåå ïðèìåíåíèå ÃÀ íàøëè â çàäà÷àõ îïòèìèçàöèè
ìíîãîïàðàìåòðè÷åñêèõ ôóíêöèé, ìíîæåñòâî ðåøåíèé êîòîðûõ ñòîëü âåëèêî, ÷òî
åãî íåëüçÿ ïåðåáðàòü. Äëÿ ýòîãî ñëó÷àÿ ìîæíî ñäåëàòü ðåøåíèå
óíèâåðñàëüíûì è ïîëó÷åííûé àëãîðèòì ñìîæåò ñ îäèíàêîâûì óñïåõîì ðåøàòü
÷èñòî ìàòåìàòè÷åñêèå çàäà÷è è ïðîåêòèðîâàòü æåëåçíîäîðîæíûé ìîñò! Òàêæå
çäåñü èñïîëüçóåòñÿ òî, ÷òî ÃÀ îïòèìèçèðóåò ñðàçó âñå ïàðàìåòðû, à íå ïî
îòäåëüíîñòè.
Òàê êàê ÃÀ ðàáîòàþò ñ ïîïóëÿöèåé ðåøåíèé, à íå ñ îäíèì â êàæäûé
ìîìåíò, òî îíè èìåþò ìåíüøå øàíñîâ ñîéòèñü íà ëîêàëüíîì ýêñòðåìóìå è
âûäàòü åãî â êà÷åñòâå îòâåòà. Ïîýòîìó åñëè ôóíêöèÿ ïðèñïîñîáëåííîñòè ñ
øóìàìè, òî ÃÀ - îäèí èç ñàìûõ îïòèìàëüíûõ ìåòîäîâ ðåøåíèÿ çàäà÷è.
Íó à òåïåðü î ãðóñòíîì - î òîì, êîãäà ÃÀ ðàáîòàþò íå î÷åíü
ýôôåêòèâíî. Åñëè ïðîñòðàíñòâî ïîèñêà íå î÷åíü áîëüøîå, åãî ëó÷øå
ïåðåáðàòü, äàæå åñëè íà ýòî ïîòðåáóåòñÿ íåñêîëüêî áîëüøåå âðåìÿ, ÷åì íà
âûïîëíåíèå ÃÀ, çàòî âû áóäåòå íà ñòî ïðîöåíòîâ çíàòü, ÷òî íàéäåííîå
ðåøåíèå àáñîëþòíî òî÷íîå.
Åñëè ñóùåñòâóåò êàêîé-òî ñïåöèàëüíûé äëÿ äàííîé çàäà÷è ìåòîä,
ó÷èòûâàþùèé ñïåöèôè÷åñêèå ñâîéñòâà ïðîñòðàíñòâà ïîèñêà, òî îí ïî÷òè
íàâåðíÿêà áóäåò ðàáîòàòü ëó÷øå, ÷åì ÃÀ. Ïîýòîìó ïðèäåòñÿ ëèáî ñîâñåì
îòêàçàòüñÿ îò ïðèìåíåíèÿ ÃÀ, ëèáî «ñêðåñòèòü» åãî ñî ñïåöèàëüíûì ìåòîäîì,
÷òî ìû, êñòàòè, è ñäåëàëè ïðè ðåøåíèè çàäà÷è-ïðèìåðà ê ñòàòüå. Âðÿä ëè
íàøà ïðîãðàììà ïîêàçûâàëà áû òàêèå ðåçóëüòàòû, åñëè áû íå ó÷èòûâàëà òîò
ôàêò, ÷òî êàæäûé ãîðîä â ïóòè êîììèâîÿæåðà äîëæåí âñòðå÷àòüñÿ ðîâíî îäèí
ðàç.
Êîíå÷íî, ñêàçàííîå âûøå íå ÿâëÿåòñÿ ñòðîãèì ïðàâèëîì, íî, âîçìîæíî,
ýòî îäíàæäû ïîäñêàæåò Âàì: «Çäåñü íóæíî ïðèìåíèòü ÃÀ!», è, îäíîâðåìåííî,
íå ïîçâîëèò «ñîâàòü èõ âî âñå äûðêè». Åñëè Âû çàèíòåðåñîâàëèñü ýòîé
òåìîé, ïîñåòèòå ñëåäóþùèå ññûëêè:

1. http://www.chat.ru/~saisa - îäèí èç ëó÷øèõ ðóññêèõ ðåñóðñîâ î ÃÀ.
Åñòü ñåðüåçíûå íàó÷íûå ñòàòüè. Ìíîæåñòâî ññûëîê, ïðàâäà, íà
àíãëîÿçû÷íûå ñàéòû.
2. http://www.genetic-programming.org - ïîæàëóé, ñàìûé èçâåñòíûé â
ìèðå ðåñóðñ ïî ÃÀ è èì ïîäîáíûì. Ìîðå èíôîðìàöèè, íî, êîíå÷íî, âñå
íà àíãëèéñêîì.

-----------------------
Ðèñ.1

Ìóòàöèÿ


Ñêðåùèâàíèå


Ñåëåêöèÿ


Óñëîâèå êîíöà îòáîðà

Ñîçäàíèå ïîïóëÿöèè

Äà


Íåò


Êîíåö ÃÀ

Íà÷àëî ÃÀ

1 1 0 0 0 0 1 1

1 0 0 0 1 0 0 1

1 1 0 0 1 0 0 1

Äåòè

Ðîäèòåëè

1 0 0 0 0 0 1 1

Êðîññîâåð

Òî÷êà ðàçðûâà

Ðèñ.2

Ïðèñï. 1-é îñîáè

2-é îñîáè

3-é îñîáè

(n+1)-é îñîáè

.

Ðàçáèâêà prisp

Prisp[0]

Prisp[1]

Prisp[1]

Prisp[n]

Prisp[n+1]

Åñëè j ïîïàëî ñþäà, âûáðàíà 3-ÿ îñîáü

Ðèñ.3

1 2 3 4 5 6 7

6 3 5 1 4 7 2

Òî÷êà ðàçðûâà

Íàáîð À

ÑïåöÊðîññîâåð

3 1 2 4 5 6 7

6 1 5 2 4 7 3

Ðèñ.3