Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cmath>
- #include <iostream>
- #define pi 3.14159265
- #define N 160 // liczba neuronow
- #define alpha 0.5 // wspolczynnik uczenia
- #define numberOfTrainings 10000 // ile razy trenowana jest siec - w excelu są podane różne wartości dla porównania
- using namespace std;
- // funkcja, ktora opisane jest wahadlo matematyczne: f(t)=2cos(2t + pi/2)
- double f(double t){
- return 2*cos(2*t + pi/2);
- }
- // funkcja aktywacji +1/-1 - w przypadku uczenia się daje 1 rozwiązaniom blisko ( <= 1),
- // natomiast rozwiązania dalekie dostają wartość -1
- double bipolar(double x){
- if (x > 1) return 1;
- return -1;
- }
- // uczenie sieci zgodnie z zasada Hebba
- void train(double *w, double *y, double *out){
- // pętla ucząca przechodzi tyle razy, ile ustawimy w liczbie treningów
- for(int j=0; j<numberOfTrainings; j++){
- // aktualizujemy wagę dla każdego ze 160 neuronów
- for(int i=0; i<N; i++)
- // wzór hebba - do wagi dodajemy wyjście neuronu out(+1/-1), wyjście oryginalnej funkcji
- // i to wszystko mnożymy przez współczynnik uczenia alfa (przyjęty 0.5)
- w[i] = w[i] + alpha * y[i] * out[i];
- cout << "Network trained " << j << " times." << endl;
- }
- }
- int main(int, char const**)
- {
- // wejscie osi OX - wartosci od 0 do pi/2 co 1/100 - wychodzi 1.60, czyli podobnie do wartości pi/2, który określa
- // ruch wahadła w jedną stronę
- double xG[N];
- // wejscie osi OY - wyliczane na podstawie funkcji f(x)
- double yG[N];
- // Wartosc funkcji aktywacji - dla dobrych wartości przyjmuje +1
- double out[N];
- // Wektor wag
- double w[N];
- // Obliczanie wartosci funkcji i przypisywanie wartosci z funkcji aktywacji
- for(double i=0; i<N; i+=1){
- xG[(int)i] = (double)(i/100); // oś X
- yG[(int)i] = f(xG[(int)i]); // oś Y
- out[(int)i] = bipolar((yG[(int)i] - w[(int)i])); //wartość liczona z funkcji przystosowania
- }
- // Tworzenie randomowych wag w[i]
- for(int i=0; i<N; i++){
- w[i] = (rand() % 100);
- w[i] /= 100;
- if (rand() % 100 >= 50)
- w[i] = -w[i];
- }
- //wchodzenie w funkcję trenującą
- train(w, yG, out);
- //dopasowywanie wag do liczby treningów - im więcej treningów, tym większe wartości przyjmują wagi
- for(int i=0; i<N; i++){
- w[i] = (w[i]*2/numberOfTrainings);
- }
- // wypisuje nauczone wagi
- for(int i=0; i<N; i++){
- cout << w[i] << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement