adds "--threads" command line arg to limit threads used by AI when running simulated games.
parent
2729a26a1a
commit
2660653acb
|
@ -1,6 +1,7 @@
|
|||
package magic;
|
||||
|
||||
import java.util.Locale;
|
||||
import magic.ai.MagicAI;
|
||||
import magic.ai.MagicAIImpl;
|
||||
import magic.data.GeneralConfig;
|
||||
import magic.ui.widget.duel.animation.MagicAnimations;
|
||||
|
@ -45,6 +46,10 @@ class CommandLineArgs {
|
|||
MagicAnimations.setEnabled(false);
|
||||
break;
|
||||
|
||||
case "--threads": // limits the number of threads AI uses when running simulated games.
|
||||
MagicAI.setMaxThreads(Integer.parseInt(args[i + 1].trim()));
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import java.awt.SplashScreen;
|
|||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
import javax.swing.SwingUtilities;
|
||||
import magic.ai.MagicAI;
|
||||
import magic.data.DuelConfig;
|
||||
import magic.game.state.GameLoader;
|
||||
import magic.model.player.AiProfile;
|
||||
|
@ -108,6 +109,7 @@ public class MagicMain {
|
|||
|
||||
System.out.println("P1 : " + config.getPlayerProfile(0).getPlayerLabel());
|
||||
System.out.println("P2 : " + config.getPlayerProfile(1).getPlayerLabel());
|
||||
System.out.println("AI threads : " + MagicAI.getMaxThreads());
|
||||
|
||||
ScreenController.getFrame().newDuel(config);
|
||||
return;
|
||||
|
|
|
@ -60,7 +60,7 @@ Monte-Carlo Tree Search in Lines of Action
|
|||
use evaluation score to keep k-best moves
|
||||
mixed: start with corrective, rest of the moves use greedy
|
||||
*/
|
||||
public class MCTSAI implements MagicAI {
|
||||
public class MCTSAI extends MagicAI {
|
||||
|
||||
private static int MIN_SCORE = Integer.MAX_VALUE;
|
||||
static int MIN_SIM = Integer.MAX_VALUE;
|
||||
|
@ -69,8 +69,6 @@ public class MCTSAI implements MagicAI {
|
|||
static double RATIO_K = 1.0;
|
||||
private int sims = 0;
|
||||
|
||||
private static final int THREADS = Runtime.getRuntime().availableProcessors();
|
||||
|
||||
static {
|
||||
if (System.getProperty("min_sim") != null) {
|
||||
MIN_SIM = Integer.parseInt(System.getProperty("min_sim"));
|
||||
|
@ -106,6 +104,7 @@ public class MCTSAI implements MagicAI {
|
|||
MagicGameLog.log(message);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] findNextEventChoiceResults(final MagicGame startGame, final MagicPlayer scorePlayer) {
|
||||
|
||||
// Determine possible choices
|
||||
|
@ -132,7 +131,7 @@ public class MCTSAI implements MagicAI {
|
|||
log("MCTS cached=" + root.getNumSim());
|
||||
|
||||
sims = 0;
|
||||
final ExecutorService executor = Executors.newFixedThreadPool(THREADS);
|
||||
final ExecutorService executor = Executors.newFixedThreadPool(getMaxThreads());
|
||||
final BlockingQueue<Runnable> queue = new LinkedBlockingQueue<>();
|
||||
|
||||
// ensure tree update runs at least once
|
||||
|
|
|
@ -1,21 +1,19 @@
|
|||
package magic.ai;
|
||||
|
||||
import magic.model.MagicGame;
|
||||
import magic.model.MagicGameLog;
|
||||
import magic.model.MagicPlayer;
|
||||
import magic.model.event.MagicEvent;
|
||||
import magic.model.phase.MagicStep;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import magic.model.MagicGame;
|
||||
import magic.model.MagicGameLog;
|
||||
import magic.model.MagicPlayer;
|
||||
import magic.model.event.MagicEvent;
|
||||
import magic.model.phase.MagicStep;
|
||||
|
||||
public class MMAB implements MagicAI {
|
||||
public class MMAB extends MagicAI {
|
||||
|
||||
private static final long SEC_TO_NANO=1000000000L;
|
||||
private static final int THREADS = Runtime.getRuntime().availableProcessors();
|
||||
|
||||
private final boolean CHEAT;
|
||||
private final boolean DECKSTR;
|
||||
|
@ -57,10 +55,10 @@ public class MMAB implements MagicAI {
|
|||
// submit jobs
|
||||
final ArtificialPruneScoreRef scoreRef = new ArtificialPruneScoreRef(new ArtificialMultiPruneScore());
|
||||
final ArtificialScoreBoard scoreBoard = new ArtificialScoreBoard();
|
||||
final ExecutorService executor = Executors.newFixedThreadPool(THREADS);
|
||||
final ExecutorService executor = Executors.newFixedThreadPool(getMaxThreads());
|
||||
final List<ArtificialChoiceResults> achoices=new ArrayList<ArtificialChoiceResults>();
|
||||
final int artificialLevel = scorePlayer.getAiProfile().getAiLevel();
|
||||
final int rounds = (size + THREADS - 1) / THREADS;
|
||||
final int rounds = (size + getMaxThreads() - 1) / getMaxThreads();
|
||||
final long slice = artificialLevel * SEC_TO_NANO / rounds;
|
||||
|
||||
for (final Object[] choice : choices) {
|
||||
|
|
|
@ -13,7 +13,7 @@ import magic.model.event.MagicEvent;
|
|||
* MTD(f) algorithm by Aske Plaat
|
||||
* https://askeplaat.wordpress.com/534-2/mtdf-algorithm/
|
||||
*/
|
||||
public class MTDF implements MagicAI {
|
||||
public class MTDF extends MagicAI {
|
||||
|
||||
private final boolean CHEAT;
|
||||
private final Map<Long,TTEntry> table = new HashMap<>();
|
||||
|
@ -24,6 +24,7 @@ public class MTDF implements MagicAI {
|
|||
CHEAT = aCheat;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] findNextEventChoiceResults(final MagicGame sourceGame, final MagicPlayer scorePlayer) {
|
||||
final int artificialLevel = scorePlayer.getAiProfile().getAiLevel();
|
||||
final long startTime = System.currentTimeMillis();
|
||||
|
|
|
@ -3,7 +3,20 @@ package magic.ai;
|
|||
import magic.model.MagicGame;
|
||||
import magic.model.MagicPlayer;
|
||||
|
||||
public interface MagicAI {
|
||||
public abstract class MagicAI {
|
||||
|
||||
// default number of threads to use when running simulated games.
|
||||
private static int maxThreads = Runtime.getRuntime().availableProcessors();
|
||||
|
||||
int MAX_LEVEL = 8;
|
||||
Object[] findNextEventChoiceResults(final MagicGame game, final MagicPlayer player);
|
||||
abstract public Object[] findNextEventChoiceResults(final MagicGame game, final MagicPlayer player);
|
||||
|
||||
public static void setMaxThreads(int i) {
|
||||
maxThreads = Math.min(i, Runtime.getRuntime().availableProcessors());
|
||||
}
|
||||
|
||||
public static int getMaxThreads() {
|
||||
return maxThreads;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,20 +1,18 @@
|
|||
package magic.ai;
|
||||
|
||||
import magic.model.MagicGame;
|
||||
import magic.model.MagicGameLog;
|
||||
import magic.model.MagicPlayer;
|
||||
import magic.model.event.MagicEvent;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import magic.model.MagicGame;
|
||||
import magic.model.MagicGameLog;
|
||||
import magic.model.MagicPlayer;
|
||||
import magic.model.event.MagicEvent;
|
||||
|
||||
public class VegasAI implements MagicAI {
|
||||
public class VegasAI extends MagicAI {
|
||||
|
||||
private static final long SEC_TO_NANO=1000000000L;
|
||||
private static final int THREADS=Runtime.getRuntime().availableProcessors();
|
||||
|
||||
private final boolean CHEAT;
|
||||
|
||||
|
@ -49,10 +47,10 @@ public class VegasAI implements MagicAI {
|
|||
}
|
||||
|
||||
// Multiple choices
|
||||
final ExecutorService executor = Executors.newFixedThreadPool(THREADS);
|
||||
final ExecutorService executor = Executors.newFixedThreadPool(getMaxThreads());
|
||||
final List<VegasScore> scores=new ArrayList<VegasScore>();
|
||||
final int artificialLevel = scorePlayer.getAiProfile().getAiLevel();
|
||||
final int rounds = (size + THREADS - 1) / THREADS;
|
||||
final int rounds = (size + getMaxThreads() - 1) / getMaxThreads();
|
||||
final long slice = artificialLevel * SEC_TO_NANO / rounds;
|
||||
for (final Object[] choiceResults : choiceResultsList) {
|
||||
final VegasScore score=new VegasScore(choiceResults);
|
||||
|
|
Loading…
Reference in New Issue