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>();
    }
Esempio n. 4
0
    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++;
                }
            }
        }
    }
Esempio n. 5
0
    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();
 }