Strona głównaArtykułyMonte Carlo Tree Search

Monte Carlo Tree Search: Przeszukiwanie Drzewa Gry, Którego Nigdy Nie Można Pełne Zbudować

Jak selekcja, rozbudowa, rozgrywki i propagacja wsteczna przekształcają tysiące losowych rozgrywek w silne ruchy, a formuła UCB1 jest całym trikiem.

mysimulator teamZaktualizowano — czerwiec 2026≈ 8 min czytania▶ Otwórz symulację

Wyszukiwanie bez pełnego drzewa

Szachy mają około 10^120 możliwych gier i Go więcej pozycji legalnych niż atomy w obserwowalnym wszechświecie, więc żaden komputer nie może nigdy rozwinąć pełnego drzewa gry dla żadnej z nich. Monte Carlo Tree Search (MCTS) omija ten problem: zamiast wyczerpująco rozszerzać każdy gałąź, buduje się małe, skośne drzewo, które rośnie najszybciej tam, gdzie gra wydaje się mieć znaczenie, kierowane przez losowe symulacje zamiast ręcznie dostrojonej funkcji oceny.

Algorytm powtarza cztery fazy, raz za razem, tak długo, jak możesz sobie pozwolić na myślenie: selekcję, rozbudowę, symulację (zwany również rozegraniem) i propagację wsteczną. Każde powtórzenie to jedno odwiedzenie; po tysiącach wizyt kształt drzewa sam w sobie jest odpowiedzią – dziecko korzenia z największą liczbą wizyt jest zalecanym ruchem, ponieważ liczba wizyt koreluję z ruchem przetrwałym weryfikację, a nie z pojedynczym szczęśliwym rozegraniem.

demo na żywo · powiązana symulacja● LIVE

Selekcja: formuła UCB1

Zaczynając od korzenia, algorytm przechodzi w dół istniejącego drzewa zawsze wybierając dziecko, które maksymalizuje wynik UCB1 (Górny Wąs Konfidencyjny), aż do momentu, gdy osiągnie węzeł nie jeszcze w pełni rozbudowany:

UCB1(węzel) = stopień_zwycięgzenia(węzel) + C * pierwiastek(ln(wizyty_rodzica)/wizyty_węzła) \_____ wykorzystanie ____/ \______ eksploracja ______/ Pierwszy termin nagradza ruchy, które często wygrywały – wykorzystanie. Drugi termin rośnie dla dowolnego dziecka, które zostało odwiedzone rzadko w porównaniu z rodzicem – eksploracja – i rośnie bez ograniczeń, gdy węzeł jest zaniedbywany, gwarantując, że każde dziecko ostatecznie zostanie ponownie odwiedzona nawet po serii nieudanych symulacji. Stała C (pierwiastek dwóch w oryginalnej formule) ustawia równowagę; większa wartość C przeszukuje szerszy obszar, a mniejsza wartość szybcieWIE pogłębia się w obiecujących liniach szybciej.

UCB1(node) = winRate(node) + C * sqrt( ln(parentVisits) / nodeVisits )
             \_____ exploitation ____/   \______ exploration ______/

Rozbudowa, symulacja, propagacja wsteczna

Gdy wybór osiąga węzeł z niezbadanymi ruchami, jeden z nich jest dodawany do drzewa jako nowy podwęzel – rozbudowa. Od tego nowego podwęzła algorytm wykonuje symulację: ruchy wybierane losowo (lub według taniej polityki heurystycznej) aż do stanu terminalnego, zwycięstwa, przegranej lub remisu. Wynik tej jednej losowej gry stanowi jedyną nową informację, jaką w tym kroku wnosi się.

Ten wynik jest następnie propagowany wstecz przez wszystkie węzły odwiedzone podczas opadania – propagacja wsteczna – zwiększając liczbę wizyt i sumę zwycięstw każdego węzła. Pojedyncza symulacja jest prawie bezużytecznym szumem, ale celem UCB1 jest to, że tysiące szumów, ważonych przez ilość uwagi, jaką otrzymał każdy ruch, zbiega się w dystrybucję wizyt, która śledzi prawdziwą wartość każdego ruchu znacznie lepiej niż jakkolwiek pojedyncza symulacja.

function mctsIteration(root):
  node = root
  while node.fullyExpanded and node.children.length > 0:
    node = argmax(node.children, ucb1)          // selection
  if not node.isTerminal:
    node = expand(node)                          // expansion: add one child
  result = randomRollout(node.state)              // simulation
  while node !== null:
    node.visits += 1
    node.wins += result belongs to node's player ? 1 : 0
    node = node.parent                            // backpropagation

Dlaczego losowe rozważania działają

Wygląda na torebkę oceniać pozycję poprzez rozegranie jej z losowymi ruchami, ale losowe rozważania są obiektywnym, choć szumowym, oszacowaniem wartości pozycji, a MCTS potrzebuje jedynie względnego uporządkowania między ruchami braci, a nie dokładnej wartości bezwzględnej. Średnio wystarczającą liczbę niezależnych, szumowych próbek i prawo dużego liczby robi resztę. To właśnie dlatego MCTS uczynił komputer Go konkurencyjnym lata przed pojawieniem się głębokiego uczenia się – rozgałęzienie gry pokonało klasyczny algorytm alfa-beta z ręcznie zbudowaną funkcją oceny, ale drzewo, które adaptacyjnie wydala swoje rozważania tam, gdzie to ma największe znaczenie, nie potrzebowało jednej.

Nowoczesne silniki poprawiają rozważanie poprzez wyuczoną politykę i sieć wartości zamiast losowości – to jest rdzeń idei stojącej za AlphaGo i AlphaZero: sieć neuronowa proponuje, które ruchy warto rozszerzać i szacuje wartość pozycji bezpośrednio, dzięki czemu potrzebnych jest znacznie mniej losowych rozgrywek, a MCTS staje się konstrukcją poszukiwań wokół wyuczonego poczucia zamiast jego substytutu.

Gdzie MCTS błyszczy, a gdzie nie

MCTS potrzebuje w zasadzie niczego poza domeną – jedynie legalne ruchy i sygnał wygranej/przegranej – bez ręcznie tworzonej funkcji oceny, bez heurystyk specyficznych dla danej domeny, aby uzyskać rozsądnego gracza. To właśnie ta ogólność sprawiła, że rozprzestrzenił się on z Go na ogólną rozgrywkę, sztuczną inteligencję w czasie rzeczywistym, rozwiązywanie łamigłówek i nawet problemy nie związane z planowaniem. Ma jednak trudności w grach z bardzo długimi, głęboko taktycznymi sekwencjami, gdzie pojedyncze przypadkowe błędy w rozwijaniu (rollout) źle oceniają całą linię, oraz potrzebuje sposobu na zapobieganie nieograniczonemu wzrostowi drzewa bez ograniczeń pamięciowych, zwykle poprzez ograniczenie liczby węzłów lub wygasanie najmniej odwiedzanych gałęzi.

Frequently asked questions

Czy MCTS potrzebuje funkcji oceny?

Nie, a to jest jego główna zaleta. Klasyczny algorytm minimax wymaga ręcznie zbudowanej heurystyki, która ocenia każdą pozycję; MCTS potrzebuje jedynie legalnych ruchów i sygnału o terminalnym zwycięstwie, przegranej lub remisie, szacując wartość wyłącznie poprzez rozgrywanie gier.

Co kontroluje stała eksploracji C w UCB1?

Handlowe ona między wykorzystywaniem ruchów, które często wygrywały, a eksploracją ruchów, które były rzadko odwiedzane. Większa wartość C rozprasza wizyty na większej liczbie potencjalnych ruchów przed podjęciem decyzji; mniejsza wartość C koncentruje poszukiwania na aktualnie najlepszej linii szybciej, ryzykując pominięcie lepszego ruchu, który wydawał się słaby wczesnym etapie.

Dlaczego polecany ruch pochodzi z licznika wizyt, a nie współczynnika wygranych?

Współczynnik wygranych na niewykorzystanej węźle jest szumem, który UCB1 jeszcze nie skończył skorygować. Liczba wizyt węzła odzwierciedla, jak bardzo suma oceny przetrwał dzięki kumulowanemu badaniu, co w praktyce jest bardziej stabilnym sygnałem prawdziwej siły niż surowa średnia z niewielu rozgrywek.

Wypróbuj na żywo

Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Monte Carlo Tree Search i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.

▶ Otwórz symulację Monte Carlo Tree Search

Co znalazłeś?

Dodaj kroki odtworzenia (opcjonalnie)