asm
Class BFagent

asm.Agent
  |
  +--asm.BFagent

public class BFagent
extends Agent

Title: BFgent

Description: El BFagent--"bitstring forecasting agent" es la piezacentral del modelo de ASM. El agente compite en una bolsa de valores, él compra, vende. Decide comprar o vender haciendo predicciones sobre lo que es probable que el precio de la acción haga en el futuro. Para hacer las predicciones, guarda una lista grande de forecasters disponible, y cada forecaster hace una predicción del precio. Estas previsiones que se crean en la subclase de BFCast son entidades bastante sofisticadas, ellos pueden supervisar muchas condiciones diferentes del mundo. Se usa el mejor forecaster que tiene en el registro en un momento dado para predecir el precio futuro que a su vez lleva a la decisión del buy/sell.

La estructura de los agentes esta formada por varias clases. BFParams es una clase que guarda valores de los parámetros por BFagents, y BFCast es donde se guardan los forecasters. BFCast, a su vez, guarda su bits de las condiciones en la subclase llamado BitVector.

Si usted profundiza en el código de este agente, encontrará una cosa confusa. Este código y artículos basados en él usan el término "bit" para referirse a algo que puede valer 0, 1, o 2. "0 significa no importa", 1 significa "NO" y 2 significa "SÍ." La confusión está en que se necesitan dos bits para representar esta cantidad de información.

En el binario, los valores sería {00,01,10}, respectivamente, pero teniendo esto claro no hay problema. En cualquier caso en el código, como comentario, estan desarrollados varios puntos a tener en cuanta para seguir el funcionamiento de la clase

Copyright:

Depto.Organización Industrial. Universidad de Valladolid

Version:
1.0
Author:
José Manuel Galán & Luis R. Izquierdo

Field Summary
 java.util.LinkedList activeList
          Una lista enlazada de Java, ( en la versión de Objective-C es un Swarm array) que mantiene los forecast activos
 double avspecificity
          specificity media de los forecasters activos
 int currentTime
          El agente verifica regularmente Swarm para ver qué hora es
 double divisor
          Coeficiente usado para calcular la demanda de acciones.
 java.util.LinkedList fcastList
          Una lista enlazada de Java, ( en la versión de Objective-C es un Swarm array) que mantiene los forecast que el agente usa
 double forecast
          predicción del precio de la acción:(trialprice+dividend)*pdcoeff + offset.
 int gacount
          ¿Cuántas veces se ha utilizado el algoritmo genético?
 double global_mean
          price+dividend
 int lastgatime
          Último periodo de tiempo en el que funciono el algoritmo genético
 double lforecast
          valor del forecast del periodo anterior
(package private) static double minstrength
           
 double offset
          Coeficiente usado en la prediciión del precio de la acción, recalculado en cada periodo en prepareForTrading
 java.util.LinkedList oldActiveList
          Una lista enlazada de Java, ( en la versión de Objective-C es un Swarm array) que mantiene los forecast que el agente usó en el periodo anterior
(package private) static BFParams params
          Copia de cada agente de los parámetros
 double pdcoeff
          Coeficiente usado en la prediciión del precio de la acción, recalculado en cada periodo en prepareForTrading
 BFParams privateParams
          El objeto BFParams mantiene los parámetros del objeto
 double realDeviation
          ftarget-lforecast: ¿Cómo de lejos estuvo la predicción del agente
 double variance
          Una media móvil exponencial con pesos de la varianza histórica del agente: combina la varianza anterior con la desviación al cuadrado:bv*variance + av*deviation*deviation
 double WEIGHTED
           
 World worldForAgent
          Copia del mundo para cada agente
 
Fields inherited from class asm.Agent
cash, demand, dividend, initialcash, intrate, intratep1, mincash, minholding, myID, position, price, profit, wealth
 
Constructor Summary
(package private) BFagent(swarm.defobj.Zone aZone)
           
 
Method Summary
 boolean changeIntToBoolean(int a)
          Función auxiliar que hemos creado para pasar de un entero aun valor boolean, ya que en Java sólo se entienden estos en expresiones lógicas
 BitVector collectWorldData(swarm.defobj.Zone aZone)
          Un forecast tiene una serie de condiciones a las que mira.
 java.lang.Object copyList$To(java.util.LinkedList list, java.util.LinkedList outputList)
          Método implemetado para copiar de una lista enlazada de JAVA a otra
 BFCast CopyRule$From(BFCast to, BFCast from)
          Este es un método que copia las variables de instancia de un objeto forecast a otro.
 BFCast createNewForecast()
          Crea una nueva forecast ( instancia de BFCast), con todos los bits de condición puestos a 00, significando "no importa".
 BFCast Crossover$Parent1$Parent2(BFCast newForecast, BFCast parent1, BFCast parent2)
          Crossover en los bits de condición, Crossover() utiliza un crossover uniforme, cada bit es elegido aleatoriamente de un padre u otro.
 double drand()
          Método implementado para obtener nºs aleatorios uniformes[0,1]
 java.lang.Object feedForward()
          Actualmente no hace nada, sólo se usa en ANNagentes ( basados en redes neuronales)
 void Generalize$AvgStrength(java.util.LinkedList list, double avgstrength)
          Generalize Generalize busca reglas que no han sido empleadas durante "longtime" y las hace más generales cambiando aleatoriamente 0´s y 1´s a "no importa".
 double getDemandAndSlope$forPrice(double slope, double trialprice)
          Devuelve la demanda ( si > 0) u oferta (si < 0) usando la "mejor" forecast elegida en -prepareForTrading.
 double getDeviation()
          Devuelve el valor absoluto de realDeviation
 java.lang.Object getInputValues()
          Actualmente no hace nada, sólo se usa en ANNagentes ( basados en redes neuronales)
 BFCast GetMort$Rejects(BFCast new2, java.util.LinkedList rejects)
          GetMort() selecciona uno de las forecast más débiles de npool para reemplazar con una nueva regla generada.
 double getRealForecast()
          Devuelve el forecast del agente
static void init()
          Es vital configurar los valores en la clase de los forecast, BFCast, el cual a su vez inicializa la clase BitVector
 java.lang.Object initForecasts()
          Crea los Objetos BFCast (forecast) y los pone en la lista llamada fCastList.
 int irand(int x)
          Método implementado para obtener nºs aleatorios uniformes[0,x-1]
 int lastgatime()
          Devuelve la última vez que se uso el Algoritmo Genético
 void MakePool$From(java.util.LinkedList rejects, java.util.LinkedList list)
          Dada una lista de forecasts, encuentra las peores y las pone en el grupo de rechazables.
 boolean Mutate$Status(BFCast new2, boolean changed)
          Mutate Para los bits de condición, Mutate() mira cada bit con probabilidad pmutation.
 int nbits()
          Devuelve "condbits" de parameters: el número de bits de condición que son monitorizados en world o 0 si no hay ninguno
 int nrules()
          Devuelve el nº de forecasts que estan siendo usados.
 java.lang.Object performGA()
          Hace funcionar el Algoritmo Genético.
 java.lang.Object prepareForTrading()
          Prepara una nueva lista activa de los forecast activos del agente, y calcula los coeficientes pdcoeff y offset en la ecuación forecast = pdcoeff*(trialprice+dividend) + offset La lista activa de todos los forecast que coinciden con las presentes condiciones es salvada para posteriores actualizaciones
static void setBFParameterObject(BFParams x)
          Este método le dice a BFagentes donde mirar para conseguir los parámetros por defecto.
 java.lang.Object setConditionsRandomly(BFCast fcastObject)
          Coge un objeto forecast y aleatoriamente cambia los bits que lo componen.
 BFCast Tournament(java.util.LinkedList list)
          Tournament
 void TransferFcastsFrom$To$Replace(java.util.LinkedList newList, java.util.LinkedList forecastList, java.util.LinkedList rejects)
          TransferFcasts
 java.lang.Object updateActiveList(BitVector worldvalues)
          Este es el bucle principal al que sometemos a los forecasts.
 java.lang.Object updatePerformance()
          Ahora actualizamos la varianza y la fuerza de todas las forecasts que estaban activas en el periodo anterior, ahora que sabemos como han funcionado.
 java.lang.Object updateWeights()
          Actualmente no hace nada, sólo se usa en ANNagentes ( basados en redes neuronales)
 double urand()
          Método implementado para obtener nºs aleatorios uniformes[-1,1]
 
Methods inherited from class asm.Agent
constrainDemand, creditEarningsAndPayTaxes, getAgentPosition, getCash, getDividendFromWorld, getPriceFromWorld, getWealth, setID, setInitialCash, setInitialHoldings, setintrate, setminHolding$minCash, setPosition, setWorld
 

Field Detail

currentTime

public int currentTime
El agente verifica regularmente Swarm para ver qué hora es

lastgatime

public int lastgatime
Último periodo de tiempo en el que funciono el algoritmo genético

avspecificity

public double avspecificity
specificity media de los forecasters activos

forecast

public double forecast
predicción del precio de la acción:(trialprice+dividend)*pdcoeff + offset.

lforecast

public double lforecast
valor del forecast del periodo anterior

global_mean

public double global_mean
price+dividend

realDeviation

public double realDeviation
ftarget-lforecast: ¿Cómo de lejos estuvo la predicción del agente

variance

public double variance
Una media móvil exponencial con pesos de la varianza histórica del agente: combina la varianza anterior con la desviación al cuadrado:bv*variance + av*deviation*deviation

pdcoeff

public double pdcoeff
Coeficiente usado en la prediciión del precio de la acción, recalculado en cada periodo en prepareForTrading

offset

public double offset
Coeficiente usado en la prediciión del precio de la acción, recalculado en cada periodo en prepareForTrading

divisor

public double divisor
Coeficiente usado para calcular la demanda de acciones. Es proporcional a lambda y ala precisión de los forecasters

gacount

public int gacount
¿Cuántas veces se ha utilizado el algoritmo genético?

privateParams

public BFParams privateParams
El objeto BFParams mantiene los parámetros del objeto

fcastList

public java.util.LinkedList fcastList
Una lista enlazada de Java, ( en la versión de Objective-C es un Swarm array) que mantiene los forecast que el agente usa

activeList

public java.util.LinkedList activeList
Una lista enlazada de Java, ( en la versión de Objective-C es un Swarm array) que mantiene los forecast activos

oldActiveList

public java.util.LinkedList oldActiveList
Una lista enlazada de Java, ( en la versión de Objective-C es un Swarm array) que mantiene los forecast que el agente usó en el periodo anterior

worldForAgent

public World worldForAgent
Copia del mundo para cada agente

WEIGHTED

public final double WEIGHTED

params

static BFParams params
Copia de cada agente de los parámetros

minstrength

static double minstrength
Constructor Detail

BFagent

BFagent(swarm.defobj.Zone aZone)
Method Detail

drand

public final double drand()
Método implementado para obtener nºs aleatorios uniformes[0,1]
Returns:
double

urand

public final double urand()
Método implementado para obtener nºs aleatorios uniformes[-1,1]
Returns:
double

irand

public int irand(int x)
Método implementado para obtener nºs aleatorios uniformes[0,x-1]
Parameters:
x -  
Returns:
double

setBFParameterObject

public static void setBFParameterObject(BFParams x)
Este método le dice a BFagentes donde mirar para conseguir los parámetros por defecto. Debe dar al agente un objeto de la clase BFParams
Parameters:
x -  

init

public static void init()
Es vital configurar los valores en la clase de los forecast, BFCast, el cual a su vez inicializa la clase BitVector

initForecasts

public java.lang.Object initForecasts()
Crea los Objetos BFCast (forecast) y los pone en la lista llamada fCastList. Este es el punto principal de la funcionalidad del agente, ya que son continuamente actualizados, mejorados y probados. Conviene notar que cada agente tiene una copia de los parámetros llamada privateParams. Esto podría ser usado para individualizar los parámetros en versiones posteriores.
Returns:
this

createNewForecast

public BFCast createNewForecast()
Crea una nueva forecast ( instancia de BFCast), con todos los bits de condición puestos a 00, significando "no importa". Tambien configura el resto de los valores de los coeficientes dentro de BFCast. A este método se accede desde varios puntos dentro de BFagent.
Returns:
aForecast

setConditionsRandomly

public java.lang.Object setConditionsRandomly(BFCast fcastObject)
Coge un objeto forecast y aleatoriamente cambia los bits que lo componen.
Parameters:
fcastObject -  
Returns:
this

prepareForTrading

public java.lang.Object prepareForTrading()
Prepara una nueva lista activa de los forecast activos del agente, y calcula los coeficientes pdcoeff y offset en la ecuación forecast = pdcoeff*(trialprice+dividend) + offset La lista activa de todos los forecast que coinciden con las presentes condiciones es salvada para posteriores actualizaciones
Overrides:
prepareForTrading in class Agent
Returns:
this

collectWorldData

public BitVector collectWorldData(swarm.defobj.Zone aZone)
Un forecast tiene una serie de condiciones a las que mira. Estas se almacenan en un BitVector. Necesitamos poner los datos del mundo de la misma manera para poder comparar fácilmente. Para chequear más rápidamente las condiciones, creamos entonces un BitVector donde almacenamos las condiciones del mundo que estan siendo monitorizadas. Esto requiere asumir como condición de diseño que todos los forecast de los agentes han de tener la misma lista de bits
Parameters:
aZone -  
Returns:
world

changeIntToBoolean

public boolean changeIntToBoolean(int a)
Función auxiliar que hemos creado para pasar de un entero aun valor boolean, ya que en Java sólo se entienden estos en expresiones lógicas
Parameters:
a - valor entero
Returns:
boolean

updateActiveList

public java.lang.Object updateActiveList(BitVector worldvalues)
Este es el bucle principal al que sometemos a los forecasts. Vamos a través de los forecasts, comparandolos con las del mundo. Aquí al principio del bucle comprobamos como de grande es el bitvector (condwords).
Parameters:
worldvalues -  
Returns:
this

getInputValues

public java.lang.Object getInputValues()
Actualmente no hace nada, sólo se usa en ANNagentes ( basados en redes neuronales)
Returns:
this

feedForward

public java.lang.Object feedForward()
Actualmente no hace nada, sólo se usa en ANNagentes ( basados en redes neuronales)
Returns:
this

getDemandAndSlope$forPrice

public double getDemandAndSlope$forPrice(double slope,
                                         double trialprice)
Devuelve la demanda ( si > 0) u oferta (si < 0) usando la "mejor" forecast elegida en -prepareForTrading. Este valor es dado así: forecast = pdcoeff*(trialprice+dividend) + offset donde pdcoeff y offset también son dados en -prepareForTrading. También calculamos "slope" como la pendiente de la función de demanda resultante.( sin más que derivar la función de demanda)
Overrides:
getDemandAndSlope$forPrice in class Agent
Parameters:
slope -  
trialprice -  
Returns:
demand

getRealForecast

public double getRealForecast()
Devuelve el forecast del agente
Returns:
forecast

updatePerformance

public java.lang.Object updatePerformance()
Ahora actualizamos la varianza y la fuerza de todas las forecasts que estaban activas en el periodo anterior, ahora que sabemos como han funcionado. Este método actualiza la información del precio y del dividendo del mundo. Mide lo lejos que estuvo la previsión de la realidad, y actualiza la varianza del forecast. Aquí se actualiza la varianza( mediante media movil exponencial con pesos) de cada uno de los forecasts de la active list. En el código hay una descripción de como se halla la strength de cada forecast.
Overrides:
updatePerformance in class Agent
Returns:
this

getDeviation

public double getDeviation()
Devuelve el valor absoluto de realDeviation
Returns:
double

updateWeights

public java.lang.Object updateWeights()
Actualmente no hace nada, sólo se usa en ANNagentes ( basados en redes neuronales)
Returns:
this

nbits

public int nbits()
Devuelve "condbits" de parameters: el número de bits de condición que son monitorizados en world o 0 si no hay ninguno
Returns:
int

nrules

public int nrules()
Devuelve el nº de forecasts que estan siendo usados.
Returns:
numfcasts

lastgatime

public int lastgatime()
Devuelve la última vez que se uso el Algoritmo Genético
Returns:
lastgatime

performGA

public java.lang.Object performGA()
Hace funcionar el Algoritmo Genético. Se basa en los siguientes métodos: 1. MakePool hace una lista de las forecast más débiles: rejectList. Son las "npool" reglas más débiles 2. Se crean "nnew" nuevas reglas. Estas son puestas en la lista llamada newList. Sus configuraciones de bits son tomadas mediante "crossover" (cruce) usando selección por torneo de sus padres o mediante mutación. Ver los métodos Crossover y Mutate para más detalles de fincionamiento. 3. Las nnew nuevas reglas reemplazan a las más viejas que cogimos en el paso 1. Esto se hace mediante el método "TransferFcastsFrom:To:" En este método, no se tiene en cuenta la "strength" para eliminar forecast si no que se eligen dos candicatos de rejectList aleatoriamente y se elige aquel con una cadena de bits mas parecida a la nnew que va a reemplazar. esto mantiene una mayor diversidad de reglas. 4. Generalize busca reglas que no han sido empleadas durante "longtime" y las hace más generales cambiando aleatoriamente 0´s y 1´s a "no importa". Esto se hace independientemente de la fuerza y para todas las reglas. Los métodos que se encargan de este trabajo son los siguientes: public BFCast CopyRule$From( BFCast to , BFCast from) public void MakePool$From (LinkedList rejects , LinkedList list) public boolean Mutate$Status (BFCast new2 , boolean changed) public BFCast Crossover$Parent1$Parent2( BFCast newForecast , BFCast parent1 , BFCast parent2) public void TransferFcastsFrom$To$Replace( LinkedList newList , LinkedList forecastList , LinkedList rejects) public BFCast GetMort$Rejects( BFCast new2 , LinkedList rejects) public void Generalize$AvgStrength( LinkedList list , double avgstrength) Lista de parámetros: npool--Tamaño del grupo de reglas más débiles con posibilidades de ser reemplazadas; Se especifica como una fracción de numfcasts mediante el parámetro "poolfrac" nnew --Número de nuevas reglas producidas. Se especifica como una fracción de numfcasts mediante el parámetro "newfrac" pcrossover--probabilidad de funcionamiento de Crossover plinear-- linear combination "crossover" prob. prandom-- random from each parent crossover prob. pmutation -- per bit mutation prob. plong -- long jump prob. pshort -- short (neighborhood) jump prob. nhood -- size of neighborhood longtime -- generalize si la regla no se ha utilizado durante este tiempo genfrac -- fracción de 0/1 que se pasan a "no importa" en generalize
Returns:
this

CopyRule$From

public BFCast CopyRule$From(BFCast to,
                            BFCast from)
Este es un método que copia las variables de instancia de un objeto forecast a otro. No se copia sólamente el bitvector, si no también la fuerza, la varianza specFactor, especificidad....
Parameters:
to -  
from -  
Returns:
BFCast

MakePool$From

public void MakePool$From(java.util.LinkedList rejects,
                          java.util.LinkedList list)
Dada una lista de forecasts, encuentra las peores y las pone en el grupo de rechazables.
Parameters:
rejects -  
list -  

Tournament

public BFCast Tournament(java.util.LinkedList list)
Tournament
Parameters:
list -  
Returns:
BFCast

Mutate$Status

public boolean Mutate$Status(BFCast new2,
                             boolean changed)
Mutate Para los bits de condición, Mutate() mira cada bit con probabilidad pmutation. Si se cambia, se hace con las siguientes probabilidades: 0 -> * with probability 2/3, 1 with probability 1/3 1 -> * with probability 2/3, 0 with probability 1/3 * -> 0 with probability 1/3, 1 with probability 1/3, unchanged with probability 1/3 POSIBILIDAD DE CONFUSION:los valores cambian así: 0 1 1/3 2 1/3 1 0 2/3 2 1/3 2 0 2/3 1 1/3 Para los parámetros de predicción, Mutate() debe de hacer una de estas dos cosas, independientemente de los parámetros. 1. "Long jump": el parámetro es elegido aletoriamente entre min-max range 2. "Short jump": el parámetro es elegido aletoriamente entre una distribución uniforme de rango oldvalue-nhood*range a oldvalue+nhood*range, donde range = max-min. El método 1 se ejecuta con probabilidad plong, el método 2 con probabilidad pshort, y se dejan los parámetros sin cambiar con probabilidad 1-plong-pshort. Se devuelve YES si se han producidos cambios, y NO si no se han producido.
Parameters:
new2 -  
changed -  
Returns:
boolean

Crossover$Parent1$Parent2

public BFCast Crossover$Parent1$Parent2(BFCast newForecast,
                                        BFCast parent1,
                                        BFCast parent2)
Crossover en los bits de condición, Crossover() utiliza un crossover uniforme, cada bit es elegido aleatoriamente de un padre u otro. Para los parámetros de predicción, Crossover() hace una de estas tres cosas: 1. Elige una combianción lineal de los parámetros de los padres con pesos según strength 2. Elige cada parámetro aleatoriamente de cada padre 3. Elige unos de los parámetros de uno de los padres ( o todos de uno o todos de otro) Se utiliza el método 1 con probabilidad plinear, método 2 con probabilidad prandom, método 3 con probabilidad 1-plinear-prandom.
Parameters:
newForecast -  
parent1 -  
parent2 -  
Returns:
newForecast

TransferFcastsFrom$To$Replace

public void TransferFcastsFrom$To$Replace(java.util.LinkedList newList,
                                          java.util.LinkedList forecastList,
                                          java.util.LinkedList rejects)
TransferFcasts
Parameters:
newList -  
forecastList -  
rejects -  

GetMort$Rejects

public BFCast GetMort$Rejects(BFCast new2,
                              java.util.LinkedList rejects)
GetMort() selecciona uno de las forecast más débiles de npool para reemplazar con una nueva regla generada. En este método, no se tiene en cuenta la "strength" para eliminar forecast si no que se eligen dos candicatos de rejectList aleatoriamente y se elige aquel con una cadena de bits mas parecida a la nnew que va a reemplazar. Esto mantiene una mayor diversidad de reglas.
Parameters:
new2 -  
rejects -  
Returns:
aReject

Generalize$AvgStrength

public void Generalize$AvgStrength(java.util.LinkedList list,
                                   double avgstrength)
Generalize Generalize busca reglas que no han sido empleadas durante "longtime" y las hace más generales cambiando aleatoriamente 0´s y 1´s a "no importa". Esto se hace independientemente de la fuerza y para todas las reglas.
Parameters:
list -  
avgstrength -  

copyList$To

public java.lang.Object copyList$To(java.util.LinkedList list,
                                    java.util.LinkedList outputList)
Método implemetado para copiar de una lista enlazada de JAVA a otra
Parameters:
list -  
outputList -  
Returns:
this