# Notatki projektowe SI
## CO ROBIMY?
SEKS Z PEDAŁAMI
SEKS Z PEDAŁAMI
PCHANIE OBCIAGANIE DOTYKANIE SIE CHUJAMI
aka NA REALIZACJE CZEGO SIE DECYDUJEMY
## FOLDER PROJEKTOWY
https://drive.google.com/drive/folders/1mYw5U3aB7FD6v0T2FWL2Sgd321mAYzT6?usp=sharing
## RZECZY WYCIAGNIETE Z INZYNIEREK
WYKAZ WAŻNIEJSZYCH OZNACZEŃ I SKRÓTÓW
GUI — Graphical User Interface
API — Application Programming Interface
LCM — Local Centre of Mass
GCM — Global Centre of Mass
FV — Fitness Value
### TECHNOLOGIE
- Tensorflow
- kurs z MIT z tensorflowa myśle że wypada sobie ogarnąć bo jest bardzo spoko prowadzony imo
- https://www.youtube.com/watch?v=5tvmMX8r_OM&list=PLtBw6njQRU-rwp5__7C0oIVt26ZgjG9NI
- TensorBoard
### Pojęcie "zaganiania" owiec.
> Zaganianie w ogólności można zdefiniować jako doprowadzenie do jak największego sku-
> pienia agentów biernych przez agenty aktywne. Skupienie, czyli jak najmniejsze rozproszenie jest
>
> sumą kwadratów odległości agentów biernych od ich środka ciężkości. Wyraża się je następująco:

Tutaj rozporszenie agentów jest liczone jako suma kwadratów odległości hordy owiec od ich środka ciężkośći, ale imo tutaj na luzie można to sobie zmienić i zamiast *Sx*, *Sy* możemy dać własną współrzędną miejsca, do którego te owce mają być zagonione.
Myśle że na luzie możemy założyć, że **wszystkie współrzędne to współrzędne dodatnie**, będzie pewnie łatwiej się połapać i można łatwo w Pythonie rysować sobie wykresy punktowe zanim stworzymy jakieś GUI (a w zasadzie to taki wykres punktowy nawet na projetk może być wystarczający ale dla beki możemy dojebać coś ładniejszego to sie da jako portfolio na gicie B-) )
> W naszej pracy przyjęliśmy następujące założenia:
> • wybranym rodzajem zaganiania jest skupianie,
> • agenty bierne nie skupiają się samoistnie, na ich ruch ma wpływ jedynie bliskość agenta
> aktywnego,
> • agenty bierne mają postać dyskretną,
> • liczba agentów biernych i aktywnych jest stała dla symulacji.
### Logika poruszania sie owiec - agentów pasywnych:
> Prosta logika jest oparta na logice agentów pasywnych opisanej w (ksiazka). Ruch agenta pasywnego stosującego tę logikę jest zależny wyłącznie od działań agentów aktywnych. Cała logika składa się z dwóch reguł, opisanych poniżej:
> • Agent pasywny jest nieruchomy, jeżeli żaden z agentów aktywnych nie znajduje się bliżej
> niż wynosi wartość stałej Ra.
> • Agent pasywny porusza się jeżeli przynajmniej jeden z agentów aktywnych znajduje się
> w odległości mniejszej niż Ra (oddziałuje na agenta pasywnego).
> Wektorem ruchu agenta pasywnego jest wtedy:
> 
Ten wektor ruchu to zsumowane wektory od wszystkich psów do owcy, podzielone przez sumę ich długości (modułów, norm). Wektory sie łatwo dodaje, normy prawdopodobnie też numPy liczy z palca.
Jest też logika złożona dla owiec, ale żeby na razie uprościć projekt pominę ją, być może w tym wypadku nam sie za bardzo nie przyda.
### Logika psów - agentów aktywnych:
***Wersor** to wektor o długości jeden, wskazujący kierunek i zwrot pewnego wektora początkowego, któremu ten wersor przypisujemy. Mnożenie wersora przez długość początkowego wektora odtwarza początkowy wektor. Wersor – wektor jednostkowy (także unormowany).*
> Agent postrzega stan symulacji względem własnego układu współrzędnych, którego początek jest tożsamy z pozycją agenta, zaś oś Y jest skierowana do GCM. Elementy postrzegane to:
>
> • pozycje agentów pasywnych: P0, P1, ..., Pn,
> • pozycje pozostałych agentów aktywnych: A0, A1, ..., Am,
> • punkt środka ciężkości stada GCM.
>
> Pozycje elementów postrzeganych są „normalizowane”, czyli przenoszone do układu współrzędnych bieżącego agenta Ai.
> Na normalizację pozycji składają się dwie operacje:
>
> • translacja - z globalnego układu współrzędnych, mającego początek w punkcie (0, 0), do
> układu współrzędnych agenta, zaczynającego się w punkcie (xAi, yAi),
> • rotacja - obrót punktów uzyskanych po wykonaniu translacji, wokół początku nowego układu
> współrzędnych, o kąt skierowany φ między wersorem Yˆ' , który wyznacza kierunek od punktu Ai do GCM, a wersorem Yˆ wyznaczającym kierunek osi Y globalnego układu współrzędnych.
>
> Operację przeniesienia punktu do układu współrzędnych agenta aktywnego („normalizacji”) można wyrazić następującym wzorem:
> 
### Sieć neuronowa
Psy - agenty aktywne sterewane są jedną siecią neuronową.
**Struktura sieci:**
> • 2(p+a) neuronów w warstwie wejściowej, gdzie p i a to odpowiednio liczba agentów pasywnych i aktywnych,
>
> • warstwy ukryte, o zróżnicowanej liczbie neuronów,
> • 2 neurony w warstwie wyjściowej.
>
> Połączenia między sąsiednimi warstwami sieci tworzą pełny graf dwudzielny. Brak jest połączeń rekurencyjnych, czy też sięgających innych warstw niż sąsiednie. W eksperymentach wykorzystaliśmy dwie sieci o różnej głębokości i rozmiarach warstw ukrytych.
>
> • sieć płytką o jednej warstwie ukrytej, składającej się z 30 neuronów. Bardzo podobnej do tej,która została wykorzystana w [ksiazka],
> • sieć głęboką o 3 warstwach ukrytych, zawierających kolejno: 24, 12 i 6 neuronów.

Na wektor wyjściowy składają się dwie wartości określające przemieszczenie agenta w osi X oraz Y, względem własnego układu współrzędnych. Wektor
przemieszczenia zostaje przeniesiony do globalnego układu współrzędnych przed zaaplikowaniem go do pozycji bieżącego agenta aktywnego.
Sięć zwraca wektor o jaki ma się przemieścić dany pies - agent aktywny.
### Problemy
> Niedziałające uczenie sieci neuronowej
> 

>
## POMYSŁY
## Wziete z inzynierki
**Dobra tu mój pomysł bo jak czytam tą inżynierke to tam napierdolone jest algorytmów genetycznych ale to może sie okazać niepotrzebne:**
**Pomysł 1.** - sieć pracuje osobno dla każdego zaganiacza:
Sieć neuronową można by trenować "klasycznie" bez udziwnień, np tak:
- sieć dostaje wektor ze współrzędnymi n-1 psów (sieć liczy wektor przemieszczenia dla jednego psa)
- sieć przelicza sb wszystko i wyrzuca wektor przemieszczenia dla tego psa
- tak w zasadzie to nie ma żadnego ograniczenia co do długości tego wektora, więc imo przydałoby się przyjąć skończoną długość tych wektorów - normalizować je jakoś żeby Pies przesuwał się co krok o z góry znaną odległość
- sprawdzamy jak zmieni się środek ciężkośći owiec, i w zależnośći czy zbliżamy się do tego wyznaczonego liczmy funkcje straty i optymalizujemy sieć (są gotowe optmizery w tensorflow to to prawdopodobnie będzie całkiem proste)
- powtarzamy to pare razy dla jednego psa i przechodzimy do następnego
Taka sieć powinna dla każdego psa zwracać kierunek, w którą stronę powinien się przesunąć, żeby minimalizować rozproszenie owiec. W związku z tym każde przesunięcie psa powinno nawet w najmniejszy sposób wpływać na położenie owiec.
**Pomysł 2.** - sieć neuronowa zwraca wektor przemieszczeń dla każdego psa od razu.
- sieć otrzymuje na wejście wektor położenia psów i owiec
- np. [Pies1X,Pies1Y,Pies2X,Pies2Y....,Owca1X,Owca1Y]
- w inżynierce wrzucają tam położenie środka masy ale nie wiem czy jest to w zasadzie aż tak potrzebne bo tutaj optimizer bedzie sobie bral to pozniej pod uwage
- sieć zwraca wektor przemieszczeń dla psów
- aplikujemy przemieszczenia na psach i sprawdzamy jak zmienił się "rzeczywisty" środek ciężkości owiec w stosunku do tego który chcemy otrzymac, innymi słowy sprawdzamy czy rozproszenie owiec się zmniejsza
- optimizer zmienia sobie wagi minimalizując rozproszenie owiec
- tu w zasadzie jest miejsce na uczenie ze wzmocnieniem bo nie mamy jako tako najlepszego wektora do porównania ale w zależności od nowego rozproszenia owiec możnaby jakąś nagrodę wyznaczać
## Reinforcement learning - bo tą inżynierke można o kant dupy obić
Link do wykładu o RL z MIT:
- https://www.youtube.com/watch?v=93M1l_nrhpQ&list=PLtBw6njQRU-rwp5__7C0oIVt26ZgjG9NI&index=5
Link do laby RL z MIT z której bede podpierdalał koncept:
- https://colab.research.google.com/github/aamini/introtodeeplearning/blob/master/lab3/solutions/RL_Solution.ipynb#scrollTo=pPfHME8aRKkb
Tak jak w pomyśle 2. wyżej, model powinien dostosowywać się do zmieniającego się środowiska, algorytmy użyte w tej inżynierce z zaganianiem owiec mogą być całkiem trudne do zaimplementowania i testowania, natomiast podejście do tego problemu od strony uczenia ze wzmocnieniem może przynieść lepsze rezultaty.
- Żeby uprościć srodowisko i szybciej przeprowadzać testy myśle że można by potraktować srodowisko jako taką "plansze" jak do szachów czy warcabów, żeby agenty mogły przemieszczać się tylko na sąsiednie "pola" - tak jak w projekcie z PO w 2. semie.
- Wtedy całe środowisko można by przedstawić jako macierz MxM pól, co w sumie znacznie ułatwia rysowanie środowiska
- **Można najpierw wytrenować jednego psa żeby zaganiał owce, to już byłby jakiś sukces.**
- Po zrobieniu jednego psa mielibyśmy ogarnięty koncept tworzenia tych modeli i uczenia ich i łatwiej byłoby rozszerzyć w dalszym etapie
## Projekt projektu
### Struktura klas
#### Agenty
- **SheepController class**
- Sheep[] sheeps
- calculate_current_mass_centre()
- update_sheep()
- for sheep in sheeps: sheep.update()
- **Sheep class**
- trigger_distance
- calculate_distance(shepard)
- calculate_movement_vector(shepards)
- position
- update()
- position += calculate_movement_vector()
- **ShepardController class**
- Shepard[] shepards
- update_shepards(action_vector)
- for i in range(0,len(action_vector)):
- shepard.update(action_vector[i])
- **Shepard class**
- position
- update(new_movement_vector):
- self.position += new_movement_vector
- **Tu bedzie jeszcze pare rzeczy co do modelu co będzie przewidywał ruch psa/psów**
#### Swiat
- **Environment/World class**
- worldMatrix
- ViewController view
#### GUI
- **ViewController**
- show(matrix)
### Projekt sieci neuronowej
#### Wersja 1 - Jeden pies, wiele owiec, poruszanie się po planszy NxN w 8 kierunkach.
##### Wejście
Pies widzi siebie, centrum "masy" owiec i położenie każdej owcy
- [pies.x, pies.y, GCM.x, GCM.y, owca1.x, owca1.y, owca2.x ... , owcaN.x, owcaN.y]
##### Wyjście
Na wyjście model powinien wypluwać wektor przemieszczenia
- [x,y]
Albo może też wypluwać wektor prawdopodbieństw, w którym kierunku pies powinien zrobić krok
- [lewo,prawo,góra,dół,lewo-dół,lewo-góra, prawo-dół, prawo-góra]
- [0.9,0.3,0.4,0.1,0.4,0,0,0] - taki wektor np. znaczy że najprawdopodobniej trzeba iśc w lewo
## WCZESNIEJSZE RZECZY
### Co typiarz nam powiedział:
- porównać qlearnig do jakiejś gry
- porownac qlearning do jakichś reguł prostych głupich
- strategie przeszukiwania vs bot co uczy się jakiejś gry
- q learning albo inne podejscia do qlearningu
- jakieś psy biegają zaganiają owce
- 1. swiat moglby byc opisany za pomoca regul ktore nim rzadza
- 2. z interakcji agenta ze swiatem generujemy obrazy uczace, jestesmy w jakims stanie i on wykonuje akcje, to beda nasze dane do treningu, tabele przejsc, prawdopodobienstwa, siec neuronowa uczenie za pomoca tych danych
- agent powinien sie uczyc w trakcie wykonywanych prob
- minimalizowanie straty polegajacej na zginieciu
- opisac jakies gowno
- na przyklad minesweepera sapera w windowsie zrobic bota do niego ale to wsm malo ciekawe jest krwa wtf co on ma sie ucyzc gdzie bomba jest pojebalo go
- nie no wsm calkiem okej
- mamy nadzieje ze jak wytrenujemy sapera to on bedzie umial zawsze se grac w sapera
- alternatywna propozycja to pomyslec o czyms jak saper
- zaganianie - wilki i owce / psy i owce
- policjanci i zlodzieje
- psy wspolpracujac maja za zadanie zagonic owce do zagrody
- owce spierdalaja a psy tam biegaja se i zaganiaja
- owce maja wlasne reguly wpisane a pieski maja wspolpracowac i zaganiac owce
### Research do zrobienia:
- Reinforcement learning
- Qlearning
- Reinforcement learning w Unity
## Pomysły:
- bot przechodzi labirynt ucząc się od zera
- do przepytania typa: bot uczy sie chodzić i biegac po jakimś torze przeszkód
- uczenie psa chodzić i sikać xd
### Linki
- **https://docs.github.com/en/github/managing-your-work-on-github/about-project-boards**
- moze to bysmy se zrobili???
- https://www.youtube.com/watch?v=bMWPRpBQAMA (uczenie chodziarstwa)
- https://towardsdatascience.com/maze-rl-d035f9ccdc63 Tu ktoś zrobił maze solver
- 
- 
- 
- CO TO QTABLES WARTO SIE DOWIEDZIEC
- 
- https://www.samyzaf.com/ML/rl/qmaze.html do przeczytania o labiryntach wsm długie ale chyba spoko
- https://medium.com/analytics-vidhya/introduction-to-reinforcement-learning-q-learning-by-maze-solving-example-c34039019317 tu jeszcze coś
### Wiki
- https://en.wikipedia.org/wiki/Q-learning
- https://en.wikipedia.org/wiki/Maze_solving_algorithm