es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué el ‘np.random.uniform’ en Python es igual en tamaño de población?

Quiero definir una estructura con Python 3.x. Esta estructura es la población inicial, pero no sé por qué en este bucle los números aleatorios son iguales.

import numpy as np
from numpy.lib.shape_base import _dstack_dispatcher
from numpy.random import default_rng

Xmin = -30
Xmax = 30
n = 2
MaxIter = 200
nP = 50
Fc = 0.7
nC = 2 * round(Fc * nP / 2)
Fm = 0.1
nM = round(Fm * nP)
Pi_M = 0.02

empty_ind = {'X': [], 'Cost': [], 'rank': [], 'CD': []}
pop = np.tile(empty_ind, (nP, 1))
for i in range(nP):
    pop[i, 0]['X'] = np.random.uniform(Xmin, Xmax, [1, n])

    def MOP5(a):
        x = a[0, 0]
        y = a[0, 1]

        f1 = 0.5 * (x ** 2 + y ** 2) + np.sin(x ** 2 + y ** 2)
        f2 = (3 * x - 2 * y + 4) ** 2 / 8 + (x - y + 1) ** 2 / 27 + 15
        f3 = 1 / (x ** 2 + y ** 2 + 1) - 1.1 * np.exp(-x ** 2 - y ** 2)
        aa = [f1, f2, f3]
        z = np.reshape(aa, (3, 1))
        return z

    pop[i, 0]['Cost'] = MOP5(pop[i, 0]['X'])
print(pop)

Y este es mi resultado:

[{'X': array([[ 11.65978708, -17.46716958]]), 'Cost': array([[2.21468705e+02],
   [7.31520444e+02],
   [2.26217399e-03]]), 'rank': [], 'CD': []}]
 [{'X': array([[ 11.65978708, -17.46716958]]), 'Cost': array([[2.21468705e+02],
   [7.31520444e+02],
   [2.26217399e-03]]), 'rank': [], 'CD': []}]

Por favor, avíseme por qué los resultados son los mismos.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Los números aleatorios en el bucle pueden ser los mismos debido a que el generador de números aleatorios predeterminado utilizado por numpy, que se basa en el algoritmo Mersenne Twister, es determinista y genera la misma secuencia de números aleatorios cada vez que se ejecuta el código sin especificar una semilla. Para generar diferentes secuencias de números aleatorios cada vez que se ejecuta el código, puedes utilizar la función default_rng de numpy.random para crear una nueva instancia de la clase Generator y luego utilizar ese generador para la generación de todos los números aleatorios en el código. Reemplaza la línea:

    pop[i,0]['X']=np.random.uniform(Xmin,Xmax,[1,n])
    

    con:

    rng = default_rng()
    pop[i,0]['X'] = rng.uniform(Xmin,Xmax,[1,n]) 
    

    Esto debería generar números aleatorios diferentes para cada iteración del bucle.

Comments are closed.