Ilustracja optymalizacji ewolucyjnej i zachłannej 
  1. Ściągnij najnowszą wersję symulatora Framsticks i rozpakuj w jakimś katalogu.
  2. Czym są "rozwiązania" (w kontekście optymalizacji) we Framsticks?
  3. Ile jest wszystkich potencjalnych rozwiązań i dlaczego?
  4. Włącz "teatr".
    1. Wybierz pokaz "mutation". Czym są kolejne organizmy? Na co wpływa ustawienie "Mutant variation"?
    2. Kliknij "Restart with simple f0 creature". Czy widać jakąś różnicę w stosunku do "f1"? Jaka jest różnica na poziomie genetycznym?
    3. Wybierz pokaz "biomorph" i przeprowadź kilkanaście kroków ewolucji sterowanej własnymi preferencjami. Powtórz to dla reprezentacji "f0" i opisz różnicę w obu reprezentacjach. W której z nich łatwiej osiągnąć pożądany kształt?
    4. Wybierz pokaz "reproduction". Wedle obowiązujących w tej symulacji zasad, od ilu do ilu osobników może mieć populacja organizmów? Od ilu do ilu może być sztuk pożywienia?
    5. Wybierz pokaz "evolution_demo" i prędkość "Very fast". Zapoznaj się z różnymi metodami selekcji. Ile czasu zajmuje powstanie konstrukcji wznoszącej się ponad podłoże przy użyciu reprezentacji f1, a ile przy użyciu f0? Dlaczego?
    6. Wybierz pokaz "evolution". Ustaw kryterium "wysokość", czas symulacji w tle "90%", prędkość "Very fast", i kliknij "Restart evolution with empty gene pool". Obserwuj wyniki.
  5. Włącz GUI.
    1. Dodaj nowy genotyp X
    2. W parametrach ustaw:
      1. Gene pool capacity = 20
      2. Initial placement = Central
      3. Unchanged = 0
      4. Fitness: tylko "Vertical position" = 1, reszta 0
      5. Starting energy = 300
      6. W "Genetics", f1→Neural net→Add/remove neuron = 0 (zmniejszamy przeszukiwaną przestrzeń rozwiązań)
    3. Następnie włącz wykresy minimalnego, średniego i najlepszego dopasowania w populacji: W ustawieniach interfejsu/Simulator charts wybierz "Genotypes: Final fitness: minimal final fitness", kliknij Apply a potem Add chart. Powtórz dla "average" i "maximal".
    4. Uruchom symulację.
    5. Naciśnij F9 (ustawienia szybkiej symulacji) i w menu Window włącz okienka Genotypes, World i Charts. Poukładaj wykresy.
    6. Posortuj genotypy po "final fitness" (największa wartość u góry).
    7. Poczekaj, aż zaczną powstawać wysokie konstrukcje. Co można powiedzieć o wykresach minimal, average i maximal fitness?
    8. Jak myślisz, na co wpływa liczność puli genów? Co jeśli będzie bardzo mała? Co jeśli bardzo duża?
    9. Przełącz parametr "Delete genotypes" z "Randomly" na "Only the worst". Co dzieje się na wykresach i w puli genów? Dlaczego? Co powoduje usuwanie losowe, a co usuwanie najgorszego? Jakie te dwie sytuacje mają wady i zalety?
    10. Zatrzymaj symulację. Usuń wszystkie genotypy i wszystkie żyjące organizmy.
    11. W Gene Pools→Genotypes→Fitness formula wpisz:
      var m=Model.newFromGeno(this.geno);
      return (m.size_x-2)*(m.size_y-2)*(m.size_z-2);
      
    12. Co określa taka funkcja celu?
    13. Ustaw "Starting energy" na 1 (bo funkcja celu i tak nie bazuje teraz na osiągach wyznaczanych podczas życia, tylko na samym genotypie)
    14. Wcześniej, kiedy liczyliśmy wysokość organizmu, symulator po umieszczeniu osobnika w świecie czekał, aż jego ciało znieruchomieje, i dopiero potem wyznaczał wysokość. Teraz okres "czekania" nie jest wcale potrzebny, więc żeby bardzo znacznie zaoszczędzić na czasie symulacji, ustaw Populations→Creatures→Performance calculation na "Immediate". Organizmy będą żyły dokładnie 1 krok symulacji, a nie (okres czekania na znieruchomienie)+1 krok.
    15. Dodaj genotyp X
    16. ...i uruchom symulację, pamiętając że "Delete genotypes" zostało na "Only the worst", i jakie są tego konsekwencje.
    17. Teraz ocena dotyczy fenotypów takich, jakie widać w okienku "Body and brain", a nie podczas symulacji w świecie.
    18. Zatrzymaj symulację. Usuń wszystkie genotypy i wszystkie żyjące organizmy.
    19. W Gene Pools→Genotypes→Fitness formula wpisz teraz:
      var m=Model.newFromGeno(this.geno);
      var s=m.size_x;
      if (m.size_y<s) s=m.size_y;
      if (m.size_z<s) s=m.size_z;
      return s;
      
    20. Co określa taka funkcja celu i czym się różni od poprzedniej?
    21. Dodaj genotyp X
    22. i uruchom symulację; czy optymalizacja spełnia oczekiwania związane z funkcją celu?
    23. a co wyrażałaby taka funkcja? return s - (m.size_x-s) - (m.size_y-s) - (m.size_z-s);