Evolusjon i praksis.

En av mine store helter er Theo Jansen. Han har med sine Strandbeests visket ut grensene mellom kunst og ingeniørdisiplinene. Han konstruerer skapninger som kan bevege seg, lagre energi, reagere på omgivelsene, og ta beslutninger – vinddrevne skapninger, laget av plastrør, zipties og tomflasker.

Det som skiller Strandbeests fra andre kinetiske kunstverk er at bevegelsene oppfattes som organiske. Kunstverkene lever sitt eget liv – i flokk – på strendene.

Det som er fundamentet for den organiske estetikken er den mekaniske koblingen av to statiske triangler og 4 statiske lenker, hvorav to til en kamaksel. Denne er kjent som en “Theo Jansen Linkage”.

(Bildet er en skjermdump fra [3])

Ved å rotere AB rundt punktet B, så vil punktet G beskrive et areal (i praksis et polygon i en diskret simulering). Bunnen av dette er alltid flatt i forhold til de stasjonære punktene A og C. Satt sammen i speilvendte par, så fungerer dette mer effektivt enn hjul, for bevegelse på ikke-asfalterte underlag. Lengdene på segmentene, AB, BD, AC, BH, DF, CF, HC, FE, EH, EG og HG, beskriver Jansen som de “11 magiske tall”. Hvis man endrer kun litt på lengden til en av dem, så vil polygonet tegnet av G, kunne endres dramatisk. Endrer man for mye, så vil ikke sammenkoblingen fungere. Hvis vi for eksempelets skyld antar at hvert segment kan ha lengde 1-100, så vil vi ha 10000000000000000000000 forskjellige måter å kombinere disse segmentene på. Noen vil danne fungerende mekanismer, andre ikke. Jeg anbefaler leseren å modifisere Jansen-eksempelet i [3] manuelt for å forsøke å lage et annet ganglag som fungerer. Du vil mislykkes – grundig.

Hvordan kom så Theo Jansen fram til sine 11 magiske tall ?

Jo, han benyttet seg av evolusjon. Segmentlengdene ble optimalisert av en genetisk algoritme over noen måneder CPU-tid. Han bruker også evolusjonsmodellen som forklaring for det organiske resultat. En genetisk algoritme simulerer evolusjon. Et individ beskrives av sine gener, som i dette tilfellet er en binær representasjon av de 11 parametrene. En populasjon av individer evalueres og de beste individene får reprodusere seg og bringe genene sine videre i form av et eller flere avkom. Individer som ikke når opp, vil dø. I praksis er algoritmen som følger:

  1. Initialiser populasjonen med individer med tilfeldige gener.
  2. Evaluer alle individer.
  3. La de beste få reprodusere seg (Vi ønsker å fremavle “eliten”).
  4. La gjerne noen få tilfeldige få reprodusere seg også (Uten en viss diversitet i genmaterialet, så risikerer man å ende opp med individer som presterer på linje med  Charles II av Spania).
  5. Lek litt med mutasjoner (Vi ønsker ikke å sitte fast i et lokalt minima/maksima i 11-space).
  6. Lek litt med og evolusjonspress (Konvergens er bad. Sannsynligheten for å være i nærheten av det globale maksimum er veldig nær 0. Står du stille, så er du på en lokal topp.).
  7. Lek litt med innvandring (Nye gener).
  8. Gjenta inntil et av individene har tilfredsstillende egenskaper.

Hadde en organismes tilpasningsdyktighet latt seg representere ved en deriverbar og kontinuerlig funksjon, så kunne man enkelt fulgt en partiellderivert “oppover” inntil den andre-deriverte begynte å nærme seg null. Med flere slike i samme område så hadde man vært rimelig trygg på at man var i nærheten av et lokalt maksima. Hadde man ikke vært fornøyd med resultatet, så kunne man startet på nytt fra et annet sted og forsøkt igjen.

Theo Jansen sin mekaniske kobling er ikke videre deriverbar. Et stort antall kombinasjoner av variable har ikke løsninger, så den underliggende funksjonen er ikke engang kontinuerlig. Genetiske algoritmer er her en farbar vei, da man kaster et “nett” over det 11-dimensjonale parameterrommet og beveger seg videre fra de toppene som ser mest lovende ut.

Evolusjon er lite annet enn en optimaliseringsalgoritme for arvemateriale. Scoringfunksjonen er overlevelse. Attractoren er miljøet.

Det som gjerne er utfordringen med genetiske algoritmer er å beskrive miljøet. D.v.s. konstruere en scoringfunksjon som fungerer som en ønsket attractor for evolusjonen.

Imitasjon er den beste form for smiger

(d.v.s. så lenge man ikke imiterer noe som er patent- eller merkevarebeskyttet.)

Jeg er som kjent svanger med Götterdämmerung II, og Maker Faire 2015 nærmer seg med stormskritt. Hva hadde vel vært kulere enn å lage et printbart StrandBeest, som hadde bein konstruert på basis av en annen løsning enn den som Theo Jansen fant ? 11 andre magiske tall ? Er det gjørbart ?

Jeg gikk ned for telling med influensa for et par uker siden og begynte å gruble litt innimellom frostriene. Før dette kunne besvares, så måtte jeg løse følgende problem i de ledige stundene jeg hadde mellom rekonvalesens, julegaveinnkjøp og jakten på den perfekte ribbeoppskrift:

1) Beskriv den mekaniske koblingen ved å rotere AB full sirkel rundt A, gitt punkt C og 11 tilfeldige tall – algebraisk. Funksjonen må returnere “levedyktig” eller “dødfødt”. Det virker tilsynelatende ikke mer komplisert enn å parametrisere ligningene for to sirkler og returnere løsningene for skjæringspunktene. Numerisk er dette en rimelig triviell øvelse. Skal man ha sine parametre intakt, så blir det raskt noe mer involvert. Jeg begynte med penn og papir, men endte opp med å kjøpe en symbolsk algebrapakke til maccen. It’s – hvaskalmansi – verbose ?

2) Beskriv en noenlunde fornuftig scoring-funksjon for gangen. Den må være “flat i bånn”, ikke gå i 8-tall, helst ikke ha noen link-punkter under seg, ha en viss utstrekning og være noenlunde horisontal (Dette er ikke metoder du finner i QPolygonF-implementasjonen i Qt.). Funky mellomtrinn bør være lov. Funksjonen må være lett å beregne, samt gi ett objektivt kriterie ut. (Men hvordan vet man om man kan stole på dommeren man har satt inn ? Kanskje det, som så ut som en kongescoring, faktisk var et selvmål ? Evolusjonen vil gå i retning av det du beskriver uansett om du er på bærtur eller ikke. (Dette gjelder faktisk også innen ledelsesteori (ihvertfall sett fra utsiden). Måler du noe, så er det det, som gauderne som jobber for deg vil optimalisere organisasjonen for. Just sayin’.)

3) Implementer en GA – som virker. How hard can it possibly be ?

4) Gjør den parallelliserbar.

5) Brenn av veldig, veldig mange CPU-sykluser.

6) Se om det kommer noe fornuftig ut…

Når jeg kan svare “ja” på spm 6, så kan jeg jo bare skrive ned mine 11 nye tall på pergament og så mate de inn i Fusion 360, tegne litt, extrude litt og så bare eksportere en printbar STL og gå for total awesomeness på MF. Juhuuu ! Eller..?

Som leser, så lurer du nå sikkert (igjen) på om dette bare er et et halvgjennomtenkt ønskeprosjekt eller om det faktisk vil komme noen del 2 – ever. Jeg skal ærlig innrømme at jeg lurer på det samme. Status er som følger: Maskinparken er på punkt 5 og jeg er på punkt 6. Kildekoden er foreløpig i et privat repo på GitHub (burde la seg snurre på Mac, Linux og Windows++). Antar jeg åpner opp repoet hvis jeg på litt sikt kan svare et rungende “JA” på spm 6. Blir svaret et nølende “eeeeh”, så kan det hende jeg feier alt under teppet. Vi får se.

Det jeg kan si med sikkerhet, er at jeg allerede har sett mange levedyktige løsninger (og også fryktelig mange, som går John Cleese sin “Silly Walk”-sketch en høy gang), men jeg har enda ikke sett noen som er bedre enn Theo Jansen sine 11 magiske tall. Likevel, så skal det noe til at Theo Jansen har funnet det globale maksimum. Jeg setter en mynt på at det er enda mer effektive løsninger der ute. Spørsmålet er vel egentlig bare hvor lang tid det vil ta å finne dem.

Godsaker / Ressurser.

Jeg kan varmt anbefale følgende godsaker til de som måtte være interessert:

[-1] Gakken sitt “Mini Strandbeest kit”. Dette får du hos MakerShed, Adafruit, Amazon etc. Det finnes flere varianter å velge mellom.

[0] PocketCAS – Genial liten mattepakke for iOS og Mac. Koster mindre enn 200 spenn og løser alle dine umiddelbare symbolske algebrahbehov.

[1] “The Great Pretender”, Theo jansen, 010 Publishers, 2009

[2] “The Dream Machines of Theo Jansen”, Lena Herzog, Taschen, 2014

[3] “Linkage Mechanism Designer and Simulator”, v.2.9.13, David M. Rector