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.
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.