From 3e4a343c4e99c21ab18ab834f764d8c5880f3fd9 Mon Sep 17 00:00:00 2001 From: ramollia <> Date: Fri, 16 Jan 2026 15:55:25 +0100 Subject: [PATCH] update mcts --- app/src/main/java/org/toop/Main.java | 18 ++++++------------ .../app/widget/view/LocalMultiplayerView.java | 5 +++-- .../java/org/toop/game/players/ai/MCTSAI.java | 4 ++++ .../org/toop/game/players/ai/mcts/MCTSAI3.java | 3 ++- 4 files changed, 15 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/toop/Main.java b/app/src/main/java/org/toop/Main.java index 428b668..8b93ac6 100644 --- a/app/src/main/java/org/toop/Main.java +++ b/app/src/main/java/org/toop/Main.java @@ -1,6 +1,5 @@ package org.toop; - import org.toop.app.App; import org.toop.framework.game.games.reversi.BitboardReversi; import org.toop.framework.game.players.ArtificialPlayer; @@ -16,13 +15,13 @@ import java.util.concurrent.Executors; public final class Main { static void main(String[] args) { - ExecutorService executor = Executors.newFixedThreadPool(1); - - executor.execute(() -> testMCTS(25)); App.run(args); + + // final ExecutorService executor = Executors.newFixedThreadPool(1); + // executor.execute(() -> testAIs(25)); } - private static void testMCTS(int games) { + private static void testAIs(int games) { var versions = new ArtificialPlayer[5]; versions[0] = new ArtificialPlayer(new RandomAI(), "Random AI"); versions[1] = new ArtificialPlayer(new MCTSAI1(1000), "MCTS V1 AI"); @@ -35,12 +34,12 @@ public final class Main { final int playerIndex1 = i % versions.length; final int playerIndex2 = j % versions.length; - testAI(games, new ArtificialPlayer[] { versions[playerIndex1], versions[playerIndex2]}); + testAIVSAI(games, new ArtificialPlayer[] { versions[playerIndex1], versions[playerIndex2]}); } } } - private static void testAI(int games, ArtificialPlayer[] ais) { + private static void testAIVSAI(int games, ArtificialPlayer[] ais) { int wins = 0; int ties = 0; @@ -53,11 +52,6 @@ public final class Main { final long move = ais[currentAI].getMove(match); match.play(move); - - if (ais[currentAI].getAi() instanceof MCTSAI mcts) { - final int lastIterations = mcts.getLastIterations(); - System.out.printf("iterations %s: %d\n", ais[currentAI].getName(), lastIterations); - } } if (match.getWinner() < 0) { diff --git a/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java b/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java index 3fee500..e19732a 100644 --- a/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java +++ b/app/src/main/java/org/toop/app/widget/view/LocalMultiplayerView.java @@ -16,6 +16,7 @@ import org.toop.app.widget.tutorial.*; import org.toop.game.players.ai.MiniMaxAI; import org.toop.game.players.ai.mcts.MCTSAI1; import org.toop.game.players.ai.mcts.MCTSAI3; +import org.toop.game.players.ai.mcts.MCTSAI4; import org.toop.local.AppContext; import javafx.geometry.Pos; @@ -82,12 +83,12 @@ public class LocalMultiplayerView extends ViewWidget { players[0] = new LocalPlayer(information.players[0].name); } else { // players[0] = new ArtificialPlayer(new RandomAI(), "Random AI"); - players[0] = new ArtificialPlayer(new MCTSAI3(50, Runtime.getRuntime().availableProcessors()), "MCTS V3 AI"); + players[0] = new ArtificialPlayer(new MCTSAI4(500, 4), "MCTS V4 AI"); } if (information.players[1].isHuman) { players[1] = new LocalPlayer(information.players[1].name); } else { - players[1] = new ArtificialPlayer(new MCTSAI1(50), "MCTS V1 AI"); + players[1] = new ArtificialPlayer(new MCTSAI1(500), "MCTS V1 AI"); } if (AppSettings.getSettings().getTutorialFlag() && AppSettings.getSettings().getFirstReversi()) { new ShowEnableTutorialWidget( diff --git a/game/src/main/java/org/toop/game/players/ai/MCTSAI.java b/game/src/main/java/org/toop/game/players/ai/MCTSAI.java index 2ddda4b..495587d 100644 --- a/game/src/main/java/org/toop/game/players/ai/MCTSAI.java +++ b/game/src/main/java/org/toop/game/players/ai/MCTSAI.java @@ -92,10 +92,14 @@ public abstract class MCTSAI extends AbstractAI { public MCTSAI(int milliseconds) { this.milliseconds = milliseconds; + + this.lastIterations = 0; } public MCTSAI(MCTSAI other) { this.milliseconds = other.milliseconds; + + this.lastIterations = other.lastIterations; } public int getLastIterations() { diff --git a/game/src/main/java/org/toop/game/players/ai/mcts/MCTSAI3.java b/game/src/main/java/org/toop/game/players/ai/mcts/MCTSAI3.java index 8ada67e..ee1e202 100644 --- a/game/src/main/java/org/toop/game/players/ai/mcts/MCTSAI3.java +++ b/game/src/main/java/org/toop/game/players/ai/mcts/MCTSAI3.java @@ -41,7 +41,8 @@ public class MCTSAI3 extends MCTSAI { tasks.add(() -> { final Node localRoot = new Node(game.deepCopy()); - while (Float.isNaN(localRoot.solved) && System.nanoTime() < endTime) { + // while (Float.isNaN(localRoot.solved) && System.nanoTime() < endTime) { + while (System.nanoTime() < endTime) { Node leaf = selection(localRoot); leaf = expansion(leaf); final float value = simulation(leaf);