質問編集履歴
1
全体のコードを打ちました
test
CHANGED
File without changes
|
test
CHANGED
@@ -15,9 +15,82 @@
|
|
15
15
|
そうではなく、エピソード中に石は動かず、初期位置を学習してうまく乗る部分を探し出してほしいです。
|
16
16
|
|
17
17
|
```ここに言語名を入力
|
18
|
+
public class RockAgent : Agent
|
19
|
+
{
|
20
|
+
public GameObject rock;
|
21
|
+
public GameObject rockB;
|
22
|
+
|
23
|
+
Rigidbody m_Rb_rock;
|
24
|
+
Rigidbody m_Rb_rockB;
|
25
|
+
|
18
|
-
public override void
|
26
|
+
public override void Initialize()
|
19
27
|
{
|
28
|
+
m_Rb_rock = rock.GetComponent<Rigidbody>();
|
29
|
+
m_Rb_rockB = rockB.GetComponent<Rigidbody>();
|
20
|
-
|
30
|
+
}
|
31
|
+
|
32
|
+
public override void OnEpisodeBegin()
|
33
|
+
{
|
34
|
+
rock.transform.localPosition = new Vector3(0f, 5f, 0f);
|
35
|
+
rock.transform.rotation = Quaternion.Euler(0f, 0f, 0f);
|
36
|
+
m_Rb_rock.velocity = Vector3.zero;
|
37
|
+
m_Rb_rock.angularVelocity = Vector3.zero;
|
38
|
+
|
39
|
+
rockB.transform.localPosition = new Vector3(0f, 0.1f, 0f);
|
40
|
+
rockB.transform.rotation = Quaternion.Euler(0f, 0f, 0f);
|
41
|
+
m_Rb_rockB.velocity = Vector3.zero;
|
42
|
+
m_Rb_rockB.angularVelocity = Vector3.zero;
|
43
|
+
}
|
44
|
+
|
45
|
+
public override void CollectObservations(VectorSensor sensor)
|
46
|
+
{
|
47
|
+
sensor.AddObservation(rock.transform.localPosition);
|
48
|
+
sensor.AddObservation(rock.transform.localEulerAngles);
|
49
|
+
}
|
50
|
+
|
51
|
+
public override void OnActionReceived(ActionBuffers actionBuffers)
|
52
|
+
{
|
53
|
+
float turnX = 0f;
|
54
|
+
if (actionBuffers.DiscreteActions[0] == 1f)
|
55
|
+
{
|
56
|
+
turnX = -1f;
|
57
|
+
}
|
58
|
+
else if (actionBuffers.DiscreteActions[0] == 2f)
|
59
|
+
{
|
60
|
+
turnX = 1f;
|
61
|
+
}
|
62
|
+
rock.transform.Rotate(200f * turnX * Time.deltaTime, 0, 0, Space.World);
|
63
|
+
|
64
|
+
float turnY = 0f;
|
65
|
+
if (actionBuffers.DiscreteActions[1] == 1f)
|
66
|
+
{
|
67
|
+
turnY = -1f;
|
68
|
+
}
|
69
|
+
else if (actionBuffers.DiscreteActions[1] == 2f)
|
70
|
+
{
|
71
|
+
turnY = 1f;
|
72
|
+
}
|
73
|
+
rock.transform.Rotate(0, 200f * turnY * Time.deltaTime, 0, Space.World);
|
74
|
+
|
75
|
+
float turnZ = 0f;
|
76
|
+
if (actionBuffers.DiscreteActions[2] == 1f)
|
77
|
+
{
|
78
|
+
turnZ = -1f;
|
79
|
+
}
|
80
|
+
else if (actionBuffers.DiscreteActions[2] == 2f)
|
81
|
+
{
|
82
|
+
turnZ = 1f;
|
83
|
+
}
|
84
|
+
rock.transform.Rotate(0, 0, 200f * turnZ * Time.deltaTime, Space.World);
|
85
|
+
|
86
|
+
if (MaxStep > 0) AddReward(1f / MaxStep);
|
87
|
+
|
88
|
+
if (rock.transform.position.y < 0f)
|
89
|
+
{
|
90
|
+
SetReward(-1.0f);
|
91
|
+
EndEpisode();
|
92
|
+
}
|
93
|
+
}
|
21
94
|
```
|
22
95
|
|
23
96
|
|