Ver Mensaje Individual
  #6  
Antiguo 27-03-2008
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Reputación: 25
Delphius Va camino a la fama
Buenas, muchos saben que estos temas me dejan "picando" mucho. No me pude resistir y quiero aportar un poco:

Distribución Normal (por aproximación):

1. Parámetros de entrada:
1.1. Media = Mean
1.2. Desvio Estandar = Std
2. Parámetros de salida:
2.1. valor a estimar [reales] = X
3. Algoritmo:

1. sum = 0
2. repetir 12 veces:
2.1. u = Aleatorio()
2.2. sum = sum + u
3. X = (Std * (sum - 6.0)) + Mean;

Distribución Uniforme:
1. Parámetros de entrada:
1.1. Valor inferior = A
1.2. Valor superior = B
2. Parámetros de salida:
2.1. valor a estimar [reales] = X
3. Algoritmo:

1. u = Aleatorio()
2. X = A + u * (B - A)

Distribución Exponencial:
1. Parámetros de entrada:
1.1. Media = Mean
2. Parámetros de salida:
2.2. valor a estimar [reales] = X
3. Algoritmo:

1. u = Aleatorio()
2. X = (-1) * Mean * ln(u)

Por ahora tengo esas, que son las más comunes. Consideré bueno darlas a conocer ya que es algo fácil de obtener y conseguir, el vedadero corazón del problema es el "motor" de los generadores de eventos (si es que se emplea este método) y por consiguiente, el uso de las colas.

Aleatorio() es una función que devuelve un número aleatorio. Como dije antes, lo más común, y optimo, es que existan muchos generadores. Y cada uno por consiguiente devolveré diferentes números, si se programa a dicha función para seguir un único generador el simulador no funcionará correctamente por lo que se deberán programar los algoritmos en función de la cantidad de generadores.

Tal vez hacer que las funciones reciban como parámetro algún identificador del generador, de modo que se podría hacer algo como:

Código Delphi [-]
TiempoLlegada := DistbExpo.GetValue(Media,NroGenerador);

Siendo ahora, posiblemente, tener un DistExpo (una clase que implementa distribución exponencial) como el encargado de pasar el Nro a la función Aleatorio:

Código Delphi [-]
TDistbExpo.GetValue (Mean: real; GeneratorNumber: integer): real;
begin
  result := (-1) * Mean * ln(GeneratorList[GeneratorNumber].GetNumber);
end;

Bueno, para complicarlo alguito... en el ejemplo asumí que GeneratorList es una instancia de un TGeneratorList que tiene como una propiedad vectorial por defecto del tipo TGenerator. Este TGenerator implementa un método GetNumber encargado de devolver un número aletorio según algún algoritmo declarado (por ejemplo, el del un generador multiplicador mixto).

Como consejo, par hacerlo más fácil, separemos el verdadero motor de simulación del problema.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita