---
# System prepended metadata

title: Notatki projektowe SI

---

# 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:
![](https://i.imgur.com/vVAvCTb.png)


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:
> ![](https://i.imgur.com/SVofa4j.png)

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:
> ![](https://i.imgur.com/hmuJ7Ok.png)

### 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.
![](https://i.imgur.com/z8Ev8lc.png)
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
> ![](https://i.imgur.com/e0xAxZo.png)
![](https://i.imgur.com/dq2EdtV.png)

>

## 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
    - ![](https://i.imgur.com/HR4D9j7.png)
    - ![](https://i.imgur.com/TBII06l.png)
    - ![](https://i.imgur.com/rhHh4M4.png)
        - CO TO QTABLES WARTO SIE DOWIEDZIEC
        - ![](https://i.imgur.com/QYHM9aI.png)


- 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