Les membres ayant 30 points peuvent parler sur les canaux annonces, projets et hs du chat.
La shoutbox n'est pas chargée par défaut pour des raisons de performances. Cliquez pour charger.

Forum Casio - Autres questions


Index du Forum » Autres questions » [LUA] Problème avec l'IA
Eiyeron Hors ligne Ancien modérateur Points: 5525 Défis: 57 Message

[LUA] Problème avec l'IA

Posté le 17/10/2010 17:35

Yo!
J'ai un petit problème dans l’algorithme alpha beta pour l'IA de 4-power: je ne comprends pas trop comment il fonctionne, et comment bien utiliser eval_local. L'algo alpha-beta utilise un programme d'évaluation du tableau (qui lui est incomplet, voyez plus bas), retournant un "score" en fonction des placement faits.
Puis l'algo trie les possibilités en fonction du score à chaque hypothèse de placement, puis en fonction du meilleur score, place le pion.
Avec veb, on a décidé de le prendre, car cet
algo est très puissant.

Le problème étant que je ne comprends pas l'algorithme, et que j'ai plusieurs problèmes:
- eval_local (fonction d'évaluation) étant incomplet (je dois enlever des points quand un pion coupe une série, comme XXOX))
- Le jeu d'arrête car à chaque tentative de calcul, le programme se cale sur l'errur liberr(1), c'est à dire quand la case demandée ne correspond pas au joueur...

Notre alphabeta est une fonction récursive, elle modife le résultat précédent afin d'accélérer le calcul, résultat: calul quasi-intantané...

L'algo en question:
-eval_local, détermination du score du joueur

function eval_local(x,y,joueur, adv,scorej,scoreadv)
if mata[y][x]~=joueur then lib.error(1) end

-- detection des points ajoutés à joueur
local alimax= {1,1,1,1}
local arret = {false,false,false,false}
local x1,y1,nbaligne
-- diagonale 1
x1=x+3; y1 = y+3 ; x1min= x-3
while (x1>7 or y1 > 6) do x1=x1-1 ;y1=y1-1 end
while (x1>=4 and y1 >= 4 and x1>=x1min ) do
    nbaligne = 0
    for i=0,3,1 do
        if mata[y1-i][x1-i] == adv then  nbaligne = 0 ;arret[1]=true;break end
        if mata[y1-i][x1-i] == joueur then nbaligne = nbaligne +1 end
    end
    if alimax[1] < nbaligne then alimax[1]= nbaligne end
    x1=x1-1; y1=y1-1
end
-- diagonale 2
x1=x+3; y1 = y-3 ; x1min= x-3
while (x1>7 or y1 < 1) do x1=x1-1 ;y1=y1+1 end
while (x1>=4 and y1 <= 3 and x1>=x1min ) do
    nbaligne = 0
    for i=0,3,1 do
        if mata[y1+i][x1-i] == adv then  nbaligne = 0 ;arret[2]=true;break end
        if mata[y1+i][x1-i] == joueur then nbaligne = nbaligne +1 end
    end
    if alimax[2] < nbaligne then alimax[2]= nbaligne end
    x1=x1-1; y1=y1+1
end
-- horizontal
x1=x+3;  x1min= x-3
while (x1>7) do x1=x1-1 end
while (x1>=4 and x1>=x1min ) do
    nbaligne = 0
    for i=0,3,1 do
        if mata[y][x1-i] == adv then  nbaligne = 0 ;arret[3]=true;break end
        if mata[y][x1-i] == joueur then nbaligne = nbaligne +1 end
    end
    if alimax[3] < nbaligne then alimax[3]= nbaligne end
    x1=x1-1
end
-- vertical
y1 = y-3 ; y1max= y+3
while (y1 < 1) do y1=y1+1 end
while (y1 <= 3 and y1<=y1max ) do
    nbaligne = 0
    for i=0,3,1 do
        if mata[y1+i][x] == adv then  nbaligne = 0 ;arret[4]=true;break end
        if mata[y1+i][x] == joueur then nbaligne = nbaligne +1 end
    end
    if alimax[4] < nbaligne then alimax[4]= nbaligne end
    y1=y1+1
end

for i=1,4,1 do
    nbaligne= alimax[i ]  --espace volontaire, car il est considéré comme balise...
    if nbaligne ==4 then scorej=scorej+100000
    elseif nbaligne ==3 then scorej=scorej+100
    elseif nbaligne ==2 then scorej=scorej+10 end
end
-- detection des points perdu à adv
if arret[3] -- coupe serie horizontale
then -- doit tester s'il coupe ou non une serie

end


return scorej --, scoreadv
end

Merci de votre compréhension.

Fichier joint



LienAjouter une imageAjouter une vidéoAjouter un lien vers un profilAjouter du codeCiterAjouter un spoiler(texte affichable/masquable par un clic)Ajouter une barre de progressionItaliqueGrasSoulignéAfficher du texte barréCentréJustifiéPlus petitPlus grandPlus de smileys !
Cliquez pour épingler Cliquez pour détacher Cliquez pour fermer
Alignement de l'image: Redimensionnement de l'image (en pixel):
Afficher la liste des membres
:bow: :cool: :good: :love: ^^
:omg: :fusil: :aie: :argh: :mdr:
:boulet2: :thx: :champ: :whistle: :bounce:
valider
 :)  ;)  :D  :p
 :lol:  8)  :(  :@
 0_0  :oops:  :grr:  :E
 :O  :sry:  :mmm:  :waza:
 :'(  :here:  ^^  >:)

Σ π θ ± α β γ δ Δ σ λ
Veuillez donner la réponse en chiffre
Vous devez activer le Javascript dans votre navigateur pour pouvoir valider ce formulaire.

Si vous n'avez pas volontairement désactivé cette fonctionnalité de votre navigateur, il s'agit probablement d'un bug : contactez l'équipe de Planète Casio.

Planète Casio v4.3 © créé par Neuronix et Muelsaco 2004 - 2024 | Il y a 138 connectés | Nous contacter | Qui sommes-nous ? | Licences et remerciements

Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd