Motyl z komputera

Dawno, dawno temu, bo w numerze 12/2005, zajmowaliśmy się ewolucją afinicznych roślin. Dziś wrócimy do tych zagadnień, ale przedmiotem naszych zainteresowań będzie populacja cyfrowych motyli.

Dawno, dawno temu, bo w numerze 12/2005, zajmowaliśmy się ewolucją afinicznych roślin. Dziś wrócimy do tych zagadnień, ale przedmiotem naszych zainteresowań będzie populacja cyfrowych motyli.

Motyl z komputera

Rysunek 1. Cyfrowy motyl składa się z pewnej liczby barwnych trójkątów. Jego kod genetyczny stanowią współrzędne rogów i kolory trójkątów, a także ich liczba. Każdy trójkąt będziemy wykreślać dwa razy, zapewniając motylom lustrzaną symetrię.

Zmienność organizmów żywych jest kontrowersyjnym tematem. Jedni dopatrują się tu ręki Wielkiego Planisty, inni widzą zwyczajny, choć niezmiernie złożony proces fizykochemiczny. Niekiedy też w pewnym sensie łączy się oba skrajne podejścia - Pierwszy Poruszyciel tylko puścił materię w ruch, a potem pozwolił jej przez miliardy lat ewoluować, gdzieś z góry obserwując koleje swego dzieła.

Spróbujmy przyjrzeć się podstawowemu algorytmowi, który napędza ten świat. Ledwie poczujemy jego zapach, dotkniemy ogromu tajemnicy, która gdzieś tutaj ukazuje nam swój skrawek. Oto surowy, bezlitosny, absolutnie brutalny i czysty, bo wolny od jakiejkolwiek korupcji, wpływu, sterowania, plan rozwoju ożywionego świata:

  • Po pierwsze, formy żywe bezustannie ze sobą rywalizują. Podczas tej rywalizacji ujawniają się egzemplarze najlepsze (najlepiej przystosowane) i najgorsze. Zjawisko to nazywamy doborem naturalnym. Językiem informatycznym możemy powiedzieć, że w świecie form żywych istnieje operator relacji, za pomocą którego następuje ich bezustanne sortowanie od najlepiej do najgorzej przystosowanych.
  • Po drugie, formy wygrywające rozmnażają się, a ich dobrze przystosowane potomstwo wypiera egzemplarze jakościowo gorsze. Ściślej powiemy, że najlepsze formy kopiują się, a ich kopie w zbiorze form zastępują egzemplarze najgorsze.
  • Po trzecie, wszystkie formy są poddawane bezustannej, losowej zmienności, zwanej mutacjami. Receptura każdego osobnika - tak najdoskonalszego, jak i najgorszego - może nagle zostać uszkodzona i zepsuta. A może poprawiona? Decyduje o tym ślepy los.

Zdefiniujemy cyfrowe motyle i na ich populacji spróbujemy zrealizować powyższy, trójpunktowy mechanizm rozwoju form żywych (rysunek 1).

Cyfrowy motyl jest zbudowany z pewnej liczby barwnych trójkątów. Bez większego trudu moglibyśmy zaimplementować inne elementy budulca ciała motyla - punkty, odcinki, może elipsy, ale zagadnienie rozbudowy programu pozostawię Państwu, koncentrując się na prostocie opisu. Oto definicja pojedynczego trójkąta, zapisana w języku klas:

Motyl z komputera

Rysunek 2. Oto propozycja rozwinięcia programu, aby mógł operować nie pojedynczym motylem, a całą ich populacją. Musimy starannie rozplanować sposób wyświetlania - propozycję moich rozwiązań znajdą Państwo w załączonych materiałach. Jesteśmy gotowi do implementowania algorytmu doboru naturalnego według Darwina.

class TTrojkat

{

private:

public:

int x[ 3], y[ 3]; //3 rogi trójkąta

.TColor k1, k2; //kolory obwódki i wnętrza

};

Jeśli ktoś nie ufa klasom, zapewne wymyśli własny schemat przechowywania danych o pojedynczym trójkącie, choć przyznajmy, że trudno to zrobić porządniej i ładniej.

Zbiór takich trójkątów złoży się na motyla. I tutaj ktoś, kto nie ufa klasom i programowaniu obiektowemu, będzie już miał pewien kłopot. Każdy motyl może być zbudowany z innej liczby trójkątów, zatem dotykamy tutaj mechanizmu tablic o zmiennym rozmiarze. Oto eleganckie rozwiązanie:

#include <vector>

...

class TMotyl

{

private:

public:

//dynamiczna tablica trójkątów

std::vector< TTrojkat> t;

//funkcja tworząca domyślnego motyla

TMotyl( void);

};