adds "--threads" command line arg to limit threads used by AI when running simulated games.

master
lodici 2017-05-09 23:02:55 +01:00
parent 2729a26a1a
commit 2660653acb
7 changed files with 42 additions and 26 deletions

View File

@ -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;
}
}
}

View File

@ -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;

View File

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

View File

@ -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) {

View File

@ -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();

View File

@ -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;
}
}

View File

@ -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);