'FLAWS (THIS LIST COULD BE OUTDATED) 'CURRENTLY IT MYLTIPLIES EVERY COMBINATION OF THE PREVIOUS ONES, AND DOES THE SAME THING UP TO 4 TIMES: THIS RESULTS IN 4 EQUAL VALUES 'THE FACTORS SHOULD NOT BE FOR EACH NEURON, BUT FOR EACH CONNECTION 'MAKE PONG 'GET BALL X,Y 'GET BOUNCER Y 'POSSIBLE PROBLEM: CAN IT EVEN COMPARE? 'SET BOUNCER Y: 1: UP, 2: DOWN ' 'TEST IT BY HAND: TRY TO FIGURE OUT THE PARAMETERS TO SEE IF IT'S POSSIBLE THIS WAY ' 'USE AN ARRAY FOR THE AI PARAMETERS 'MAKE THE AI DECISION FUNCTION 'MAKE A PARAMETER MUTATE FUNCTION 'USE A BATCH OF 20 'MUTATE EVERY ONE OF THEM 'PICK THE BEST ONE 'REPEAT MUTATION_RATE=0.1 'MUTATION_RATE=0.05 SPRITE 0 PAL 1 SPRITE 1 PAL 1 SIZE 3 SPRITE 2 PAL 1 SIZE 3 TEXT 0,8,"FACTORS (*10^-4)" TEXT 0,2,"NEURAL NETWORK" RANDOMIZE TIMER 'GAMEPAD 2 LAYERS=3 DIM GLOBAL CMD(1,1) DIM GLOBAL BAT(1) DIM GLOBAL NEURONS(LAYERS,5) DIM GLOBAL AI(2,LAYERS-1,15) '- TYPE( CURRENT FACTORS, BEST FACTORS OF BATCH, BEST FACTORS ) '- LAYER '- NODE DIM GLOBAL AI_SCORE(2) 'CURRENT SCORE, BEST SCORE OF BATCH, BEST SCORE DIM GLOBAL AI_INDEX(LAYERS) 'HOW MANY NODES ARE IN EACH LAYER AI_INDEX(0)=2 AI_INDEX(1)=3 AI_INDEX(2)=3 AI_INDEX(3)=1 BAT(0)=48 BAT(1)=48 GLOBAL X,Y,DX,DY,AI_BATCH,AI_NUM,PLAYER,LAYERS,SCR,MUTATION_RATE PLAYER=0 SCR=0 ON RASTER CALL SCR ON VBL CALL SCR2 SUB SCR 'SCROLL SCREEN IF RASTER>=57 AND RASTER<=128 THEN SCROLL 0,0,SCR ELSE SCROLL 0,0,0 END IF END SUB SUB SCR2 ADD SCR,0.5,0 TO 128 END SUB IF PLAYER THEN RESET: X=76 Y=60 DX=INT(RND*2)*2-1 DY=INT(RND*2)*2-1 CALL GAME GOTO RESET ELSE DO INC AI_BATCH NUMBER 0,0,AI_BATCH,4 FOR AI_NUM=0 TO 31 'INITIALIZE VARS X=76 Y=60 DX=-1 DY=0.1 'I FORGOT TO RESET THE BAT POSITION BAT(0)=0 'DY=INT(RND*2)*2-1 AI_SCORE(0)=0 'INITIALIZE DISPLAY NUMBER 5,0,AI_NUM,2 NUMBER 9,0,AI_SCORE(0),3 'SIMULATE CALL MUTATE CALL GAME IF AI_SCORE(0)>AI_SCORE(1) THEN AI_SCORE(1)=AI_SCORE(0) NUMBER 13,0,AI_SCORE(1),3 CALL BATCH_LEADER END IF NEXT AI_NUM IF AI_SCORE(1)>AI_SCORE(2) THEN AI_SCORE(2)=AI_SCORE(1) NUMBER 17,0,AI_SCORE(2),3 MUTATION_RATE=0.1*0.9^AI_SCORE(2) CALL LEADER END IF LOOP END IF SUB GAME DO 'GET CONTROLS IF PLAYER THEN FOR I=0 TO 1 CMD(0,I)=-UP(I) CMD(1,I)=-DOWN(I) NEXT I ELSE 'AI INPUT NEURONS(0,0)=BAT(0)/256 NEURONS(0,1)=X/256 NEURONS(0,2)=Y/256 NEURONS(0,3)=DX/256 NEURONS(0,4)=DY/256 NEURONS(0,5)=BAT(1)/256 CALL NEURAL_NETWORK 'NEURONS(0,1)=(159-X)/256 'CALL NEURAL_OPPONENT END IF 'USER/AI CONTROLLED BATS FOR I=0 TO 0 ADD BAT(I),2*(CMD(0,I)*(BAT(I)>0)-CMD(1,I)*(BAT(I)<96)) SPRITE 1+I,152*I,BAT(I),4 NEXT I 'BALL CONTROLS ADD X,DX ADD Y,DY SPRITE 0,X,Y,1 IF X>146 THEN DX=-DX ELSE IF X<6 THEN IF SPRITE HIT(0,1 TO 2) AND (X=5 OR X=147) THEN DX=-DX 'DX=DX*1.1 'DY=DY*1.1 'ADD A VALUE OF 10 OR LOWER TO THE SCORE DEPENDING ON THE HIT DISTANCE TO THE BAT CENTER ADD AI_SCORE(0),10*(1-0.01*ABS(BAT(0)-16-Y)) NUMBER 9,0,AI_SCORE(0),3 'TRACE AI_SCORE(0) END IF END IF IF Y<0 OR Y>120 THEN DY=-DY IF X<0 OR X>152 THEN EXIT 'WAIT VBL LOOP END SUB SUB NEURAL_NETWORK 'AI(1,3,3) '- TYPE( CURRENT VALUES, CURRENT FACTORS, BEST FACTORS OF BATCH, BEST FACTORS ) '- LAYER '- NODE FOR N=0 TO AI_INDEX(0) NUMBER 0,N+3,NEURONS(0,N)*10000,4 NEXT N 'LEVEL, NODE, ITEM FOR L=0 TO LAYERS-1 FOR N=0 TO AI_INDEX(L+1) FOR I=0 TO AI_INDEX(L) ADD NEURONS(L+1,N), NEURONS(L,I)*AI(0,L,I+N*4) NEXT I IF NEURONS(L+1,N)>1 THEN NEURONS(L+1,N)=1 ELSE IF NEURONS(L+1,N)<0 THEN NEURONS(L+1,N)=0 'IF NEURONS(L+1,N)<>0 THEN TRACE " ",NEURONS(L+1,N) NUMBER (L+1)*5,N+3,NEURONS(L+1,N)*10000,4 'WAIT 10 NEXT N NEXT L CMD(0,0)=SGN(NEURONS(L,0)*2) CMD(1,0)=SGN(NEURONS(L,1)*2) IF CMD(0,0)<0 THEN CMD(0,0)=0 IF CMD(1,0)<0 THEN CMD(1,0)=0 'TRACE " ",CMD(0,0),CMD(1,0) END SUB SUB NEURAL_OPPONENT 'AI(1,3,3) '- TYPE( CURRENT VALUES, CURRENT FACTORS, BEST FACTORS OF BATCH, BEST FACTORS ) '- LAYER '- NODE 'THE INPUTS ARE BIGGER THAN ABS(1) 'LEVEL, NODE, ITEM FOR L=0 TO LAYERS-1 FOR N=0 TO AI_INDEX(L+1) FOR I=0 TO AI_INDEX(L) ADD NEURONS(L+1,N), NEURONS(L,I)*AI(0,L,I) NEXT I IF NEURONS(L+1,N)>1 THEN NEURONS(L+1,N)=1 ELSE IF NEURONS(L+1,N)<0 THEN NEURONS(L+1,N)=0 'TRACE NEURONS(L+1,I) NEXT N NEXT L CMD(0,1)=SGN(NEURONS(L,0)*AI(0,L,0)*2) CMD(1,1)=SGN(NEURONS(L,1)*AI(0,L,1)*2) IF CMD(0,1)<0 THEN CMD(0,1)=0 IF CMD(1,1)<0 THEN CMD(1,1)=0 'TRACE " ",CMD(0,0),CMD(1,0) END SUB SUB MUTATE 'ADD A RANDOM VALUE BETWEEN -0.1 AND 0.1 TO THE FACTORS OF THE LEADER FOR L=0 TO LAYERS-1 FOR N=0 TO (AI_INDEX(L)+1)*(AI_INDEX(L+1)+1)-1 AI(0,L,N)=AI(2,L,N)+(RND-0.5)*MUTATION_RATE 'TRACE AI(0,L,N) IF ABS( AI(0,L,N) ) >1 THEN AI(0,L,N) = SGN( AI(0,L,N) ) END IF NUMBER L*5,N+9,AI(0,L,N)*10000,4 'TRACE AI(0,L,N) NEXT N NEXT L END SUB SUB BATCH_LEADER FOR L=0 TO LAYERS-1 FOR N=0 TO AI_INDEX(L)*AI_INDEX(L+1) AI(1,L,N)=AI(0,L,N) NEXT N NEXT L END SUB SUB LEADER FOR L=0 TO LAYERS-1 FOR N=0 TO AI_INDEX(L)*AI_INDEX(L+1) AI(2,L,N)=AI(1,L,N) NEXT N NEXT L END SUB #1:MAIN PALETTES 003F2A1500302010003C0C00003F3C00 003F2A15003F2A15003F2A15003F2A15 #2:MAIN CHARACTERS 00000000000000000000000000000000 003C7E7E7E7E3C003C4281818181423C 00000000000000000000000000000000 000031210101023C3C7ECFDFFFFF7E3C 00181818181818183C24242424242424 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 18181818181818182424242424242424 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 18181818181818182424242424242424 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 00000000000000000000000000000000 1818181818181800242424242424243C