public RNCromosoma Roulette() { RNCromosoma ag = RNManager.instance.Ships[0].cromosoma; float total = 0; for (int i = 0; i < RNManager.instance.Ships.Count; i++) { total += RNManager.instance.Ships[i].puntaje; } float selected = Random.Range(0f, total); float tmp = 0; for (int i = 0; i < RNManager.instance.Ships.Count; i++) { tmp += RNManager.instance.Ships[i].puntaje; if (tmp > selected) { ag = RNManager.instance.Ships[i].cromosoma; break; } } return(ag); }
public List <RNCromosoma> Crossover() { List <RNCromosoma> epochPopulation = new List <RNCromosoma>(); RNCromosoma a, b; for (int i = 0; i < (RNManager.instance.Ships.Count - eliteSurvivors) / 2; i++) { a = Roulette(); b = Roulette(); RNCromosoma child1 = new RNCromosoma(); RNCromosoma child2 = new RNCromosoma(); List <RNGen> a1 = new List <RNGen>(); List <RNGen> a2 = new List <RNGen>(); List <RNGen> b1 = new List <RNGen>(); List <RNGen> b2 = new List <RNGen>(); int pivot = Random.Range(0, a.cromosoma.Count); for (int j = 0; j < pivot; j++) { a1.Add(a.cromosoma[j]); } for (int j = pivot; j < a.cromosoma.Count; j++) { a2.Add(a.cromosoma[j]); } for (int j = 0; j < pivot; j++) { b1.Add(b.cromosoma[j]); } for (int j = pivot; j < b.cromosoma.Count; j++) { b2.Add(b.cromosoma[j]); } for (int j = 0; j < a.cromosoma.Count; j++) { a.cromosoma[j].IntentarMutar(); } for (int j = 0; j < b.cromosoma.Count; j++) { b.cromosoma[j].IntentarMutar(); } child1.CambiarCromosoma(a1, b2); child2.CambiarCromosoma(b1, a2); epochPopulation.Add(child1); epochPopulation.Add(child2); } return(epochPopulation); }
public void InicializarAgent() { brain = new RNRedNeuronal(inputs, outputs, hiddenLayers, neuronasPorLayer, pendiente); brain.CrearRedNeuronal(); cromosoma = brain.ObtenerPesos(); _rg = GetComponent <Rigidbody>(); inputList = new List <float>(); outputList = new List <float>(); }
public void SetearPesos(RNCromosoma nuevosPesos) { int tmp = 0; for (int i = 0; i < layers.Count; i++) { for (int j = 0; j < layers[i].neuronasCount; j++) { for (int k = 0; k < layers[i].neuronas[j].pesos.Count; k++) { layers[i].neuronas[j].pesos[k] = nuevosPesos.cromosoma[tmp].peso; tmp++; } } } }
public RNCromosoma ObtenerPesos() { RNCromosoma _pesos = new RNCromosoma(); for (int i = 0; i < layers.Count; i++) { for (int j = 0; j < layers[i].neuronasCount; j++) { for (int k = 0; k < layers[i].neuronas[j].pesos.Count; k++) { _pesos.cromosoma.Add(new RNGen(layers[i].neuronas[j].pesos[k])); } } } return(_pesos); }
public void ActualizarCromosoma(RNCromosoma newCromosoma) { cromosoma = newCromosoma; ActualizarPesos(); }