2009-12-01 7 views
2

Je suis en train d'écrire un cadre AI-testing pour un concours. Les participants soumettent une classe de Bot qui correspond à une interface donnée. Ensuite, tous les robots jouent un tour par tour. À chaque virage, je veux faire ce qui suit:Limitation des cycles du processeur d'exécution de threads en Java

For every bot B: 
    start a thread that runs at most N cycles and does B.getNextMove() 
wait for all threads to complete 
Make all moves (from each bot). 

Ma difficulté vient de dire «au plus N cycles». Je peux limiter tous les bots par le temps (disons une demi-seconde par tour) mais cela signifie que certains peuvent avoir plus de cycles de processeur que d'autres et ne permettent pas un strict "votre bot devrait être capable de prendre sa décision". X temps "exigence dans la compétition.

Comme indiqué, ceci est en Java. Des idées? J'ai regardé la concurrence et le verrouillage, mais cela ne semble pas être la bonne direction. En outre, il est possible de ne pas exécuter les bots dans Parralel et ensuite utiliser le temps pour la restriction (étant donné que l'ordinateur ne fonctionne pas à ce moment), mais ce serait indésirable car cela ralentirait considérablement la vitesse à laquelle nous pourrait avoir des résultats à partir des jeux.

+0

Que signifie "cycle" en Java? Comment le définiriez-vous? – skaffman

+0

Personnellement, je l'ai interprété comme "cycles de processeur" comme il le dit plus tard ... et il n'y a aucun moyen de limiter un thread à des nombres spécifiques de cycles de processeur que j'ai jamais trouvé. – PSpeed

Répondre

5

Je ferais une interface avec le bot pour les faire faire 1 itération de leur algorithme, et faire un compte simple.

Si vous avez besoin de limites de temps/CPU, il n'y a pas beaucoup de façons (faciles) de gérer cela dans Java.

Vous ne pouvez pas mesurer les cycles de cpu avec Java, mais vous pouvez mesurer le temps CPU - ce qui est une amélioration considérable par rapport à l'utilisation de l'horloge murale.

Pour obtenir le temps cpu du thread courant que vous souhaitez utiliser (du paquet java.lang.management norme)

ThreadMXBean tm = ManagementFactory.getThreadMXBean(); 
long cpuTime = tm.getCurrentThreadCpuTime(); 
+0

cela ressemble à l'option la plus prometteuse.Je suppose (je vais vérifier aujourd'hui) qu'il existe un moyen de vérifier le temps de traitement du thread non courant, puisque je veux avoir un thread de gestion vérifiant ces choses. – AlexeyMK

+0

Oui, ça marche. Vous êtes un sauveteur. – AlexeyMK

+0

Curieux, que faites-vous avec le temps CPU une fois que vous l'avez? – PSpeed

1

Puisque vous contrôlez l'exécution du bot et que vous appelez explicitement le suivant, pourquoi ne pas compter les itérations? par exemple.

public class Botcaller extends Thread 
{ 
    private Bot bot; 
    int cycles_completed; 
    public static final int MAX_ALLOWED_CYCLES=...; 
    public void run() 
    { 
    while (cycles_completed <MAX_ALLOWED_CYCLES) 
    { 
     bot.move; 
     cycles_completed++; 
     yield() 
    } 
    } 
} 
+0

Cela semble prometteur; comment fonctionne la ligne "bot.move"? En ce qui concerne les candidats, ils ont juste besoin d'écrire une fonction getNextMove(), qui prend moins de N cycles pour produire une réponse. Dans ce scénario, devraient-ils écrire "bot.move" à la place, qui doit maintenant casser leur algorithme en plus petits morceaux? – AlexeyMK

+0

Je pense que ce répondant a mal compris ce que vous vouliez dire par "cycles" ou suggère que les bots soient recodés d'une manière qui soit plus granulaire ... bien que cela ne les empêche pas de faire plus que ce qu'ils sont supposés dans bot.move() – PSpeed

0

Je pense que ce sera très difficile de contrôler les discussions à ce bas niveau de Java. Je ne sais pas comment arrêter un fil en toute sécurité.

Une autre option consiste à laisser chaque robot s'exécuter n'importe quand. Avoir un thread par bot, mais interroger l'emplacement dans un thread maître chaque seconde. S'ils n'ont pas mis à jour leur position dans cette «ronde», ils sont absents et doivent attendre le prochain. Assurez-vous que l'état du monde que chaque robot voit est celui contrôlé par le thread principal. La bonne chose à propos de cette approche est qu'elle permet aux robots de sacrifier des rounds s'ils veulent faire quelque chose de plus compliqué.

0

Je pense que Robocode fait quelque chose de similaire ... vous pouvez regarder là-bas.

Questions connexes