» »

Odkrivanje matematičnih funkcij z evolucijo

Odkrivanje matematičnih funkcij z evolucijo

Phil ::

Zadnje čase se igram z iskanjem funkcij z uporabo evolucije.
Računalniku vneseš vhodne člene in pričakovane izhodne člene in računalnik poskuša najti formulo ki poveže vhode in izhode.

Programu recimo podaš tile dve tabeli števil [1,2,3,4,5] za vhode in [2,6,12,20,30] za izhode in program ugotovi funkcijo f(a)=1+(a)*(a)...

Primer formule za racunanje praštevil do 15 praštevila (lahko do poljubnega, samo se cas iskanja eksponentno veča).
f(a)=1-a+17/a*(-5)%a*(-2)*(4)-(18)%a+(-8)*(-2)/a-(-25)-a*a/(-20)*3-a-a*a+11/(-25)+a+1
, kjer se racuna od leve proti desni (prednosti *,/,% se NE upošteva) in vsem rezultatom odreže decimalke.
f(1)=2,f(2)=3,f(3)=5,f(4)=7.....

Drugi primer je izračun fibonačijevaga zaporedja do 10 števila
f(a)=1-(a)*(a)*(a)/(13)*(a)/(5)-(23)*(a)-(7)/(-29)

Se iskanje funkcij na tak način izplača? Je mogoče odkriti ali poenostaviti kaj pametnega? S tem mislim kakšno splošno funkcijo, ki ni povsem enostavna kot prvi primer.
Katere operacije se še splača vključiti (sedaj so +,-,*,/,%)?
Se je že kdo ukvarjal s podobno stvarjo?
LP
  • spremenil: Phil ()

snow ::

Nekaj malega sem bral o genetskem programiranju (GP), ampak resno se še nisem lotil tega...

Lepo da si to skupaj napravil, ni kaj! Pohvale.
Kolikor sem crittical testiral je že nekaj znal takega... samo ne tako kompleksnega. Baje sedaj tudi zna polinoma in podobne reči... sam čakamo :)

Sem pa ful podobno zadevo delal na nevronskih mrežah ampak tam ne dobiš ven neke formule ampak le rezultate... recimo če povem par točk polinoma, ti tudi natančno izračuna ostale... ampak le v tistem območju kjer si nevronsko mrežo učil.


Btw.. bi se dalo tale source dobit?
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Phil ::

No vsaj eden je pokomentiral :). Zadevo sem zdaj izboljšal tako da lahko generira funkcije z večimi vhodnimi spremenljivkami recimo f(a,b...)=x. Mu daš par tabel podatkov pa ti poišče relacijo med njimi. Sourca zaenkrat še ne dam. Bom prej zadevo izboljšaval, dokler bo volja. Programček pa lahko dam na net, samo moram prej odpraviti še vse buge.
Crittical seveda zna delati povsem isto, pri svojem programčku upam le na večjo hitrost, ker je zadeva povsem specializirana za funkcije. Mi pa tudi vrne c++ kodo za funkcijo (praštevila):
vsota=1
vsota-=a;
vsota+=17;
vsota/=a;
vsota*=-5;
vsota%=a;
vsota*=-2;
vsota*=4;
vsota-=18;
vsota%=a;
vsota+=-8;
vsota*=-2;
vsota/=a;
vsota-=-25;
vsota-=a;
vsota*=a;
vsota/=-20;
vsota*=3;
vsota-=a;
vsota-=a;
vsota*=a;
vsota+=11;
vsota/=-25;
vsota+=a;
vsota+=1;

LP

Zgodovina sprememb…

  • spremenil: Phil ()

Thomas ::

Keep doing a good work! :)
Man muss immer generalisieren - Carl Jacobi

Gandalfar ::

Tole si ze kaj pogledal?

snow ::

Ja lepa zadeva ni kaj, zato pa sem pokomentiral.

Kako maš poštiman genom? Zaporedno zapisane funkcije? Ali delaš drevesno strukturo?
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Phil ::

Gandalfar: sem si zdaj pogledal. Očitno se s tem ukvarjajo že precej časa. Je dandanes že težko biti izviren pri simuliranju stvari :D
snow: funkcije imam zapisane zaporedno v tabeli linearnih seznamov. Nasploh je program presenetljivo enostaven.
LP

Thomas ::

To je v bistvu vse kar rabimo. Aja, pa še dovolj CPUja, pa premaknemo Svet s tečajev. Vprašanje je samo kdaj in kdo in s kakšnimi malimi tajnami bo sprožil kamen, ki bo sprožil plaz. Salutant! :)
Man muss immer generalisieren - Carl Jacobi

snow ::

Daj mi tole probaj:

Train Data:
inputs: 0 outputs: 2
inputs: 1 outputs: 6
inputs: 2 outputs: 12
inputs: 3 outputs: 20
inputs: 4 outputs: 30
inputs: 5 outputs: 42
inputs: 6 outputs: 56
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Thomas ::

n(n+1)

t. i. promična števila
Man muss immer generalisieren - Carl Jacobi

snow ::

No nekaj podobnega res pride(+1 še vsakemu n-ju) ... pa cmana sem hotel. :)
Random mutation plus nonrandom cumulative natural selection - Richard Dawkins

Zgodovina sprememb…

  • spremenilo: snow ()

Phil ::

Bom do jutri preizkusil. Program bom dal na net konec tedna. Zdaj ko sem v LJ zal nimam dostopa do interneta, razen na faksu.
LP

Phil ::

Tole je nasel f(A)=1+A*A+2+A+A v trenutku :)
LP

Phil ::

Evo končno sem popravil vse buge (vsaj upam).
Zadeva še zdaleč ne deluje optimalno saj za zahtevnejše funkcije IMO porabi preveč časa. Tudi prerado se zgodi da evolucija krene napačno pot pa se iskalni čas podvajseteri.
Bi bilo najbrž najbolje poganjati več instanc programa.
Če ima kdo kakšne ideje kako bi se izognil taki situaciji se priporočam.
Podatke se vnese v datoteko in.c. Za snowov primer datoteka zgleda takole

6 // šest podatkov
1 // en argument
[0,1,2,3,4,5,6] // vhodna tabela
[2,6,12,20,30,42,56] // rezultati

rezultat: f(a)=a+(3)*a+(2)

Primer datoteke z več argumenti je
5 // pet podatkov
3 // trije arguemnti
[1,2,3,4,5] // vhodi a
[3,6,1,9,10] // vhodi b
[11,12,15,20,4] // vhodi c
[125,158,231,440,71] // izhodi

rezultat: f(a,b,c)=c*c+a+c/a+b*a-c
Funkcija je tukaj http://www.geocities.com/cman2so/fundis.... Linkanje očitno ne dela.
Predlogi, komentarji, vprašanja?
LP

Thomas ::

Tkole dela to Critticall. Smo mu za štos nasuli praštevila od 2-29 za input in izpljunil je (eno možno) funkcijo v spodnjem delu ekrana. Jasno, enostavne funkcije lažje najde. Bil je pa to dober test. cmanu gre reči - hvala! :)
Man muss immer generalisieren - Carl Jacobi


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C#] do - while

Oddelek: Programiranje
81333 (1055) garamond
»

c napaka .c:4:1: error: expected identifier or '(' before '{' token

Oddelek: Programiranje
141932 (1505) MrStein
»

Matematika - pomoč (strani: 1 2 3 )

Oddelek: Šola
10426835 (23410) daisy22
»

[c] char zadeva

Oddelek: Programiranje
222251 (2049) TheCyborg
»

Generatorji praštevil

Oddelek: Znanost in tehnologija
473835 (2739) Phil

Več podobnih tem