/// <summary> /// エージェントの状態更新 /// </summary> private void AgentUpdate(AirHockeyAgent a, NNBrain b) { var observation = a.CollectObservations(); var action = b.GetAction(observation); a.AgentAction(action); }
public NNBrain Mutate(int generation) { var c = new NNBrain(this); for (int i = 0; i < c.HiddenLayers + 1; i++) { c.Biases[i] = MutateLayer(Weights[i], generation); c.Weights[i] = MutateLayer(Weights[i], generation); } return(c); }
public NNBrain Crossover(NNBrain b) { var c = new NNBrain(this); for (int i = 0; i < c.HiddenLayers + 1; i++) { c.Biases[i] = CrossoverLayer(Biases[i], b.Biases[i]); c.Weights[i] = CrossoverLayer(Weights[i], b.Weights[i]); } return(c); }
/// <summary> /// ブレインを報酬で比較する関数 /// </summary> private static int CompareBrains(NNBrain a, NNBrain b) { if (a.Reward > b.Reward) { return(-1); } if (b.Reward > a.Reward) { return(1); } return(0); }
public NNBrain(NNBrain other) { InputSize = other.InputSize; OutputSize = other.OutputSize; HiddenLayers = other.HiddenLayers; HiddenSize = other.HiddenSize; // ?? for (int i = 0; i < other.Weights.Count; ++i) { Matrix w = other.Weights[i].Copy(); Matrix b = other.Biases[i].Copy(); Weights.Add(w); Biases.Add(b); } }
/// <summary> /// 初回起動時 /// </summary> void Start() { // Brainの初期化 if (LearningData != null) { // ランダムに初期化 var originalBrain = NNBrain.Load(learningData); for (int i = 0; i < TotalPopulation; i++) { Brains.Add(new NNBrain(originalBrain)); } } else { // ロードデータをそのままコピー for (int i = 0; i < TotalPopulation; i++) { Brains.Add(new NNBrain(InputSize, HiddenSize, HiddenLayers, OutputSize)); } } // Agentの初期化 for (int i = 0; i < NAgents; i++) { var obj = Instantiate(GObject, Vector3.forward * i * 15f, Quaternion.identity); obj.SetActive(true); var agent = obj.GetComponent <AirHockeyAgent>(); if (i >= 5) { agent.NoRendering(); } GObjects.Add(obj); Agents.Add(agent); } BestRecord = -9999; SetStartAgents(); }