Algorytm Min-Max a użycie pamięci

0

Piszę algorytm Min-Max do gry Skoczki. Liczba graczy: 2, 3, 4. Podczas analizy ruchów potrzeba:

  1. funkcji oceniającej
  2. funkcji, która znajdzie wszystkie możliwe ruchy
  3. roboczej planszy, gdzie będą zapisywane kolejne posunięcia
  4. struktur danych do drzew
  5. funkcji, która zwróci następnego gracza i listy graczy *players[4]

Mam dużą klasę Game (warstwę logiki), a węzły drzewa ruchów przechowam w klasie MinMax.

Funkcję znajdującą możliwe ruchy (2) mam w klasie Game, ponieważ przydaje się ona także do podpowiadania ruchów człowiekowi. Będzie wywoływana dla każdego węzła w drzewie i - uwaga - szukać możliwe ruchy na planszy roboczej! Pozostaje skopiować metodę do klasy MinMax (można do tej samej pętli wrzucić ocenę ruchu) albo uczynić klasę Game bazową dla MinMax.

Kolejna rzecz - plansza robocza - gdyby każdy wierzchołek drzewa miał osobną tablicę int[10][10], policzmy:

64 bity * 100 pól * 28 dozwolonych ruchów (4 graczy * 1 poziom zagłębienia) = 800 KB * 28618271 = 472 MB

Na to nie można pozwolić. Przecież programy szachowe analizują dla poziomu zagłębienia 10 i więcej, a tam dozwolonych ruchów jest pełno.

Więcej mogą zająć struktury danych niż sama plansza int[10][10]. 28 dozwolonych ruchów dla pozycji startowej przy 15 pionkach. Chcę zoptymalizować czas procesora i użycie pamięci, bo w przypadku MinMax wszystko musi wykonać się jak najszybciej i bez dużego obciążenia. Zapytacie, dlaczego int, a nie char. Procesor szybciej poradzi sobie z typem int (takim, jaka jest wielkość rejestrów).

Załóżmy, że potężna klasa Game jest bazową dla MinMax. Ma bardzo dużo metod, ale mało własności - tablicę int[10][10], listę wskaźników graczy players[4], wskaźnik na aktualnego gracza, stan gry i może coś jeszcze dojdzie. Czy podczas kopiowania obiektu wykonują się osobne kopie metod w pamięci komputera, czy tylko własności? Czy bez konstruktora kopiującego wszystko skopiuje się dokładnie tak jak w oryginale? Na pewno wywołanie samych konstruktorów jest czasochłonne.

Jeśli mamy: class MinMax : public Game - co zrobić, aby po utworzeniu obiektu MinMax nie wywołał się domyślny instruktor dla Game, lecz kopiujący?

Drugie wyjście to skopiowanie części metod do klasy MinMax i konieczność przekazania wielu danych.

Trzecia - kopiować tylko planszę int[10][10], a wszystkie obliczenia wykonywać w jednej instancji klasy Game. Utworzyć metody z dodatkowym parametrem, które będą liczyć nie na polach klasy Game, lecz na danych podanych poprzez argumenty.

Jak do tego podejść?

0

Obstawiam, że coś tutaj jest źle zaprojektowane, skoro musisz tak kombinować. W każdym razie niebyt jasno opisałeś problem.

Jeśli mamy: class MinMax : public Game - co zrobić, aby po utworzeniu obiektu MinMax nie wywołał się domyślny instruktor dla Game, lecz kopiujący?

Domyślam się, że chodzi o konstruktor kopiujący a nie instruktor - jeżeli chcesz użyć konstruktora kopiującego to musisz go wywołać z odpowiednim parametrem (czyli z obiektem danego typu) w liście inicjalizującej klasy MinMax (jest to w końcu obiekt czy klasa?!).

1 użytkowników online, w tym zalogowanych: 0, gości: 1