Агент запускает снаряд под гравитацией по цели. У агента есть только одно действие - угол выстрела. Сила запуска постоянна. Я также еще не изменяю положение цели. Поэтому это должно быть тривиальным, потому что модель должна изучить правильный угол для стрельбы. Но после 300000 тренировочных этапов модель все еще снимается беспорядочно.
Agent: < /p>
using Unity.MLAgents;
using Unity.MLAgents.Actuators;
using Unity.MLAgents.Sensors;
using UnityEngine;
public class ProjectileAgent : Agent
{
public Transform target; // Stationary target with a 2D collider & "Target" tag
public Transform launchPoint; // Where the projectile is spawned
public GameObject projectilePrefab; // Prefab with Rigidbody2D & ProjectileCollision script
public float fixedForce = 500f; // Constant force applied to the projectile
private bool hasLaunched = false;
public override void OnEpisodeBegin()
{
hasLaunched = false;
RequestDecision(); // Request one decision at start of each episode
}
public override void CollectObservations(VectorSensor sensor)
{
// Observe the relative position from launchPoint to target (x,y)
Vector2 diff = target.position - launchPoint.position;
sensor.AddObservation(diff.x);
sensor.AddObservation(diff.y);
}
public override void OnActionReceived(ActionBuffers actions)
{
if (!hasLaunched)
{
// One continuous action (0..1) mapped to [0..180] degrees
float angle01 = Mathf.Clamp01(actions.ContinuousActions[0]);
float angleDegrees = Mathf.Lerp(0f, 180f, angle01);
LaunchProjectile(angleDegrees);
hasLaunched = true;
}
}
private void LaunchProjectile(float angleDegrees)
{
GameObject projObj = Instantiate(projectilePrefab, launchPoint.position, Quaternion.identity);
ProjectileCollision projScript = projObj.GetComponent
();
projScript.agent = this;
Rigidbody2D rb = projObj.GetComponent();
float rad = angleDegrees * Mathf.Deg2Rad;
Vector2 direction = new Vector2(Mathf.Cos(rad), Mathf.Sin(rad));
rb.AddForce(direction * fixedForce);
}
// Called by projectile on hitting the target
public void OnHitTarget()
{
AddReward(1.0f);
EndEpisode();
}
// Called by projectile on missing the target
public void OnMiss(Vector2 projectilePosition)
{
float distance = Vector2.Distance(projectilePosition, target.position);
float maxDistance = 10f; // Adjust as needed
float proximity = 1f - (distance / maxDistance);
proximity = Mathf.Clamp01(proximity);
// Partial reward for getting close
AddReward(proximity * 0.5f);
// Small penalty for a miss
AddReward(-0.1f);
EndEpisode();
}
// Heuristic for testing in Unity Editor (random angle)
public override void Heuristic(in ActionBuffers actionsOut)
{
actionsOut.ContinuousActions[0] = Random.value;
}
}
using UnityEngine;
public class ProjectileCollision : MonoBehaviour
{
public ProjectileAgent agent;
private void Start()
{
// Destroy after a short time so we can register a miss
Destroy(gameObject, lifetime);
}
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Target"))
{
agent.OnHitTarget();
}
else
{
agent.OnMiss(transform.position);
}
Destroy(gameObject);
}
}
Что Я пробовал
Формирование награды:
+1 за попадание в цель, частичная награда в зависимости от расстояния за близкие промахи и небольшой минус за попадание в цель. пропал.
Я увеличил награду за попадание до +3, уменьшил штраф за промах и т. д.
Этапы тренировки:
Я пробежал более 300 тыс. шагов с использованием PPO.
Проверки столкновений:
Журналы подтверждают срабатывание OnHitTarget() и OnMiss() в ожидаемое время.
Фиксированная сила и гравитация :
Проверено, что стрела может достичь цели вручную с помощью жестко запрограммированных углов.
Гравитация установлена таким образом, что физически возможно попасть в цель.
Нет случайной цели:
Цель задана в настоящее время исправлено в одном месте, чтобы упростить задачу.
Агент запускает снаряд под гравитацией по цели. У агента есть только одно действие - угол выстрела. Сила запуска постоянна. Я также еще не изменяю положение цели. Поэтому это должно быть тривиальным, потому что модель должна изучить правильный угол для стрельбы. Но после 300000 тренировочных этапов модель все еще снимается беспорядочно. Agent: < /p> [code]using Unity.MLAgents; using Unity.MLAgents.Actuators; using Unity.MLAgents.Sensors; using UnityEngine;
public class ProjectileAgent : Agent { public Transform target; // Stationary target with a 2D collider & "Target" tag public Transform launchPoint; // Where the projectile is spawned public GameObject projectilePrefab; // Prefab with Rigidbody2D & ProjectileCollision script public float fixedForce = 500f; // Constant force applied to the projectile
private bool hasLaunched = false;
public override void OnEpisodeBegin() { hasLaunched = false; RequestDecision(); // Request one decision at start of each episode }
public override void CollectObservations(VectorSensor sensor) { // Observe the relative position from launchPoint to target (x,y) Vector2 diff = target.position - launchPoint.position; sensor.AddObservation(diff.x); sensor.AddObservation(diff.y); }
public override void OnActionReceived(ActionBuffers actions) { if (!hasLaunched) { // One continuous action (0..1) mapped to [0..180] degrees float angle01 = Mathf.Clamp01(actions.ContinuousActions[0]); float angleDegrees = Mathf.Lerp(0f, 180f, angle01);
Что Я пробовал [list] [*]Формирование награды: +1 за попадание в цель, частичная награда в зависимости от расстояния за близкие промахи и небольшой минус за попадание в цель. пропал. [*]Я увеличил награду за попадание до +3, уменьшил штраф за промах и т. д. Этапы тренировки: [*]Я пробежал более 300 тыс. шагов с использованием PPO. [*]Проверки столкновений: Журналы подтверждают срабатывание OnHitTarget() и OnMiss() в ожидаемое время. [*]Фиксированная сила и гравитация : Проверено, что стрела может достичь цели вручную с помощью жестко запрограммированных углов. Гравитация установлена таким образом, что физически возможно попасть в цель. [*]Нет случайной цели: Цель задана в настоящее время исправлено в одном месте, чтобы упростить задачу. [/list]
Агент запускает снаряд под гравитацией по цели. У агента есть только одно действие - угол выстрела. Сила запуска постоянна. Я также еще не изменяю положение цели. Поэтому это должно быть тривиально, потому что модель должна изучить правильный угол...
Агент запускает снаряд под гравитацией по цели. У агента есть только одно действие - угол выстрела. Сила запуска постоянна. Я также еще не изменяю положение цели. Поэтому это должно быть тривиальным, потому что модель должна изучить правильный угол...
Сейчас я работаю над веб-сайтом. Весь этот веб-сайт защищен, поэтому только авторизованный пользователь может получить доступ к этому веб-сайту (пока работает бета-тест -> ограниченное время).
У нас есть 2 двух разных виды обмена на нашем сайте....
Я пытаюсь создать сборный модуль самонаводящегося снаряда, который обнаруживает игрока и следует за ним. Проблема в том, что игрок находится в сцене, а не создан его экземпляр, и поэтому префабу трудно его распознать. Независимо от того, какой код я...