cura di Tommaso Pantuso - Giornalista IT

6
cura di Tommaso Pantuso I Flib di Roberto Boccato S. Donà di Piave (VE) Il programma che Vi propongo e che gira nel Commodore 64 mi è stato suggerito dalla lettura dell'articolo di A.K. Dewdney «Esplorando algoritmi genetici in un mare primordiale pieno di tlib» apparso nella rubrica (Ri) creazioni al calcolatore del numero di gennaio 86 di Le Scienze. In questo programma viene simula- ta l'esistenza di particolari organismi detti tlib (da «finite living blobs» o bolle viventi finite), immersi in un am- biente digitale chiamato dall'autore brodo primordiale, con evidente riferi- mento alle condizioni esistenti negli oceani terrestri qualche miliardo di anni fa in coincidenza con l'apparizio- ne sul pianeta delle prime strutture vi- tali. In realtà la primitività dei tlib è no- tevole, in quanto la loro vita trascorre quasi unicamente con lo scopo di ri- spondere ad una varietà molto limitata di stimoli ambientali che intluiscono sull'organismo a seconda del partico- lare stato in cui esso si trova in un cer- to istante. Supponiamo che gli stimoli ambien- tali si riducano a due e vengano intro- dotti nel brodo primordiale in una se- quenza determinata. Supponiamo an- che che i tlib possano esistere solo in 4 stati diversi (non importa conoscere i particolari di questi stati). Potremo al- lora rendere il calcolatore in grado di controllare questa situazione adope- rando una serie di Oe I per rappresen- tare gli stimoli ambientali (ogni cifra corrisponde ad uno stimolo) e le lette- re a, b, c, d, per rappresentare gli stati possibili dei tlib. Ogni tlib reagisce ad uno stimolo ambientale in un modo che dipende dal suo stato: percepito lo stimolo, il tlib emette un segnale (anche qui uno O o un I) in risposta, e cambia il suo stato in un altro tra quelli disponibili. Naturalmente i tlib sono diversi l'u- no dall'altro, per lo meno all'inizio. Potremmo schematizzare l'esistenza di un tlib con una tabella: 0 l a 0 b l c - .... _-- -- -- b l a 0 d _._--" ._-- c l a l b ____ o -- d 0 c 0 a Da questa tabella si ricava che se un tlib si trova ad esempio nello stato c e in quel momento lo stimolo ambienta- le è I allora il tlib emette un l e passa nello stato b. Oppure se il tlib si trova nello stato b e lo stimolo ambientale è uno O, esso emette un I e passa allo stato a. Saranno avvantaggiati nel gioco del- la sopravvivenza quei tlib che riusci- ranno in qualche modo a prevedere lo stimolo ambientaI e successivo, si sa- ranno cioè adattati all'ambiente, che per semplicità supponiamo possa va- riare ma solo in modo cicIico con pe- riodo da 4 a IO. Il tlib avrà previsto l'evolversi ambientaI e se il segnale da lui emesso in risposta allo stimolo pre- cedente coinciderà con lo stimolo am- bientale che arriverà subito dopo. Questo programma è disponibile su cas- sette presso la redazione. Vedere l'elen- co dei programmi disponibili e le istru- zioni per l'acquisto a pago 161. Ad esempio, facendo riferimento al tlib il cui comportamento è rappresen- tato nella tabella precedente, se lo sti- molo attuale è uno O e il flib si trova nello stato c, esso emetterà un I in ri- sposta e cambierà stato. Se lo stimolo ambientaI e successivo sarà proprio un I vorrà dire che il tlib lo avrà previsto. Sottoponiamo ad una serie di 100 stimoli ambientali, che si ripetono in modo cicIico, una popolazione di IO flib. Per ogni stimolo successivo previ- sto da un flib gli assegneremo I punto. Ovviamente esisteranno nella popola- zione flib che riescono a prevedere meglio degli altri la successione di sti- Nota I codici di controllo nei listati sono ri- portati in forma «esplicita», in conse- guenza dell'impiego della stampante Star NLlO e relativa interfaccia per Commodore. Ovviamente, nella digita- zione del programma è necessario usare i consueti tasti che corrispondono alle indicazioni fra parentesi: ad esempio cursore destro per (RGHl), CTRL-3 per (RED) eccetera. (CLR) :'] (YEL) :il (HOME) - ;:t (RVS) - ~ (DOWN) :111 (OFF) !! (UP) - :-1 (ORNG) ~~ (RGlIT) - •• (BRN) - R (LEF'T) •• (LRED) - a (BLK) (GRY1) - ~ (WHT) - =- (GRY2) ~~ (RED) ::11 (LGRN) Il (CYN) Il... (LBLU) - ~ (PUR) - g (GRY3) ... •• (GRN) •• (SWLC) ~I - (BLU) il 148 MCmicrocomputer n. 54 -luglio/agosto 1986

Transcript of cura di Tommaso Pantuso - Giornalista IT

Page 1: cura di Tommaso Pantuso - Giornalista IT

cura di Tommaso Pantuso

IFlibdi Roberto BoccatoS. Donà di Piave (VE)

Il programma che Vi propongo eche gira nel Commodore 64 mi è statosuggerito dalla lettura dell'articolo diA.K. Dewdney «Esplorando algoritmigenetici in un mare primordiale pienodi tlib» apparso nella rubrica (Ri)creazioni al calcolatore del numero digennaio 86 di Le Scienze.

In questo programma viene simula-ta l'esistenza di particolari organismidetti tlib (da «finite living blobs» obolle viventi finite), immersi in un am-biente digitale chiamato dall'autorebrodo primordiale, con evidente riferi-mento alle condizioni esistenti neglioceani terrestri qualche miliardo dianni fa in coincidenza con l'apparizio-ne sul pianeta delle prime strutture vi-tali.

In realtà la primitività dei tlib è no-tevole, in quanto la loro vita trascorrequasi unicamente con lo scopo di ri-spondere ad una varietà molto limitatadi stimoli ambientali che intluisconosull'organismo a seconda del partico-lare stato in cui esso si trova in un cer-to istante.

Supponiamo che gli stimoli ambien-tali si riducano a due e vengano intro-dotti nel brodo primordiale in una se-quenza determinata. Supponiamo an-che che i tlib possano esistere solo in 4stati diversi (non importa conoscere iparticolari di questi stati). Potremo al-lora rendere il calcolatore in grado dicontrollare questa situazione adope-rando una serie di Oe I per rappresen-tare gli stimoli ambientali (ogni cifracorrisponde ad uno stimolo) e le lette-re a, b, c, d, per rappresentare gli statipossibili dei tlib.

Ogni tlib reagisce ad uno stimolo

ambientale in un modo che dipendedal suo stato: percepito lo stimolo, iltlib emette un segnale (anche qui unoO o un I) in risposta, e cambia il suostato in un altro tra quelli disponibili.

Naturalmente i tlib sono diversi l'u-no dall'altro, per lo meno all'inizio.

Potremmo schematizzare l'esistenzadi un tlib con una tabella:

0 l

a 0 b l c- ...._-- -- --b l a 0 d

_._--" ._--

c l a l b____ o --

d 0 c 0 a

Da questa tabella si ricava che se untlib si trova ad esempio nello stato c ein quel momento lo stimolo ambienta-le è I allora il tlib emette un l e passanello stato b. Oppure se il tlib si trovanello stato b e lo stimolo ambientale èuno O, esso emette un I e passa allostato a.

Saranno avvantaggiati nel gioco del-la sopravvivenza quei tlib che riusci-ranno in qualche modo a prevedere lostimolo ambientaI e successivo, si sa-ranno cioè adattati all'ambiente, cheper semplicità supponiamo possa va-riare ma solo in modo cicIico con pe-riodo da 4 a IO. Il tlib avrà previstol'evolversi ambientaI e se il segnale dalui emesso in risposta allo stimolo pre-cedente coinciderà con lo stimolo am-bientale che arriverà subito dopo.

Questo programma è disponibile su cas-sette presso la redazione. Vedere l'elen-co dei programmi disponibili e le istru-zioni per l'acquisto a pago 161.

Ad esempio, facendo riferimento altlib il cui comportamento è rappresen-tato nella tabella precedente, se lo sti-molo attuale è uno O e il flib si trovanello stato c, esso emetterà un I in ri-sposta e cambierà stato. Se lo stimoloambientaI e successivo sarà proprio unI vorrà dire che il tlib lo avrà previsto.

Sottoponiamo ad una serie di 100stimoli ambientali, che si ripetono inmodo cicIico, una popolazione di IOflib. Per ogni stimolo successivo previ-sto da un flib gli assegneremo I punto.Ovviamente esisteranno nella popola-zione flib che riescono a prevederemeglio degli altri la successione di sti-

NotaI codici di controllo nei listati sono ri-portati in forma «esplicita», in conse-guenza dell'impiego della stampanteStar NLlO e relativa interfaccia perCommodore. Ovviamente, nella digita-zione del programma è necessario usarei consueti tasti che corrispondono alleindicazioni fra parentesi: ad esempiocursore destro per (RGHl), CTRL-3per (RED) eccetera.

(CLR) :'] (YEL) :il(HOME) - ;:t (RVS) - ~(DOWN) :111 (OFF) !!(UP) - :-1 (ORNG) ~~(RGlIT) - •• (BRN) - R(LEF'T) •• (LRED) - a(BLK) • (GRY1) - ~(WHT) -

=-(GRY2) ~~

(RED) ::11 (LGRN) Il(CYN) Il... (LBLU) - ~(PUR) - g (GRY3) ...••(GRN) •• (SWLC) ~I-(BLU) il

148 MCmicrocomputer n. 54 -luglio/agosto 1986

Page 2: cura di Tommaso Pantuso - Giornalista IT

----------- .....software10 REM ***************************:138320 REM * *:114330 REM * F L I B *:131040 REM * *:116350 REM * DI ROBERTO BOCCATO *:185060 REM * *:118370 REM ***************************:144380 REM:22390 REM:233100 GE-1 :PRINT" (CLR) " :PRINT" (WHT) (UP) " :POKE53280.0:POKE53281.0:PRINTCHR$(14) "(UP) ":3246110 PRINT" (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) " :PRINTSPC(3) :PRINT"SEQUENZA": 1988120 PRINT"{UP) (UP) ":PRINTSPC(14) :PRINT"GEN.":1693130 PRINT" (UP) (UP) ":PRINTSPC(20) :PRINT"STIMOLO": 1987140 PRINT" (UP) (UP) ":PRINTSPC(30) :PRINT"P.TOT.":PRINT· ••·:2164150 FORNF-1T010:PRINT"FLIB N."NF:NEXT:1971160 FORI-bT09:FORJ-OT014STEP2:1780170 LO-1075+J+40*L:LU-55347+J+40*L:2893180 U-INT{RND(1)*2)+48:POKELO+40*I.U:POKELU+40*I.1:POKELU+40*I+4,l:4708190 S-INT{RND(1)*4)+1:POKELO+40*I+1.S:POKELU+40*I+1.1:POKELU+40*I+4.1:5095200 NEXTJ,I:521210 FORLS-1093T01453STEP40:1519220 SF-INT{RND(1)*4)+1:1573230 POKELS.SF:737240 NEXTLS:529250 FORPL-55371T055731STEP40:POKEPL.1:NEXTPL:2470260 FORLP-1099T01459STEP40:1323270 POKELP.48:NEXTLP:818280 PRINT:PRINT:PRINT""NTRODUCI LA SEQUENZA DI STIMOLI":3060290 PRINT"AMBIENTALI (MIN.4 - MAX .10) :1869300 PRINT" (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) "SPC{l) :INPUTSA$:POKE1865.32:1565310 PE-LEN{SA$) :IFPE<40RPE)10TIlENPRINT"(UP) (UP) (UP) (UP) (UP) (UP) (UP) (UP) " :GOT0300: 3908320 FORCO-1TOPE:880330 IFMID${SA$,CO.1)-"0"ORMID${SA$.CO.1)-"1"THENNEXTCO:GOT0350:3269340 PRINT" (UP) (UP) (UP) (UP) (UP) (UP) (UP) {UP)":GOT0300:1808350 PRINT" (UP) (UP) (UP) (UP) (UP) (UP) (UP) (UP) (UP)rRA STO SOTTOPONENDO I 10 FLIB AD UNA":4265360 PRINT"SERIE DI 100 STIMOLI AMBIENTALI AVENTI":2906370 PRINT"PER BASE LA SEQUENZA CHE MI HAI FORNITO": 2948380 FORDE-1TOPE:931390 POKE678+DE.ASC{MID$(SA$.DE,l» :1822400 NEXTDE:412410 REM:298420 REM:308430 REM *** MODULO 1 ***:1435440 REM:328450 REM:338460 A-1:POKE252.A:968470 B-1 :PRINTCHR$(19) :FORQT-OT09:PU{QT)-0:NEXTQT:WW-0:3442480 PRINT" (HOME) ":PRINTSPC(21) :PRINT" (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) {DOWN} (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) " :1761490 PRINT" (HOME) ":FORV-OT09: PRINTSPC (34) :PRINT" ":PRINTSPC(34) "(UP) "PU{QT) :NEXTV:PRINT"":3872

MCmicrocomputer n. 54 - luglio/agosto 1986

500 PRINT" (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) {DOWN} (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) {DOWN} (DOWN) {DOWN} {DOWN} (DOWN) ":PRINTSPC(13)GE:PRINTCHR$(19) :2076510 Sl-PEEK(679) :1006520 IFA)PETIlENA-1:999530 PRINT" {HOME}" :PRINTSPC(21) :PRINT" (DOWN) (DOWN) (DOWN) {DOWN} {DOWN} (DOWN) (DOWN) {DOWN} (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) {DOWN} (DOWN) (DOWN) (DOWN) (DOWN} "B:PRINT" (HOME) ":1760540 SS-PEEK(678+A) :S2-PEEK(679+A) :2094550 FORQT-OT09:781560 C-PEEK(1093+40*QT) :C1-1093+40*QT:2546570 US-4*{C-1)+2*{SS~48) :MS-PEEK(1075+US+40*QT} :M1-PEEK(1076+US+40*QT} :5525580 POKEC1.M1:507590 IFA-PEANDMS-S1TIlENPU(QT)-PU(QT}+1:PRINTSPC(34)PU{QT) :WW-WW+1:NEXTQT:GOT0630:5078600 IFMS-S2TIlENPU{QT}-PU(QT)+1:PRINTSPC{34)PU(QT) :WW-WW+1:NEXTQT:GOT0630:4522610 PRINT:253620 NEXTQT:405630 B-B+1:IFB-101TIlEN700:1554640 A-A+1:PRINTCHR$(19) :GOT0520:1600650 REM: 283660 REM:293670 REM *** MODULO 2 ***:1421680 REM:313690 REM:323700 PRINT" (HOME) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) {DOWN} {DOWN} (DOWN) (DOWN) (DOWN) (DOWN)

";:2374710 PRINT"

":2565720 FORT-1T0500:NEXTT:1235730 PRINT" (HOME) (DOWN) (DOWN) {DOWN} (DOWN) (DOWN) {DOWN} (DOWN) {DOWN} {DOWN} (DOWN) (DOWN) (DOWN) (DOWN).TO ORDINANDO I FLIB IN BASE AL ":3106740 PRINT" {UP} PUNTEGGIO REALIZZATO DURANTE IL

TEST. " ; :3388750 PRINT"-RA QUALCHE ISTANTE ORDINERO' ANCHE

LA ";:3281760 PRINT"TABELLA SUL VIDEO.": 1701770 D-100:N--1:930780 FORQT-OT09:IFPU{QT)-DTIlENN-N+1:GOSUB820:2683790 NEXTQT:320800 IFN-9 TIlEN860:844810 D-D-1:GOT0780:933820 FORLO-OT018:834830 POKE50000+LO+40*N, PEEK (1075+LO+40*QT) :2762840 POKE50020+40*N.PU{QT} :1448850 NEXTLO: RETURN: 570860 PRINT" (HOME)" :PRINTSPC{30} :PRINT" (DOWN) {DOWN} {DOWN} (DOWN) {DOWN} (DOWN) (DOWN) {DOWN} {DOWN} {DOWN} (DOWN) (DOWN) (DOWN) (DOWN) {DOWN} (DOWN) (DOWN) (DOWN) {DOWN} (DOWN) " :1695870 PRINT" (HOME) ":PRINTSPC(30) :PRINT"{DOWN} {DOWN} (DOWN) (DOWN) (DOWN) (DOWN) {DOWN} (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) {DOWN} (DOWN) (DOWN) "WW: 1655880 FORI-OT09:FORJ-OT018:1520890 POKE1075+J+40*I,PEEK{50000+J+40*I) :2563900 NEXTJ:NEXTI:600910 PRINTCHR${19} :684920 FORI-OT09:PRINTSPC(34)" ":PRINT"{UP)"SPC(34)PEEK{50020+40*I) :3292930 NEXTI:368940 XS-0:572950 SM-INT{RND(1)*4)+1:IFSM-1TIlENXS-1:2694

(continua a pagina J 50)

149

Page 3: cura di Tommaso Pantuso - Giornalista IT

";: 2559";: 2569

":2520

4 ***:1326MODULO***

1430 PRINT"

"; :24541570 PRINT" ": 11251580 IFPP=176THENPOKE1075+J+40*I,49:FORT-1T01000 :NEXTT:PRINT" (HOME) (UP) " :GE-GE+1 :GOT0470 :4775 •1590 IFPP-177THENPOKE1075+J+40*I,48:FORT-1T01OOO:NEXTT:PRINT" (HOME) (UP) ":GE-GE+1:GOT0470:47851600 AA-INT(RND(1)*4)+1:14001610 IFAA-PP-128THEN1600:13791620 POKE1075+J+40*I.AA:13791630 FORT-1T01000:NEXTT:GE-GE+1:PRINT" (HOME) (UP)":GOT0470:26971640 GOT01640:450

1440 FORT-1T0500:NEXTT:11901450 PRINT" (UP) (UP) (UP) (UP) (UP) (UP)-' IN ARRIVO UN RAGGIO COSMICO":34091460 PRINT"(UP)CHE INDURRA' UNA MUTAZIONE NEL

CROMOSOMA":33301470 PRINT"(UP)(UP)DI UN FLIB. "L GENE MUTATO

LAMPEGGERA''':33351480 PRINT" (UP)PER QUALCHE ISTANTE.":19631490 J-INT(RND(1l*16) :I-INT(RND(ll*lO) :V-0:28481500 POKE1075+J+40*I,PEEK(1075+J+40*I)+128:29481510 FORT-IT0200:NEXTT:IFV-10THEN1540:21841520 POKE1075+J+40*I.PEEK(1075+J+40*I)-128:V-V+l:35961530 FORT=lT0200:NEXTT:GOT01500:16701540 PP-PEEK(1075+J+40*I) :15871550 PRI NT" (HOME) " :PRI NT" (OOWN) (DOWN) (OOWN) (OOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) I

"; :22741560 PRINT"

1420 PRINT"

1340 FORT-1T01000:NEXTT:11341350 REM:2181360 REM:2281370 REM1380 REM: 2481390 REM:2581400 PRINT" (HOME)" :PRINT" (OOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (OOWN) (DOWN) (DOWN) (DOWN) (DOWN) ":20791410 PRINT"

1070 PRINT""; :1578

1080 PRINT"

"; :2224

":17851090 FORT-1T01000:NEXTT:11391100 RC-INT(RND(1)*8)+1:14331110 R1-INT(RND(1)*6)+1:R2-INT(RND(1)*6)+3:28171120 PRINT" (UP) (UP) (UP) (UP)rRA IL FLlB N. 1 SI ACCOPPIA CON IL":32231130 PRINT" (UP)FLIB N."RC+1". "L FLlB IBRIDORISULTANTE "; :34641140 PRINT"SOSTITUISCE QUELLO CHE NEL TEST PRECE-" :29931150 PRINT" (UP)DENTE HA OTTENUTO IL MINOR PUNTEGGIO.":30771160 FORIB-1TOR1:9301170 POKE50999+IB.PEEK(1074+IB) :POKE1074+IB,PEEK(1074+IB)+128:35931180 NEXTIB:4291190 FORIB-R1+1TOR1+R2:15631200 POKE50999+IB,PEEK(1074+40*RC+IB) :POKE1074+40*RC+IB,PEEK(1074+40*RC+IB) +128:53961210 NEXTIB:4591220 FORIB-R1+R2+1T016:15651230 POKE50999+IB,PEEK(1074+IB) :POKE1074+IB,PEEK(1074+IB)+128:36531240 NEXTI B :4891250 FORJ-OT015:9251260 POKE1435+J.PEEK(51000+J)+128:19741270 NEXTJ:4541280 PRINT" (HOME) ":PRINT" (DOWN) (OOWN) (OOWN) (OOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) "SPC(35) :PRINT" ":13631290 FORT-1T02000:NEXTT:10851300 FORI-OT09:FORJ-OT015:14271310 LL-1075+J+40*I:13291320 IFPEEK(LL) >127THENPOKELL.PEEK(LL)-128:22091330 NEXTJ:NEXTI:520

990 IFSM-1THEN1060:11171000 GOT01400:5691010 REM:3881020 REM:3981030 REM *** MODULO 3 ***:12401040 REM: 1631050 REM:1731060 PRINT" (HOME) (DOWN) (DOWN) (DOWN) (DOWN) (OOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN)

{H'gllt' dll flll,l.!UIcI I-IV

moli: sono quelli che totalizzeranno ipunteggi più alti.

Ogni nib contiene un cromosoma.Niente paura! non è altro che unastringa di caratteri (O, l ,a,b,c,d) che siottiene ritagliando la tabella vista so-pra lungo le righe ed unendone i capi.Il cromosoma del nib descritto nellatabella è quindi così strutturato:

10b lcJla0dlla lbl0c0al

Come ogni organismo che si rispettiil nib si riproduce. on ci interessa lamodalità di riproduzione, ma solo ilprodotto di essa che è un altro nib ilcui cromosoma è ibrido tra quello deigenitori. Si verifica cioè quello che ingenetica si chiama crossing-over: unpezzo del cromosoma è uguale a quel-

lo paterno, il pezzo successivo a quellomaterno, poi è di nuovo uguale al pa-terno, ecc.

La simulazione ha lo scopo di por-tare una popolazione di nib in condi-zione di massimo adattamento all'am-biente. Allora è necessario che alla ri-produzione partecipi sempre il nib cheha ottenuto il miglior punteggio nelprecedente ciclo di test con l'ambien-te. Il partner può essere uno qualsiasidegli altri nib «inferiori», tranne l'ulti-mo. Il prodotto del loro accoppiamen-to deve sempre sostituire il nib con ilpunteggio inferiore che in questo mo-do si estingue essendo non sufficienteil suo grado di adattamento.

Se le cose sembrano cosÌ tropposemplici, ecco intervenire un raggiocosmico a mutare il cromosoma di

qualche nib. Il raggio colpisce a casoil cromosoma, quindi può colpire ungene che specifica uno stato oppurequello che specifica una certa rispostaad uno stimolo ambientale. Nel primocaso il carattere viene sostituito conuno dei tre rimasti scelti a caso, nel se-condo caso il carattere l è sostituitoda uno zero, oppure lo O è sostituitoda un I.

Il programma è suddiviso in 5 bloc-chi di cui il primo è dedicato all'inizia-lizzazione, cioè alla determinazionedei nib partecipanti alla simulazione ealla richiesta della serie fondamentaledi stimoli (una serie di O e 1 min 4 -max lO) che poi saranno proposti innumero di 100 alla popolazione.

I restanti 4 moduli sono ciclici.Nel primo avviene il test dei IO nib

150 MCmicrocomputer n. 54 - luglio/agosto 1986

Page 4: cura di Tommaso Pantuso - Giornalista IT

gene cromosoma ibridogene cromosomariconoscimento caratteri inreverselocazione griglialocazione punteggiolocazione stato fliblocazione colore griglianumero riga della matricememorizzata dalla loc. 50000numero flibperiodo sequenza stimolilocazione colore punteggiocontenuto locazione mutatodal raggiopunteggio flibciclo stimolazione flibpunto di cross-overpunto di cross-overflib che si accoppia con ilnumero Istato flib nel cromosomasequenza stimoli ambientai istato del flibnumero casuale per sceltamodulo successivostimolo ambientale attualeprima posizione in memoriadella sequenza stimoliposizioni successive nella se-quenzarisposta del flib a uno stimo-lopunteggio totale popolazioneattualericonoscimento per la stam-pante dell'avvenuta riprodu-zIOne

XS

IBJ

LL

LOLPLSLU

N

NFPEPLPP

ww

PU(QnQTRIR2RC

SSA$

SFSMSSSI

S2

US

Certamente a tutti gli utilizzatori diun CBM 64 sarà capitato di non ricor-dare la locazione da porre dopo laSYS per far partire un programma inlinguaggio macchina: sia esso un gio-co che una utility o altro. L'ideale sa-rebbe, sicuramente, quello di poter ca-ricare questi programmi con un sem-plice LOAD e avviarli con un RUN.

Lo scopo del programma Locatore èquello, di trasformare un programmascritto in codice macchina posto inuna qualsiasi parte della RAM acces-sibile all'utente, in uno caricabile edeseguibile come un normale program-ma Basic. Per consentire questa varia-zione, il programma, dopo la traslazio-ne nella RAM Basic, viene fornito diuna piccola routine in L.M. che servea riposizionarlo nella sua naturale se-de dopo il RUN e ad avviarlo.

Locatore è utilizzabile sia per pro-grammi su nastro che su disco.

Vediamone le modalità d'uso.

Modalità d'usoPer poter utilizzare Locatore, biso-

gna caricare in memoria un breve pro-

ILocatoredi Vincenzo Schena - Fasano (BR)

Analisi del listato100-140 inizializzazione.150-270 visualizza la popolazione di

flib, il loro stato attuale, illoro punteggio attuale.richiesta sequenza stimoliambientali.memorizza la sequenza.applica una serie di 100 sti-moli alla popolazione diflib.riordina la posizione dei flibin base al loro punteggio de-crescente.scelta prossimo modulo (ri-produzione o mutazione).eventuali istruzioni per lastampante.scelta punti di cross-over.evidenzia i flib che si incro-ciano e il cross-over dei cro-mosomi rispettivi.genera il raggio cosmico chefa mutare un gene di un fliba caso.

Consiglio vivamente agli interessatidi procurarsi una copia della rivistache riporta l'articolo. In esso sono de-scritti più ampiamente i particolaridella simulazione.

280-330

1100-11101160-1270

380-400460-640

770-930

1490-1620

940-950

960-980

Elenco delle variabiliusate nel programma

A puntatore lettura sequenzaAA mutazione stato

B contatore stimoli ambientaI iC stato del flib sotto controllo

CO controllo caratteri sequenzaD valore decrescente per con-

trollo punteggioDE locazioni deposito della se-

quenza stimoliG E numero generazione

l numero cromosoma (riga)

Note per la copiatura dei listati per il 64Nel numero 44 (settembre 85) è stato pubblicato un programma di Checksum per

aiutare i lettori nella copiatura dei listati per il Commodore 64 pubblicali sulla rivista.Il funzionamento è il seguente:- copiate il programma Checksum del numero 44 e salvatelo su disco o cassetta:- per la successiva copiatura di un listato (con Checksum), caricate (dal vostro di-

,co o dal vostro nastro) il programma di Checksum e fatelo partire; a questo punto po-tete copiare le varie linee del listato, compresi i due punti ed il numero che trovate allafine di ciascuna riga. Alla pressione del return, se la linea è stata copiata bene si puòpassare a copiare la successiva, altrimenti il programma di Checksum vi lascerà "in-chiodati" sulla linea mal copiata obbligandovi a correggere l'errore prima di prosegui-re.

A quanto detto nel numero 44 riguardo al programma Checksum in questione, ag-giungiamo che la routine di Checksum in LM si avvia con SYS 52480 mentre, in casoetIiarresto con Run-Stop/Restore, il restart si effettua con SYS 53072.

Attenzione: chi non vuole usare il Checksum, ON DEVE copiare i due punti e ilnumero alla fine delle righe, pena la segnalazione di "syntax error" da parte del com-puter.

----------- s,oftwarecon i 100 stimoli ambientali e viene as- generazione considerata.segnato il punteggio ad ognuno. Le righe da aggiungere al program-

Il secondo modulo identifica il flib ma volendo usare la stampante, sono:con il punteggio più alto e quello conil punteggio più basso. 960 open4,4

Il terzo modulo provvede ad incro- 970 print#4,ge;ww;peek(50020);ciare il flib con punteggio più alto con peek(50380) ;xsun altro a caso e a sostituire il flib con 980 close4,4punteggio più basso con il prodotto ditale incrocio.

Nel quarto modulo è simulato l'arri-vo di un raggio cosmico che colpisce ilcromosoma di un flib e provoca unamutazione.

Poi si ritorna al modulo l.Il passaggio dal secondo al terzo

modulo non è automatico, nel sensoche non sempre il flib più adatto al-l'ambiente si riproduce.

Questo è, per sommi capi, il funzio-naJ!1ento del programma.

E scritto totalmente in basic e quin-di è piuttosto lento.

La scelta del basic è stata dettata pe-rò dalla convinzione che, come dice lostesso autore dall'articolo, ci sia anco-ra molta sperimentazione da fare suquesto tipo di programmi in cui com-paiono algoritmi genetici. Ho quindipreferito non introdurre routine in lin-guaggio macchina che renderebberomeno leggibile il programma.

L'uso della stampante è consigliatoin quanto rende possibile il controllodelle generazioni passate che sono or-mai scomparse dal video.

Le 5 colonne visualizzano nell'ordi-ne:

I - la generazione2 - il punteggio totale della popola-

zione nella generazione consi-derata (è un indice dell'adatta-mento della popolazione al-l'ambiente)

3 il punteggio del flib più adatta-to all'ambiente

4 il punteggio del flib meno adat-tato all'ambiente

5 l'avvenuta (l) o non avvenuta(O) riproduzione dei flib nella

MCmicrocomputer n. 54 - luglio/agosto 1986 151

Page 5: cura di Tommaso Pantuso - Giornalista IT

1 REM ***********************:11422 REM ** L O C A T O RE **:12983 REM ** ** :9544 REM ** BY **:10465 REM ** ** :9566 REM ** VINCENZO SCHENA **:15637 REM ***********************:11488 : :6610 CK-O:PRINT" (CLR) (WHT) (DOWN) (DOWN) (RGIIT)(RGIIT)(RVS) STO CARICANDO LA PRIMA PARTE DI DATA (OFF) ":346820 FORI-682T0714:READA:POKEI.A:POKE53281.A:CK-CK+A:NEXTI:POKE53281.15:373630 IFCK<)3476TIlENPRINT"ERRORE NEL PRIMO GRUPPO DI DATA! ":END:362340 CK-O:PRINT"TUTTO O.K.":PRINT"(DOWN) (RGIIT)(RGIIT)(RVS) STO CARICANDO LA SECONDA PARTE DI DATA(OFF)":44~450 POKE53280.1:FORI-40960T041187:READA:POKEI.A:POKE53280.A:CK-CK+A :NEXTI :391560 IFCK< )25741TIlENPRINT"ERRORE NEL SECONDO GRUPPO DI DATA!" :END:383270 PRINT"TUTTO O.K.!":FORI-OT01000:NEXTI:POKE53280.15:273580 PRINT" (CLR) (BLK) "CHR$ (14) "(DOWN) (DOWN) (DOWN) (DOWN) (RGIIT)(RGIIT)xUOI LE' ISTRUZIONI? (SIN)" :304390 GETA$: IFA$-"N"TIiENPRINT" (CLR) " :END: 1695100 IFA$< )"S"TIlEN90: 1119110 PRINT" (CLR) (DOWN) -- ..,STRUZIONI PER L'USO -":3616120 PRINT"(DOWN) ìER USARE IL PROGRAMMA BASTA":2547130 PRINT" INSERIRE IL DISCHETTO O":PRINT" LA CASSETTA CONTENENTE IL" :4239135 PRINT" PROGRAMMA DA TRASFORMARE. ":PRINT" E DIGITARE:":3392140 PRINT" (DOWN) (RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RVS). I.LOCAZIONE. INIZ"CHR$(34) "NOME PROG"CHR$(34) ;3695145 PRINT" (DOWN) (RGIIT)(RGIIT)DOVE: ":801150 PRINT" (RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT) (RGIIT)(RGIIT)r" :PRINT:'(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)I 686 -) PER IL NASTRO":3041155 PRINT" (RGIIT)(RGIIT)LOCAZIONE-l": 1350160 PRINT" (RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT) (RGIIT)(RGIIT)I 682 -) PER IL DISCO":PRINT"(RGIIT) (RGIIT)(RGIIT)(RGIIT) (RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)(RGIIT)''':2943165 PRINT" (DOWN) (RGIIT)(RGIIT)INIT - SYS D'INIZIO DEL PROGRAMMA

IN L.M.":3553170 PRINT"(DOWN) (RGIIT)(RGIIT)NOME - NOME DEL PROGRAMMA IN L.M.":NEW:2832280 REM ***INIZIO DATA ***~*********:16841000 DATA169.8.208.2.169.1.133.2.32.253.174:20471005 DATA32.138.173.32.247.183.72.169.54.133.1:22071010 DATA104.32.0.160.169.55.133.1.76.134.227:21471050 REM:1731060 REM **** SECONDE DATA ********:16101070 REM: 1932000 DATA160.255.200.185.156.160.153.0.8.192.69:22282005 DATA208.245.165.20.141.70.8.165.21.141.71:21722010 DATA8.32.121.0.201.34.208.14.160.0.200:19992015 DATA177.122.201.34.208.249.136.192.17.48.2:22442020 DATA160.0.230.122.152.166.122.164.123.32.189:23292025 DATA255.166.2.224.1.208.17.32.110.160.173:21862030 DATA61.3.141.43.8.173.62.3.141.47.8:19022035 DATA24.96.32.147.160.32.192.255.162.5.32:21622040 DATA198.255.32.207.255.141.43.8.32.207.255:22732045 DATA141.47.8.32.204.255.169.5.32.195.255:21802050 DATA32.147.160.169.0.162.72.160.8.32.213:19132055 DATA255.134.45.132.46.160.255.200.177.187.153:21802060 DATA14.8.196.183.208.246.169.41.153.14.8:19452065 DATA32.231.255.96.169.5.166.2.160.0.76:18422070DATA186.255.0.31.8.193.7.158.50.48.56:18062075 DATA50.58.162.58.40.0.0.0.0.0.0:14662080 DATAO.0.0.0.0.0.0.0.0.0.0:11392085 DATAO.0.0.169.72.133.251.169.8.133.252:18482090 DATA169.0.133.253.169.192.133.254.160.0.177:21142095 DATA251.145.253.200.208.249.230.252.230.254.165:23072100 DATA252.197.46.208,239,76.0,0.0:1528

gramma Basic il quale lo loca nellastessa tramite frasi DATA e dà le ne-cessarie istruzioni per un suo correttouso. Dopo questa facile procedura,Locatore è pronto ad essere usato nelseguente modo:

l) assicuratevi di aver inserito nelDRIVE il dischetto o di aver posizio-nato all'inizio il programma su nastroche intendete trasformare;

2) se utilizzate il DRIVE digitatequanto segue:

SYS682,ST"NOME ••

dove «ST» deve essere la locazioned'inizializzazione del vostro program-ma in linguaggio macchina (il valoreche avreste usato con l'SYS per inten-derci). Mentre NOME è, ovviamente,il nome del programma da trasforma-re. Notate bene che quest'ultimo deveessere esattamente quello del pro-gramma, altrimenti Locatore non fun-zionerà né col nastro e tantomeno coldischetto;

3) se usate il registratore sostituite a682 il valore 686.

Una volta terminata l'esecuzione diLocatore, cioè quando riappare il cur-sore sul video, provate a dare LIST: aquesto punto apparirà la seguente li-nea:

1985 SYS2082:NEW:(nome)

dove nome è lo stesso del precedente.Quindi, a tal punto, salvate il pro-gramma così trasformato con un sem-plice SAVE e potrete ricaricarlo conun normale LOAD.

Descrizione tecnica di LocatoreLocatore è un programma intera-

mente scritto in linguaggio macchinacomposto da due parti: una allocata apartire da 682 ($02AA) fino a 715($02CB), l'altra da 40960 ($AOOO)finoa 41186 ($AOE4).

La prima parte, costituita da pocheistruzioni, è situata in una zona tra leprime quattro pagine di memoria nonusata né dall'interprete Basic tantome-no dal Sistema Operativo (ricordiamoche una pagina di memoria è costituitada 256 bytes). Questa imposta il nume-ro di periferica (registratore o drive);legge la locazione di avvio del pro-gramma da trasformare tramite delleroutine del Basic; disabilita e, in se-guito, riabilita la R.O.M. del Basic. Laseconda parte del programma, che èquella principale, è posta sotto laR.O.M. Basic. La scelta di questa par-ticolare zona della R.A.M. consente ditenere il programma in memoria senzadisturbare eventuali routines di espan-sione (come l'ADP BASIC) poste nel-le usuali zone di memoria usate a talescopo. È interessante soffermarsi su

152 MCmicrocomputer n. 54 - luglio/agosto 1986

Page 6: cura di Tommaso Pantuso - Giornalista IT

---------------....software

10 CO-0:5C-53280:102620 POKE 5C.CO:54330 POKE SC+1.CO:77240 PRINT" (CLR) (GRN) ";TAB(4) "(RV5) PROGRAMMA DI FRANCESCO DA VILLA

(OFF) ":316550 PRINT"(DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (DOWN) (RGlIT)QUESTO PROGRAMMA CONTIENA UNA ROUTINE ":309260 PRINT TAB (7) ;" (DOWN) CHE. PERMETTE DI OTTENERE :": 241170 PRINT TAB(4) " (DOWN) (DOWN) (RVS) [ F1 l (OFF). -) LIST + (RETIJRN)":229980 PRINT TAB(4) "(DOWN) (DOWN) (RVS) [ F7 l (OFF) -) PROGRAMMABILE":229385 PRINT" (DOWN) (RGlIT)(RGlIT)(RGlIT)(RGlIT)(RGlIT)(RGlIT)(RGlIT)(RGlIT)(RGlIT)(RGlIT)(RGlIT)(RGlIT)(RGlIT)(RGlIT)DEFAULT - RUN + (RETURN)": 228490 N-679:512100 READ A:IF A)-OTHENPOKEN.A:N-N+1:GOT0100:2485110 POKE204. O: PRINT" (DOWN) (DOWN) (DOWN) (DOWN) INPUT COMMAND? ";: 1979120 GETA$:IF A$-""THEN120:1272125 IF A$<)CHR$(13)THENB$-B$+A$:PRINTA$;:GOT0120:2666127 IF -B$-,oo'THEN200:959130 N-737:X-LEN(B$) :FORP-1TOX:1995135 POKEN+P.ASC(MID$(B$,P,l» :NEXT:1727140 POKE N+P,0:743150 DATA 120,169,180.141,20.3,169,2.141,21.3.88,96,165,215,201.133,240,7,201:3599160 DATA 136.240.7.76.49,234,162,0.240,2.162.5:2144170 DATA 189,221,2.240,6,32.210.255.232.208.245,169,13.141,119,2.169,1.133.198:3735180 DATA 208.225,76.73,83,84.0.82.85,78,.0.-1:2124200 SYS 679:556

come sia possibile usare questa parti-colare R.A.M.

Bisogna sapere che il microproces-sore 6510 (quello del CBM 64) nono-stante sia compatibile con il 6502(quello del VIC 20), presenta una fon-damentale differenza: ha in più rispet-to al 6502, una cosÌ detta porta di In-put/Output. Essa non è altro che unregistro che serve a selezionare, cioè amettere in contatto con il microproces-sore, dei circuiti di memoria anzichéaltri contenuti nel CBM 64. Questo inparticolare si ottiene settando (cioèmettendo ad I) o disattivando (cioèmettendo a O) gli opportuni bits diquesto registro. Infatti, nonostante iICBM 64 possieda 64K di memoriaR.A.M. indirizzabile, ha in più delleR.O.M. contenenti l'Interprete Basic,il Sistema Operativo, gli Input/Outpute il Generatore di caratteri. Cioè ha unquantitativo di memoria maggiore di64K. Il problema viene risolto comesegue: all'accensione del computer.viene depositato nella locazione I del-la memoria (cioè quella corrisponden-te al sopra citato registro) il valore 55($37) il quale fa in modo che il micro-processore «veda» le R.O.M. suddettee solo una parte di memoria R.A.M.(quella che usiamo per il Basic più al-cuni altri Kbytes). Quindi in particola-re se sostituiamo al 55 il valore 54($36), otteniamo la disattivazione del-l'Interprete Basic. Di contro si aumen-ta la memoria R.A.M. disponibile di 8Kbytes; questo è quanto viene fattonella prima parte del programma inL.M.

Analizziamo, ora, il funzionamentodella seconda parte del programma.Essa comincia con una procedura chericopia nella memoria Basic a partireda 2048 ($0800) la linea che sarà visua-lizzata quando si impartirà il LIST,più un piccolo caricatore che colloche-rà, dopo il RUN, nella opportuna zo-na R.A.M., il programma cosÌ trasfor-mato. Segue una seconda procedurache legge il nome del programma rica-vandone gli opportuni parametri;quindi una terza che seleziona la peri-ferica prescelta. Infine è eseguito il ca-ricamento del programma da manipo-lare accodandolo al caricatore primacitato e leggendo la locazione da cuiesso sarà riposizionato in memoria do-po il RUN. Il tutto si conclude conuna breve routine che ricopia il nomenella linea Basic d'inizializzazione traparentesi e quindi si ritorna nella pri-ma parte di Locatore.

Concludo citando le procedure, im-plementate in R.O.M., che vengonousate dal programma:

$AEFD: serve a saltare la virgola nelSYS che darete;

$AD8A: trasforma un numero ASCIIin un valore interpretabile dal calcola-tore;

$B7F7: trasforma un valore in virgo-la mobile in intero ponendo il bytebasso nella locazione 20 ($14) e il bytealto nella locazione 21 ($15);

$FFBD: prepara i parametri del no-me quando si dà un SAVE, LOADecc ... ;

$FFCO: è la OPEN del Kernal;$FFC6: predispone un canale oppor-

tunamente aperto, come ingresso;$FFCF: mette un byte inviato da una

periferica, nell'accumulatore;$FFCC: chiude tutti i canali;$FFC3: chiude un file logico;$FFD5: LOAD del Kernal;$FFBA: predispone i parametri di un

file:$FFE7: chiude tutti i files aperti;$E386: rimanda il controllo al Basic.

IDefinizionedi due tasti funzionedi Francesco Da Villa - Venezia

Il programma che vi propongo con-sente di assegnare un comando fisso aitasti funzione FI e F7 del Commodore64.

Al tasto Fl è assegnato il comandoLIST, al tasto F7 il comando RUN.Tuttavia quest'ultimo è assegnato co-me default in quanto può essere ridefi-nito dall'utente.

Il programma Basic che alloca laroutine in linguaggio macchina a par-tire dalla locazione 679, richiede ad uncerto punto se si desidera mutare il co-mando RUN con qualsiasi altra fun-zione o gruppo di funzioni.

Questo può essere fatto semplice-mente scrivendo tale nuovo comandoseguito dalla pressione del tasto RE-TURN.

Per esempio provate a scrivere la se-guente stringa:

FOR N=1 TO 100:PRINT N:NEXT

seguita da RETURN.Da questo momento in poi premen-

do F7 si otterrà la stampa dei primi100 numeri naturali.

A parte questa curiosità, particolar-mente utile risulta il seguente coman-do:

LOAD"S",8

che, assieme a LIST associato a F I,consente di manipolare con meno fati-ca la DIRECTORY dei dischi.

Coloro che invece desiderano man-tenere il default RUN per F7, è suffi-ciente che premano solo il tasto RE-TURN quando il programma Basicpone la domanda di cambio.

La routine si attiva semplicementecon un SYS 679 e si disattiva, senzavenire distrutta, con la pressione diRUN/STOP e RESTO RE.

MCmicrocomputer n. 54 - luglio/agosto 1986 153