GeoJS: Vida artificial

Cèl·lules (font: http://www.manifestdaily.com/wp-content/uploads/2014/04/cells2.jpg )Sabies que es poden usar models per simular organismes vius a l’ordinador?

En el camp de les biomatemàtiques, per exemple, s’usen aquests simuladors per entendre el comportament del virus de la sida o el d’Ebola. I en el món de la informàtica, aquests simuladors van originar l’emblema dels hackers

En aquesta activitat, a més d’experimentar amb comportaments bàsics d’organismes, aprendràs a usar matrius per emmagatzemar la informació  i a proporcionar dades de forma gràfica al teu programa.

Estàs preparat per a crear el teu laboratori de vida artificial?

Guió de la sessió presencial: Vida Artificial

iniAbans de començar

Dossier alumne

Proposta de Dossier per a l’Alumne (.pdf)

petjadaPas 1: Crear el taulell del simulador

Per a programar el simulador ens basarem en un model fet famós pel matemàtic John Conway anomenat Joc de la Vida, mira el següent vídeo introductori:

Com has pogut veure, ens cal:

  • un tauler quadriculat
    • exemple d’un tauler de 3×3:
    •  geojs-gameoflife-tauler-buit
  • on a cada cel·la del tauler (quadricula) hi pot habitar un individu o estar buida
    • exemple d’un individu a la cel·la que està a la segona fila, tercera columna:
    • geojs-gameoflife-individu
  • en funció de les cel·les veïnes
    • exemple on l’individu (de color verd) té dos veïns (blaus):
    • geojs-gameoflife-veins
    • fixa’t que són veïns aquells individus que comparteixen com a mínim un vèrtex.

També hauràs vist que el Joc de la Vida, no es tracta d’un joc amb diversos jugadors. Sinó que un cop estableixes els individus que hi ha inicialment (comunitat inicial), aquests van naixent o morint en funció de les següents regles (anomenades lleis genètiques):

  • Llei de Mortalitat: només sobreviuen els individus amb 2 o 3 veïns.
    • exemple on l’individu vermell morirà de solitud:
    • geojs-gameoflife-mort-solitud
    • exemple on l’individu vermell morirà per sobrepoblació:
    • geojs-gameoflife-mort-sobrepoblacio
  • Llei de Reproducció: neixen nous individus a les cel·les buides que tenen exactament 3 veïns.
    • exemple on naixerà un individu a la segona fila, segona columna
    • geojs-gameoflife-3-horitz-top

interrogantPregunta 1: Quines morts i naixements hi hauria en el següent tauler? (dibuixa el següent estat del tauler i indica les coordenades (fila i columna) dels individus que moririen i naixerien)

geojs-gameoflife-3-vertical

En primer lloc doncs, et proposem fer un programa que dibuixi el tauler i deixi que l’usuari hi col·loqui individus en les posicions que vulgui.

  • puzzleRepte 1: Mostrar el contingut d’una matriu amb quadrats de diferents mides.
    • geojs-gameoflife-matrix3x3-diferent-sizesCrea un programa que defineixi una matriu de 3 files per 3 columnes, amb un número diferent a cada posició, i visualitzi el seu contingut en forma de quadradets de diferents mides al tercer quadrant del pla cartesià.
    • definitionLabel (font: http://findicons.com/icon/156894/label ) Matriu (multi-dimensional array): una matriu és una estructura capaç d’emmagatzemar dades com si fos una taula de doble entrada (amb files i columnes). Per exemple, en una sola variable tipus matriu podem emmagatzemar quina fitxa hi ha en cada casella d’un tres en ratlla (les matrius poden tenir més de 2D). +info
    • bombetaIdees:
      • Exemple de definició d’una matriu i visualització en una finestra emergent:
        /* Constants amb la mida de la matriu */
        var FILS = 2
        var COLS = 2
        
        /* Definim la matriu per files de valors */
        var matriu=[
        [1,2,3],
        [4,5,6],
        [7,8,9]
        ]
        
        /* També podem tocar una cel·la en concret */
        matriu[1][2] = 99
        /* Hem posat un 99 a la fila 2 columna 3.
           Igual que en els vectors, les coordenades
           tenen una unitat menys. Ex. fila 1 colum. 1
           té com a coordenades [0][0] */
        
        /* Definim la funció que mostra la matriu */
        function debugTauler( matriu ) {
         var cadena = "Tauler:\n"
        
         /* Bucles per files (f) i columnes (c) */
         for ( var f=0; f < FILS ; f++ ) {
           cadena = cadena + " ["
           for ( var c=0; c < COLS ; c++ ) {
             if ( c > 0 ) {
               cadena = cadena + ", "
             }
             /* Afegim element de fila f i columna c */
             cadena = cadena + matriu[f][c]
           }
           /* Salt de línia al final de cada fila */
           cadena = cadena + " ]\n"
         }
         alert( cadena ) /* Mostrem el missatge */
        }
        
        debugTauler( matriu ) /* Executem la funció */
        
        • interrogantPregunta 2: Com mostraries en una finestra emergent tan sols el darrer element de la matriu de 3×3 del codi anterior?
      • Convé tenir la graella visible (la pots activar usant el botó dret sobre un eix de coordenades) i que les divisions vagin d’una en una unitat (ho pots modificar a les propietats de la zona gràfica, apartat graella, indicant la distància).
      • Exemple per crear un quadrat:
        var g=ggbApplet
        var id="C_{0,0}" /* Identificador amb subíndex*/
        g.evalCommand(id+"=Polygon[(0,0),(0, -0.5),4]")
        g.setColor( id, 0, 240, 0)
        g.setFilling( id, 0.7)
        g.setLineThickness( id, 6 )
        
    • lupaPistes:
      func dibuixaIndividu( f, c, mida )
       var id="C_{"+f+","+c+"}"
       var x = c
       var y = -f
      
       polígon[id, (x, y), (x, (y-mida) ), 4]")
       color[id, verd]
       pintaInterior[id, 0.7]
      fi_func
      
      func dibuixaTauler( tauler )
       per a f = 0 fins a FILS increments 1
        per a c = 0 fins a COLS increment 1
         dibuixaIndividu( f, c, (tauler[f][c] / 10) )
        fi_per
       fi_per
      fi_func
      
      dibuixaTauler( tauler )
      
  • interrogantPregunta 3: Quants veïns té l’individu de la cel·la 1,1?
  • puzzleRepte 2: Mostrar només les les cel·les plenes d’una matriu en quadrats de la mateixa mida.
    • geojs-gameoflife-quadrats-nomes-cel.les-plenaModifica el teu programa anterior per a que mostri un quadrat d’1×1 només per a les cel·les plenes (les que continguin un 1, les altres contindran un 0). A més, fes que dibuixi uns segments que indiquin els límits del tauler.
    • bombetaIdees:
      • Usa la funció següent a l’inici del teu programa per a esborrar els quadrats que ja poguessin existir prèviament:
        function esborraPantalla() {
          var numObjs = g.getObjectNumber()
          var idx
          var poligons = []
          for ( idx = 0; idx < numObjs ; idx++ ) {
            var id  = g.getObjectName( idx )
            if (g.getObjectType(id) == "polygon"){
              poligons.push( id )
            }
          }  
        
          for (idx=0; idx<poligons.length ;idx++){
            g.deleteObject( poligons[idx] )
          }  
        }
        
        • Fixa’t com la línia 12 de la funció esborraPantalla limita el nombre d’iteracions del bucle amb la el número d’elements del vector poligons (usant poligons.length).
        • interrogantPregunta 4: Què diries que fan les línies 7-8 i 12-13 de la funció esborraPantalla?
      • Exemple per a dibuixar un segment:
        g.evalCommand("S_1=Segment[(0,0), (3,3)]")
        
    • lupaPistes:
      func dibuixaTauler( tauler )
       segment[S_1, (0,0), (FILS,0)]
       segment[S_2, (FILS,0), (FILS,-COLS)]
       segment[S_3, (FILS,-COLS), (0,-COLS)]
       segment[S_4, (0,-COLS), (0,0)]
       per a i=1 fins a 4 increment 1
        gruixLinia("S_"+i, 6 )
       fi_per
      
       per a f = 0 fins a FILS increments 1
        per a c = 0 fins a COLS increment 1
         si ( tauler[f][c] == 1 ) llavors
          dibuixaIndividu( f, c, 1 )
         fisi
        fi_per
       fi_per
      fi_func
      
  • puzzleRepte 3: Omplir la matriu a partir dels quadrats que hagi dibuixat l’usuari.
    • geojs-gameoflife-boto-nou-indivAra el teu programa, enlloc de tenir la matriu declarada al codi amb el seu contingut, tan sols la tindrà amb tots els valors a 0 i el que farà serà mirar quins quadrats a dibuixat l’usuari al tercer quadrant del pla cartesià i col·locar un 1 a les cel·les corresponents de la matriu 3×3.
    • Pots afegir un botó per a crear nous individus, en forma de quadrats a l’inici del segon quadrant. L’usuari els podrà moure sobre el tauler. Aleshores, en executar el programa, es detectaran les coordenades de tots els quadrats que estan dins el tauler i s’omplirà la matriu (la resta es descartaran). Per últim, el programa esborrarà la pantalla i dibuixarà el tauler de nou amb tots els individus a les seves posicions.
    • bombetaIdees:
      • Pots afegir un botó per a que sigui fàcil per l’usuari fer els quadrats de la mida i color adequats:
        • 1. Escull l’eina Inserir Botó de Geogebraggb-button-tool
        • 2. Fes clic a la zona gràfica i omple només el nom del botó
        • 3. Fes clic amb el botó secundari sobre el botó i escull propietats
        • 4. Ves a la pestanya “Seqüència de comandaments”
        • 5. Escull la pestanya “En clicar”.
        • 6. Escriu-hi el següent codi:
          var g=ggbApplet
          var numObjectes = g.getObjectNumber()
          var id = "C_{"+(numObjectes + 1)+"}"
          g.evalCommand(id+"=Polygon[(-1,1),(-1,0),4]")
          g.setColor( id, 0, 240, 0)
          g.setFilling( id, 0.7)
          g.setLineThickness( id, 6 )
          
        • 7. Escull l’opció “JavaScript” en la llista desplegable inferior de la pestanya.
        • 8. Prem el botó “D’acord”
        • Amb aquest botó, l’usuari podrà crear quadrats, tan sols li caldrà moure’ls amb el ratolí a la posició desitjada. Si els vol esborrar, en tindrà prou amb seleccionar-los i prémer la tecla Suprimir.
        • interrogantPregunta 5: Què creus que fa la comanda g.getObjectNumber() de la 2a línia del codi del botó?
      • Fixa’t en l’exemple del repte anterior, com la funció esborraPantalla localitza el nom de tots els objectes que són un polígon (els quadrats que haurà dibuixat l’usuari). En la teva funció necessitaràs el mateix per localitzar els identificadors dels quadrats.
      • Copia la funció obteXYdePoligon següent per a poder obtenir les coordenades d’un quadrat dibuixat per l’usuari:
        function obteXYdePoligon( id ) {
         /* Obtenim la descripció del polígon */
         /* Exemple: Polygon[(1, 1), (4, 1), 6] */
         var cmd =g.getCommandString( id )
        
         /* Definim una plantilla */
         var patro=/.+\[\((.+), (.+)\), \((.+), (.+)\), (.+)\]/
        
         /* Apliquem la plantilla a la definició
            per a obtenir les coordenades */
         var valors = patro.exec(cmd)
        
         if (valors == null) alert("Error: "+cmd)
        
         /* Obtenim les primeres coordenades */
         var x = valors[1]
         var y = valors[2]
        
         /* i les retornem alhora */
         return [x, y]
        }
        
        /* Exemple per cridar a la funció */
        /* Li passem l'identificador d'un
           polígon dibuixat amb el ratolí */
        var coords = obteXYdePoligon( "poly1" )
        
        /* I ara, agafem cada coordenada */
        var x = coords[0]
        var y = coords[1]
        
        alert("Les coordenades són: "+x+", "+y)
        
    • lupaPistes:
      func llegeixTauler( tauler )
       numObjs = g.getObjectNumber()
      
       per a idx = 0 fins a numObjs-1 incr. 1
        id = g.getObjectName( idx )
        si ( g.getObjectType( id ) == "polygon" )
         coords = obteXYdePoligon( id )
      
         f = Math.round( -coords[1] )
         c = Math.round(  coords[0] ) 
      
         si ( f >=0 && f<FILS && c>=0 && c<COLS )
          tauler[f][c] = 1
         fi_si
        fi_si
       fi_per
      fi_func
      
      llegeixTauler( tauler )
      debugTauler( tauler )
      esborraPantalla()
      dibuixaTauler( tauler )
      
  • puzzleRepte 4: Ampliar les mides del tauler a 10×10.
    • Ara que el teu programa ja és capaç de veure quins individus ha situat l’usuari i treballar amb un tauler de 3×3, modifica’l per a que pugui treballar amb qualsevol altra mida indicada per les constants FILS i COLS (número de files i número de columnes).
    • bombetaIdees:
      • Exemple de creació d’una matriu de 100×200:
        /* Puc crear espai per a les 100 files */
        var tauler = new Array(100)
        
        /* Però d'entrada estaran indefinides */
        alert("Posició 50: " + tauler[49])
        /* serà 'undef' perquè no conté res */
        
        /* A cada fila cal crear espai per a
           les 200 columnes */
        for ( var f=0 ; f < 100 ; f++) {
         tauler[f] = new Array(200)
        }
        
        /* Però continuaran indefinides */
        alert("Posició 50,100:"+tauler[49][99])
        /* serà 'undef' perquè no conté res */
        
        /* Ara ja puc posar valors on vulgui */
        tauler[49][99]  = 0
        tauler[50][100] = 1
        
      • interrogantPregunta 6: A quina coordenada de la matriu es refereix la darrera línia de l’exemple anterior?
      • interrogantPregunta 7: Què contindrà la cel·la de la tercera fila, segona columna de la matriu al finalitzar l’exemple anterior?
      • En molts llenguatges de programació, després de declarar les dimensions d’una matriu, el seu contingut és aleatori, i per tant cal inicialitzar-lo. Fes que el teu programa tingui una funció anomenada creaTaulell que crei la matriu de les dimensions desitjades i hi deixi un 0 a cada cel·la.
    • lupaPistes:
      func creaTauler( nFils, nCols )
       tauler= new Array( nFils )
      
       per a f=0 fins a nFils-1 increment 1
        tauler[f] = new Array( nCols )
        per a c=0 fins a nCols-1 increment 1
         tauler[f][c] = 0
        fi_per
       fi_per
      
       retorna tauler
      fi_func
      
      tauler = creaTauler( 10, 10 )
      llegeixTauler( tauler )
      debugTauler( tauler )
      esborraPantalla()
      dibuixaTauler( tauler )
      

petjadaPas 2: Simular les lleis de reproducció i mortalitat

Ara que ja has fet un programa que permet a l’usuari situar una sèrie d’individus inicialment, pots programar les lleis de reproducció i mortalitat per a donar-los vida!

Com has vist a la introducció, aquestes lleis depenen del nombre de veïns d’un individu, així que els primer repte consistirà en comptar-los. Endavant!

  • puzzleRepte 1: Fer una funció que compti el nombre de veïns d’una cel·la del tauler.
    • Afegeix una funció anomenada comptaVeins( fCentre, cCentre, tauler ), que donades unes coordenades i una matriu, retorni el nombre d’individus veïns de la cel·la corresponent. Comprova el correcte funcionament d’aquesta nova funció usant tests unitaris.
    • definitionLabel (font: http://findicons.com/icon/156894/label ) Tests unitaris (unit-testing): s’anomena prova unitària al fragment de codi que serveix per a comprovar si un altre fragment funciona correctament. Per exemple, podem comprovar si el valor retornat per la funció comptaVeins() és correcte en un tauler determinat. Aquests tests s’usen per a validar petites parts d’un extens programa enlloc de provar tot el programa sencer. +info
    • bombetaIdees:
      • Et recomanem fer els tests unitaris en una matriu de 3×3 i després ja pots provar el programa sencer en una matriu major.
      • Exemple de test unitari per a la funció que has d’implementar:
        function test_comptaVeins() {
         /* Declarem un tauler per a les proves */
         var tauler = [
         [1,0,0],
         [0,1,0],
         [0,1,1]
         ]
        
         /* Cas cel·la del mig: té 3 veïns */
         if (comptaVeins(1, 1, tauler) != 3) alert("Error1")
        
         /* Cas 3a fila, 1a columna */
         if (comptaVeins(2, 0, tauler) != 2) alert("Error2")
        
         alert("Final test_comptaVeins")
        }
        
        /* Executem només els tests */
        test_comptaVeins()
        
      • Afegeix també un test per a l’element del mig de la darrera fila del següent tauler:
        • geojs-gameoflife-3-horitz-top
        • interrogantPregunta 8: Quin és el codi amb que has provat aquest cas?
    • lupaPistes:
      func comptaVeins( fCentre, cCentre, tauler )
       nVeins = 0
      
       per a f = fCentre-1 fins a fCentre+1
        per a c = cCentre-1 fins a cCentre+1
         si ( filColCorrectes(f, c)
              &&
             !( f==fCentre && c==cCentre) )
          si ( tauler[f][c] == 1 )
           nVeins++
          fi_si
         fi_si
        fi_per
       fi_per
      
       retorna nVeins
      fi_func
      
  • puzzleRepte 2: Fer una funció que avaluï la llei genètica de mortalitat d’una cèl·lula.
    • Afegeix una funció anomenada lleiMortalitat( f, c, tauler ), que donades unes coordenades i una matriu, retorni cert si l’individu de la cel·la mor (és a dir té menys de 2 veïns o més de 3). Comprova el correcte funcionament d’aquesta nova funció usant tests unitaris.
    • bombetaIdees:
      • Et recomanem fer els tests unitaris en una matriu de 3×3 i després ja pots provar el programa sencer en una matriu major.
      • Pots fer tests unitaris amb aquests casos:
        tauler1:
         [1,0,0]
         [1,1,0]
         [0,1,0]
         posició matriu (1, 1) hauria de viure
         posició matriu (1, 0) hauria de viure
        
        tauler2:
         [0,0,1]
         [0,0,0]
         [0,0,0]
         posició matriu (0, 2) hauria de morir
        
        tauler3:
         [1,1,1]
         [1,1,1]
         [1,1,1]
         posició matriu (1, 1) hauria de morir
        
      • interrogantPregunta 9: Quin altre cas podries provar?
    • lupaPistes:
      func lleiMortalitat( f, c, tauler )
       mor = true
      
       nVeins = comptaVeins( f, c, tauler)
      
       si ( nVeins == 2 || nVeins == 3 )
        mor = false
       fi_si 
      
       retorna mor
      fi_func
      
      func test_lleiMortalitat()
       taulerTest1= [
       [1,0,0],
       [1,1,0],
       [0,1,0]
       ]
      
       si ( lleiMortalitat(1, 1, taulerTest1 ) != false) avisa("Error test_lleiMortalitat1")
      
       si ( lleiMortalitat(1, 0, taulerTest1 ) != false) avisa("Error test_lleiMortalitat2")
      
       taulerTest2= [
       [0,0,1],
       [0,0,0],
       [0,0,0]
       ]
      
       si ( lleiMortalitat(0, 2, taulerTest2 ) != true) avisa("Error test_lleiMortalitat3")
      
       taulerTest3= [
       [1,1,1],
       [1,1,1],
       [1,1,1]
       ]
      
       si ( lleiMortalitat(1, 1, taulerTest3 ) != true) avisa("Error test_lleiMortalitat4")
      
       avisa("Final test_lleiMortalitat")
      fi_func
      
      test_lleiMortalitat()
      
  • puzzleRepte 3: Aplicar la llei genètica de mortalitat a tot el tauler.
    • Ara que ja has comprovat que la funció de mortalitat del repte anterior funciona (amb els tests unitaris), aplica-la a totes les cel·les de la matriu on hi hagi un individu. Deixa el resultat en una altra matriu, i mosta-la enlloc de la que hi havia.
    • bombetaIdees:
      • Podries crear una funció que rebés el tauler inicial i retornés un tauler on només estan els individus que han sobreviscut:
        var taulerEnd = lleisGenetiques( taulerIni )
        
      • Quan executis el teu programa pots comprovar visualment els següents casos:
        /* Cas 1: */
        inicialment:
        [0,0,1]
        [1,1,0]
        [0,0,1]
        
        sobreviuen:
        [0,0,0]
        [0,1,0]
        [0,0,0]
        
        /* Cas 2: */
        inicialment:
        [1,1,0]
        [1,0,0]
        [0,0,0]
        
        sobreviuen:
        [1,1,0],
        [1,0,0],
        [0,0,0]
        
      • interrogantPregunta 10: Quin altre cas podries provar?
    • lupaPistes:
      func lleisGenetiques( taulerIni )
       taulerEnd = creaTauler()
      
       per a f=0 fins a FILS inc 1
        per a c=0 fins a COLS inc 1
         si ( taulerIni[f][c] == 1 )
          si ( ! lleiMortalitat( f, c, taulerIni ) )
           taulerEnd[f][c] = 1
          fi_si
         sinó
          si ( lleiReproduccio( f, c, taulerIni ) )
           taulerEnd[f][c] = 1
          fi_si
         fi_si
        fi_per
       fi_per
      
       retorna taulerEnd
      fi_per
      
      taulerIni = creaTauler()
      llegeixTauler( taulerIni )
      esborraPantalla()
      var taulerEnd = lleisGenetiques( taulerIni )
      dibuixaTauler( taulerEnd )
      
  • puzzleRepte 4: Afegir la llei de reproducció a tot el tauler.
    • Ja només et queda afegir la llei de reproducció i podràs començar a investigar en el teu laboratori de vida artificial!
    • bombetaIdees:
      • Pots fer tests unitaris amb aquests casos:
        tauler1:
         [1,0,0]
         [1,1,0]
         [0,1,0]
         posició matriu (0, 1) hauria de néixer
         posició matriu (2, 0) hauria de néixer
        
        tauler2:
         [0,0,1]
         [0,0,0]
         [0,0,0]
         posició matriu (1, 1) no hauria de néixer
        
        tauler3:
         [1,1,1]
         [1,1,1]
         [1,1,1]
         posició matriu (1, 1) no hauria de néixer
        
      • interrogantPregunta 11: Quin altre cas podries provar?
    • lupaPistes:
      func lleiReproduccio( f, c, tauler )
       naixement = false
      
       nVeins = comptaVeins( f, c, tauler)
      
       si ( nVeins == 3 ) aleshores
        naixement = true
       fi_si 
      
       retorna naixement
      fi_func
      
  • interrogantPregunta 12: Pots posar un exemple en una matriu 10×10 que hagis provat amb el teu programa? (indica els individus inicials, com ha quedat després d’aplicar les dues lleis un cop i l’explicació de perquè és correcte)

petjadaPas 3: Investigar diferents comunitats

Ara que ja tens el teu laboratori de vida artificial acabat, pots fer investigacions sobre l’evolució de diferents comunitats d’individus. Et proposem que facis tota la recerca en un tauler de 10×10 o superior. Per cada nova comunitat, pots executar un cop el programa per a veure com evoluciona, i un cop entès, tornar a executar el programa per veure com continua i així consecutivament.

  • interrogantPregunta 13: Què passa si proves una comunitat que només té un individu inicialment? Depèn de la posició al tauler?
  • interrogantPregunta 14: Què passa si la comunitat inicial és de dos veïns? Quantes possibilitats diferents hi ha? Depèn de la posició relativa entre individus? Depèn de la posició al tauler?
    • Si tens un tauler gran, pots provar què passa a diferents comunitats si les poses separades entre si, per exemple:
      • geojs-gameoflife-two2cellCommunities
  • interrogantPregunta 15: Què passa si poses tres individus en diagonal? Passa el mateix amb qualsevol comunitat que estigui en diagonal?
  • puzzleRepte 1: Investiga les comunitats amb tres individus.
    • Fes proves amb totes les comunitats amb tres individus inicials que no estiguin separats. I observa si els passa alguna d’aquestes situacions:
      • Extinció: la població desapareix.
      • Estabilitat: la població resta igual.
      • Oscil·lació: la població no creix ni decreix, simplement canvia de forma periòdicament.
    • S’anomena polyplet (o polyking) a qualsevol conjunt de cel·les connectades ortogonalment o diagonalment. Exemple polyplets de tres components (o triplets):
      • geojs-gameoflife-triplets
    • interrogantPregunta 16: Quina evolució ha fet cadascun dels triplets? (si són oscil·ladors, indica el període)
  • puzzleRepte 2: Investiga els tetrominos.
    • Si en comptes d’haver 3 individus inicials, n’hi ha 4, el nombre de possibilitats augmenta a 22! Aquest cop doncs, enlloc d’investigar els polyplets de 4 (tetroplets), només n’investigarem un subconjunt d’aquests, els que no tenen individus en diagonal, que s’anomenen tetrominos:
      • geojs-gameoflife-tretrominos
      • Hi ha qui també els anomena tetriminos ja que són els que apareixen al joc d’ordinador Tetris.
    • interrogantPregunta 17: Quina evolució ha fet cadascun dels tetrominos? (si són oscil·ladors, indica el període)
    • interrogantPregunta 18: Pots proposar un tetroplet (no inclòs en els tetrominos anteriors) i explicar com evoluciona?
  • puzzleRepte 3: Investiga els lliscadors.
    • Un lliscador és una comunitat que oscil·la i es desplaça alhora, per exemple aquest pentaplet:
      • geojs-gameoflife-glider5
    • interrogantPregunta 19: Pots fer col·lisionar dos lliscadors dels anteriors? Què observes en funció de les seves posicions inicials?
    • interrogantPregunta 20: Pots construir un altre lliscador?
  • puzzleRepte 4: Investiga els depredadors.
    • interrogantPregunta 21: Per què creus que la següent població té el nom de depredador?
      • geojs-gameoflife-eater2
    • interrogantPregunta 22: Pots trobar algun altra població que també sigui depredadora?

interrogantPregunta de Síntesi 1: Et veuries capaç de descriure un parell de situacions on et podrien ser útils les tècniques que après en aquesta activitat? Descriu-les per tal de compartir-les en grup.

interrogantPregunta de Síntesi 2: Quina relació veus entre les formes complexes de la bandada d’ocells del següent vídeo i l’activitat que acabes de fer?

 

mesI després…

geojs-gameoflife-screenshotFelicitats! Has creat el teu propi laboratori de vida artificial, ets tot un hacker! Ara ja pots plantejar-te simular altres tipus d’organismes i estudiar el seu comportament…

Pensa, que amb aquesta activitat has aprés com:

  • Declarar i manipular matrius
  • Fer tests unitaris de fragments del teu programa
  • Oferir una interfície gràfica per a que l’usuari pugui aportar informació
  • Conceptes matemàtics com els polyplets o els polyminos.

Ara pots continuar amb:

Fitxa DidàcticaFitxa didàctica

Teniu a disposició informació docent sobre les activitats de Geogebra amb JavaScript (GeoJS) i una fitxa didàctica general sobre com desenvolupar les activitats d’EduLogiX.

Enllaços externs:

feather AutoriaJordi Campos i Miralles i Manel Martínez i Pascual (el tercer pas està inspirat en l’activitat Game of Life del projecte Descartes).

Licencia de Creative CommonsPodeu usar el contingut i modificar-lo d’acord amb la Llicència Creative Commons Reconeixement-CompartirIgual 4.0.

Anuncis

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out / Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out / Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out / Canvia )

Google+ photo

Esteu comentant fent servir el compte Google+. Log Out / Canvia )

Connecting to %s