Ha ca fait plaisir de voir quelqu'un qui maitrise le sujet
(désolé pour les accents et les fautes ... etc, je ne suis pas illétré, j'ai juste un qwerty depuis quelque jours ...)
Alors voila mon probleme (simplifié le plus possible, ca risque de te paraitre tres primaire, mais c'est bien la ou j'en suis en terme d'apprentissage, c-a-d le niveau 0):
Si tu peux m'aider a me debloquer pour ce probleme tres simple, je suis preneur !
Ma scene est composée de deux gameObjects:
- Un chasseur, qui est l'agent qui se déplace, controlé par le brain
- Un chassé, qui ne se déplace pas, qui est la cible du chasseur
C'est une version extrémement simple (je me repete la) de ce que je souhaite réaliser réellement, mais il faut bien commencer quelque part ...
Donc, l'agent se déplace grace a un nav mesh agent, les coordonnées de destination sont celles du "chassé", elles sont écrites en dur dans le code, et ne changent jamais.
La seule chose qui est influencée par le brain c'est la vitesse de déplacement du "chasseur"
Il faut que le chasseur atteigne le plus rapidement possible le chassé, mais lorsqu'il est proche du chassé, il DOIT ralentir sinon il perd. Si il touche le chassé il gagne.
En gros le resultat attendu, c'est que le chasseur se deplace rapidement jusqu'au chassé, puis ralentisse quand il en est proche pour enfin le toucher.
Au niveau du code, ca donne ceci.
Fonction AgentAction
Code:
[...]
vitesse_chasseur = vectorAction[0] * 4f; //On change la vitesse du chasseur a chaque step, entre 0 et 4
AddReward(-0.001f); //Il faut que le chasseur soit rapide, donc on puni a chaque step
if(DistanceFromTarget() < 20.0f && vitesse_chasseur > 2.0f) //Si le chasseur est proche, mais trop rapide il fait "peur" au chassé, et donc c'est perdu, on recommence
{
AddReward(-1f * DistanceFromTarget() / 20.0f);
Done();
}
if(GotTarget() == true) //Victoire
{
AddReward(1f);
Done();
}
[...]
Et au niveau des observations, je remonte ceci dans la fonction CollectObservations:
Code:
[...]
AddVectorObs(DistanceFromTarget());
if(nav_mesh_agent != null)
{
AddVectorObs(nav_mesh_agent.speed);
}
else
{
AddVectorObs(0.0f);
}
[...]
Voila, ca me semble super simple pourtant le brain doit juste jouer sur la vitesse du chasseur ...
Ce qu'il semble se passer lors du training, c'est que le l'agent comprend bien qu'il faut aller le plus vite possible, cependant il ne comprend pas qu'il faut ralentir lorsqu'il arrive trop proche de la cible.
Est-ce que j'ai rate quelque chose concernant le machine learning ?
J'ai beau tenter des millions de choses differentes ca ne fonctionne pas, surtout pour une tache aussi simple ca ne devrait pas prendre beaucoup de step a etre maitrisé ... (la j'ai poussé jusqu'á 1 millions au cás ou, mais rien n'y fait.
Merci pour ton aide
(Je suis conscient que c'est inutile et dispoportioné de faire du ML pour ca, je sais, c'est juste pour apprendre en pratiquant )
Je vais faire tourner un training cette nuit, ca en est la pour l'instant:
https://imgur.com/a/tsNr8k2
Ca confirme ce que je dis plus haut, l'agent va de plus en plus vite, mais perd systématiquement lorsqu'il est trop proche de la cible, et donc tend vers environ -0.0020 de reward (j'ai changé un peu les valeurs de reward par rapport a ce qu'il y a plus haut)
Edit: je commence a avoir des valeurs positives la au bout de 800 000 runs .... on verra demain au bout de 5 000 000