Platinum Rift 2

Collaboration pour créer une IA

a marqué ce sujet comme résolu.

Bonjour,

L'idée

Comme un membre l'avait mentionné il y a quelques semaines, on pourrait essayer de collaborer pour réaliser une IA sur codingame. Ça tombe bien, ils ont lancé dernièrement un nouveau jeu multijoueur, Platinum Rift 2, et il nous reste 36 jours pour participer.

Le principe du jeu est détaillé sur le site, je ne vais pas y revenir. En point de départ, j'ai rapidemment écrit quelques lignes en python (qui ont gagné contre l'IA aléatoire fournie sur le site, mais qui ne parviendront jamais à battre une IA créée par un participant). Je fournis le code dans la balise secrète plus bas. Pour être honnête, je ne suis pas programmeur, donc c'est certainement très mal écrit, mais ça a le mérite d'exister. Le site accepte beaucoup de langages, donc même si vous ne programmez pas en python, vous pouvez participer à la discussion sur l'IA.

L'IA

Donc pour l'instant, je fais un déplacement et un spawn aléatoire, sans la moindre réflexion. Quelques pistes d'amélioration à discuter.

  • Ne se déplacer que sur une case qui ne nous appartient pas, pour maximiser la capture. Quelle direction choisir dans le cas où l'on possèderait déjà toutes les cases voisines ?
  • Ne créer des pods que sur les cases ayant une voisine neutre ou ennemie, pour être directement près du front.
  • Déplacer les pods un par un, pour maximiser la capture. Si le reste de l'IA est faite correctement, on devrait de toute façon après un moment avoir des déplacement par groupe, même si gérés un par un.
  • Corriger le bug dans la partie qui s'occupe du spawn. J'ai un peu de platinium restant à la fin, quand ça ne devrait pas être le cas.

Je vous écoute pour toute proposition, que ce soit au niveau de l'IA ou du code !

Le code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import sys, math, random

ZonesPlatinium=[]
totalPlatinium=0
graph={}

playerCount, myId, zoneCount, linkCount = [int(i) for i in input().split()]
#Lit le Pt par zone
for i in range(zoneCount):
   zoneId, platinumSource = [int(i) for i in input().split()]
   ZonesPlatinium.append(platinumSource)
   
#Crée le dictionnaire avec les liens
for i in range(linkCount):
   zone1, zone2 = [int(i) for i in input().split()]
   if zone1 not in graph:
       graph[zone1]=[]
   if zone2 not in graph:
       graph[zone2]=[]
   if zone2 not in graph[zone1]:
       graph[zone1].append(zone2)
   if zone1 not in graph[zone2]:
       graph[zone2].append(zone1)

# game loop
while 1:
   Zones=[]
   ZonesPresence=[]
   ZonesPossedees=[]
   spawn=""
   deplacement=""
   
   platinum = int(input()) # my available Platinum
   #Lit les zones où on est présent
   for i in range(zoneCount):
       zId, ownerId, podsP0, podsP1, podsP2, podsP3 = [int(i) for i in input().split()]
       exec("count=podsP"+str(myId))
       Zones.append(ownerId)
       if count:
           ZonesPresence.append([zId,ownerId,count])
   
   #Gere le déplacement
   for zone in ZonesPresence:
       if zone[1]==myId:
           choix=random.randint(0,len(graph[zone[0]])-1)
           deplacement+=str(zone[2])+" "+str(zone[0])+" "+str((graph[zone[0]])[choix])+" "
   
   #Gere le spawn
   for zone in range(len(Zones)-1):
       if Zones[zone]==myId:
           totalPlatinium+=ZonesPlatinium[zone]
           ZonesPossedees.append(zone)
   while totalPlatinium>=20:
       choix=random.randint(0,len(ZonesPossedees)-1)
       spawn+="1 "+str(ZonesPossedees[choix])+" "
       totalPlatinium-=20
   
   #Instructions
   print(deplacement) 
   print(spawn)

Ouais c'est dommage.

J'ai très légèrement (3 lignes en plus) mis à jour le déplacement, pour que ce ne soit plus complètement aléatoire. Je l'ai volontairement fait d'une manière très inefficace pour vous motiver à corriger ces quelques lignes :o

Maintenant, j'essaie trois déplacement aléatoires pour essayer d'en trouver un légèrement meilleur que les autres, c'est à dire vers une zone que je n'ai pas encore. Je n'ai pas encore pris en compte le platinium ni quoi que ce soit.

Il serait bien plus efficace d'explorer toutes les options possibles et de sélectionner la zone avec la plus forte teneur en platinium parmis celles qui ne nous appartiennent pas. Quelqu'un veut écrire les quelques lignes nécessaires pour le faire ?

1
2
3
4
5
6
7
8
9
#Gere le déplacement
    for zone in ZonesPresence:
        if zone[1]==myId:
            choix=zone[0]
            iteration=0
            while Zones[choix]==myId and iteration<3:
                choix=random.randint(0,len(graph[zone[0]])-1)
                iteration += 1
            deplacement+=str(zone[2])+" "+str(zone[0])+" "+str((graph[zone[0]])[choix])+" "

Edit: Bon, en fait, j'ai eu honte de proposer quelque chose comme ça, du coup j'ai fait une nouvelle implémentation rapide pour le déplacement. Maintenant, tous les voisins sont considérés jusqu'à en trouver un qui ne nous appartient pas. J'en ai aussi profiter pour corriger le bug que j'avais avec le spawn.

Idées d'amélioration

Si vous voulez participer, vous pouvez toujours essayer de prendre les idées du premier poste qui n'ont pas encore été faites ou discuter ici pour en trouver une. Le code est toujours assez stupide, ça devrait être facile de trouver :o

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
ZonesPlatinium={}
    for i in range(zoneCount):
    zoneId, platinumSource = [int(i) for i in input().split()]
    ZonesPlatinium[zoneId]=platinumSource

    #Gere le déplacement
    for zone in ZonesPresence:
        if zone[1]==myId:
            for zonevoisine in graph[zone[0]]:
                choix=zonevoisine
                if Zones[choix]!=myId:
                    break
            deplacement+=str(zone[2])+" "+str(zone[0])+" "+str(choix)+" "

Je suis aussi sous le stun l'effet des fêtes de fin d'année.

Par contre je constaste que tu n'as pas amélioré tes pistes.

Sur papier, il faudrait prendre en compte la position (distance) des pods/territoires ennemis pour estimer la direction à prendre, donc un algo A* ou DjikStra qui est mieux.

S'orienter vers la zone qui nous permettrait de capturer le plus de case et ayant le moins de pod.

Puis un algo qui place les pods selon la distance des ennemis et à l'extrémité du territoire.

J'ai regardé les combats et souvent les gagnants sont ceux qui capture et attaque au bon moment.

Uniquement, capturer tant qu'il y a des cases neutres, n'est pas viable si tu te fais capturer tes territoires en même temps.

Ha mais je n'ai jamais dit que mon algo était optimisé, le contraire même. Je voulais inciter d'autres gens à participer en laissant des améliorations faciles à faire. Mon idées c'est de l'améliorer un petit peu de temps en temps jusqu'à ce que d'autres personnes trouvent de la motivation ou du temps.

Si tu veux contribuer un peu, pas de soucis :)

Je m'autorise un double message pour vous dire que les règles ont été mises à jour. Maintenant, les pods ne peuvent plus apparaître que sur une zone définie. Du coup, il va falloir avoir le meilleur algo pour les déplacements.

A-312 a proposé quelques idées intéressantes, quelqu'un veut les tenter ?

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte