radekmie/h3mapgen

Testowanie fairness MultiLML

acatai opened this issue · 1 comments

Więc do napisania są dwie rzeczy. Pierwsza (CheckFairness), najważniejsza, to dla podanego grafu dla wielu graczy napisać funkcję sprawdzającą czy jest on fair i symetryczny z punktu widzenia każdego z graczy. Druga (MultiplyLML) to generowanie takich grafów wiedząc jak wygląda pojedynczy wierzchołek i wychodzące z niej krawędzie (tzn. strefa single dla jednego gracza).

Jako, że zawartość components/mlml idzie do przepisania, proponuję sobie spokojnie pisać np. w tests/mlml.

Przykład grafu który oczywiście nie jest fair i nawet nie ma sensu, ale będzie nam służył do wizualizacji struktur.

mlml_example

Funkcja MultiplyLML powinna brać dwie rzeczy: informację o wierzchołku oraz liczbę graczy. Informację o wierzchołku proponuję zakodować po prostu jako tablicę krawędzi, gdzie każda krawędź to tablica zawierająca id strefy łączącej, typ strefy oraz jej poziom. Ostatnie dwa parametry wynikają z pierwszego ale wygodniej będzie (przynajmniej w danych wejściowych) mieć je podane explicite.
Tak więc kodowanie wierzchołków P1/P3 wygląda w takim formacie następująco:

{ {11, 'BUFFER', 5}, {12, 'LOCAL', 2}, {13, 'LOCAL', 3} }

Dla tak zadanego wierzchołka (+ liczby graczy) funkcja zwraca zmultiplikowany graf. Jeśli ma Pan dobry pomysł na format może Pan użyć swojego, ja bym proponował mapę z id graczy (1 do n) w listę połączeń rozumianą jako trójkę (eid1, eid2, pid2), gdzie eid1 to id krawędzi wychodzącej z wierzchołka, zaś eid2 to id krawędzi wchodzącej do wierzchołka pid2. Dla grafu na obrazku wyglądałoby to tak:

{
   { {11,11,2}, {12, 13, 3}, {13, 12, 3} }, -- P1
   { {11,11,1}, {12,11,3} },                -- P2
   { {11,12,2}, {13,12,1}, {12,13,1} }      -- P3
}

Funkcja CheckFairness powinna brać już zmultiplikowany graf (taki jak na rysunku, w wybranym formacie) i zwracać true/false w zależności czy jest fair.

Ogólnie nie wiem czy będzie pomocne ale fragment ogólnej procedury której te funkcje są częścią został kiedyś spisany w docu na stronie 7.

Wracając jeszcze do generowania, wykluczamy łączenie dwóch krawędzi które nie są LOCAL i mają inny typ lub inny poziom. (czyli dopuszczamy łączenie non-locali tylko jeśli mają ten sam poziom i ten sam typ: BUFFER, TELEPORT, itd)

Mam nadzieję, że opisałem w miarę jasno - jak coś to proszę pytać i doszczegóławiać.

Tak mi się przypomniało Proponuję skorzystać z lib/GraphvizDrawer i sobie te grafy rysować.
Jak będzie Pan po wstępnych pracach, a nie zna graphviza, to może mi dać znać - zakoduję funkcje rysujące te struktury.