Algorytm genetyczny - czy mój pomysł na projekt w ogóle ma sens?

0

Cześć,

Naoglądałem się filmików o implementacjach algorytmu genetycznego w C++ i wpadłem na pewien pomysł, jednak nie wiem czy możliwy do zrealizowania.
Program miałby za zadanie "nauczenie" się co robią poszczególne funkcje matematyczne bez znajomości ich ciała. Na przykład: dajemy takiemu programowi prosty podprogram (już skompilowany), który wykonuje jakąś funkcję matematyczną (np. dodawanie, czy pierwiastkowanie, w późniejszych fazach równanie kwadratowe itd.).
Mój program miałby za zadanie nauczyć się co dana funkcja robi i jak wygląda jej ciało, następnie wyświetlić jej wzór.
Funkcja fitness() opierałaby się na sprawdzaniu wyniku tego podprogramu dla jakichś losowych danych. Dajmy na to że podprogram realizowałby dodawanie dwóch zmiennych. Mój program generowałby sobie jakiś losowy wzór i testował jego wyniki porównując z wynikami tego podprogramu - czym bliższy wynik, tym większy współczynnik fitness().
Czy to ma sens? Opłaca się coś takiego robić, czy raczej napotkam jakiś 'nierozwiązywalny' problem, którego teraz nie dostrzegam?

Pozdrawiam

0

Z moich doświadczeń:
Algorytmy genetyczne jako rodzaj heurystyki są idealne do rozwiązywania problemów optymalizacyjnych. Generalnie ich działanie to czysta losowość: generujesz n rozwiązań i dobierasz najlepsze.

Słowo "nauczyć" być może zostało błędnie użyte, ale...
W machine learningu algorytmy genetyczne zazwyczaj używane są jako "pomoc" do rozwiązania danego problemu, natomiast same GA chyba nie (ale mogę się mylić).
Z kolei do "uczenia" idealnie nadają się narzędzia do Data Miningu: sieci neuronowe, drzewa decyzyjne (które mogą być też tworzone przy użyciu algorytmów genetycznych).

Koniec dywagacji, do rzeczy:

To co ja tutaj widzę: można stworzyć algorytm genetyczny, którego wynikiem będzie wielomian (a raczej wektor/wektory współczynników dla danych argumentów). Po analizie danego podprogramu będzie mógł wypluć takie wektory - de facto nie dostaniesz precyzyjnie funckji, ale raczej jej interpolację w postaci wielomianu.

0

czy raczej napotkam jakiś 'nierozwiązywalny' problem, którego teraz nie dostrzegam?

Moim skromnym zdaniem, to już napotkałeś :) Więc nawet lepiej nie zaczynaj!

A tak bardziej serio, to nie jest takie proste. Nie znam się na ML, ale algorytmy genetyczne raczej nijak się mają do twojego problemu.

0

Nie potrzeba do tego algorytmu genetycznego nawet. Kiedyś zrobiłem interpolację wielomianem ręcznie za pomocą Excela (robiłem taką grę geograficzną w której użyłem mapy z wikipedii, jednak mapa ta miała nieznane mi odwzorowanie i nie mogłem przeliczyć w prosty sposób pozycji w pikselach na szerokość i długość geograficzną - więc wyczytałem o interpolacji wielomianami, otwarłem arkusz i zacząłem ręcznie wpisywać do tabelki, aż w końcu na końcu miałem konkretny wzór, który przekleiłem do kodu).

Rezultalt był całkiem okej - najeżdżałem myszą w jakieś miejsce i mi wykrywał dość dokładnie pozycję geograficzną (szerokość, długość) pod którą leży kursor. Mając pozycję geograficzną sprawdzałem pozycję na liście miast Europy i sprawdzałem odległość od miasta (założenia były takie, że pojawiały się nazwy miast na ekranie i gracz musiał kliknąć jak najbliżej tego miasta, żeby mieć jak najwięcej punktów)

0

Ok, dzięki za odpowiedzi ;D. Poczytam o interpolacji wielomianowej.
Takie małe doprecyzowanie: "generacją" nazywałbym tam losowe wzory złożone z ilości zmiennych, którą pobiera dana funkcja. Na przykład:
a + b - a + a
a * b^a
b - sqrt(a)
itd.
Każdy z elementów (łącznie z operatorami) byłby "genem". Wśród tej puli wybierane byłyby wzory, których wyniki są najbardziej zbliżone do wyników badanej funkcji. No i oczywiście z każdą generacją wchodziłaby w grę mutacja najlepszych z wzorów.
Więc coś na wzór dosłownego łamania wzorów funkcji bruteforcem, tylko z wykorzystaniem algorytmu genetycznego żeby przyspieszyć ten proces.

1

Nie! ;)
Zrób tak: x1, x2... argumenty, k1, k2... wspolczynniki (to one będą genami).
I teraz to bedzie wygladalo tak:

G = k11*x10 + k12*x11 + .... (skonczylismy z x1) + k21*x20 + k22*x21 + k23*x23....

Czyli można potraktować wektor jako [k11 , k12 , ... k21 , k22 , ... knm] gdzie n=ilosc argumentow, m=czułość, maksymalna potęga wielomianu. Ostatecznie dostaniesz jakieś tam przybliżenie, ale na pewno nie konkretny wzór typu "Tu masz Pan sin(2x)/4 + b4/3".

0

Od kiedy dodawanie jest "funkcją matematyczną"? Proponuję najpierw ogarnąć podstawy matematyki.

Ogólnie algorytmy genetyczne są użyteczne w sytuacjach, gdy funkcja kosztu nie jest wzięta żywcem z matematyki, a bardziej "życiowa" (NP-trudna) i turdno przedstawialna w postaci wielomianu. Do problemu, który proponujesz użyteczniejsza będzie regresja liniowa.

Ogólnie: w informatyce dobiera się rozwiązanie do problemu, a nie próbuje na siłę dostosować problem do wymyślonego rozwiązania.

0

Ok, teraz wiem o co chodzi i że moje podejście rzeczywiście było bez sensu. Dzięki Wam uniknąłem zmarnowania kilku godzin na napisanie takiego czegoś ;D Pokazaliście mi za to kierunek w którym powinienem podążać.
Rzeczywiście, określenie dodawania jako "funkcji matematycznej" jest błędne. W C++ operator można sobie przeładować, co może sugerować że jest on funkcją, stąd mój błędny wniosek, że można go też nazwać funkcją matematyczną ;)

0

Tylko, że tak w ogóle to ten problem nie jest bezsensowny. Złe były tylko Twoje założenia odnośnie tego co chcesz uzyskać (uczyc się, jaka to funkcja i ją ściśle identyfikować).

Przykład: mamy taki "blackbox", który karmimy różnymi danymi i otrzymujemy jakieś wyniki. I koniecznie chcesz wiedzieć jak on działa. Takim algorytmem genetycznym możesz uzyskać sensowną (ale oczywiście przybiżoną) reprezentację jego funkcji w postaci wielomianu. Chociaż tutaj równie dobrze można użyć prostej sieci neuronowej (MLP).

Do czego zmierzam - w przetwarzaniu sygnałów, automatyce itp. jest taka działka zwana identyfikacją systemów. I tak naprawdę tutaj coś takiego się robi - bada zależności między wejściem, a wyjściem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1