4.20 SYSTEM ENGINEERING
4.20.3 Railway System Engineering
48
Cada cromosoma aporta una solución potencial al problema a resolver. De todos modos, esta solución no tiene el mismo grado de relevancia. Le corresponde a la función de performance (fitness) medir la eficacia para permitir al AG de hacer evolucionar a la población en beneficio de encontrar la mejor solución. Dicho de otro modo, la función de performance f
debe poder atribuir a cada individuo un indicador positivo representando su pertinencia para el problema que se busca resolver.En nuestro caso de estudio, el valor de la función objetivo
g I g
c g
puede ser utilizado directamente porque los valores necesarios para su estimación se encuentran. De manera más general.Definición 2. Performance – fitness – de una secuencia. Representamos la performance de una secuencia A por una función positiva, f A: f A
R.En el caso de una codificación binaria, la función de performance debe afectar un valor positivo en la codificación correspondiente (fenotipo) a cada cadena binaria (genotipo):
A 0,1 ,l f d A R . La función de un algoritmo genético es entonces simplemente
encontrar la cadena que maximiza esta función f. Evidentemente en el caso de una codificación binaria, cada problema particular necesitará sus propia función d y f.
Una vez que la performance de cada individuo en la población actual es evaluada, los mecanismos evolutivos entran en juego para proceder a la exploración del espacio de valores. Los operadores del AG intentar imitar estos mecanismos.
49
3.3.3.1 Beneficios directos
Los beneficios directos se obtienen de evaluar la información directa obtenida y el costo directo de la conexión del nodo i al nodo j. En ese sentido, la fuente básica de información de las conexiones directas es la propia matriz de adyacencia. Si el nodo i (fila i de la matriz de adyacencia) presenta en la columna j un 1 en su matriz de adyacencia entonces el nodo i accede a la información que posee el nodo j y paga un costo de una unidad de conexión.
3.3.3.2 Beneficios indirectos
Para calcular la acumulación de costos indirectos debe conocerse que recorrido realizó la información para poder tasar el costo de transporte de la misma desde el origen, pasando por todos los destinos intermedios hasta llegar al destino final. Para ello se requiere, en términos de teoría de grafos, calcular la clausura transitiva del grado dirigido (no dirigido). Esta clausura transitiva indica todos los caminos de menor recorrido que unen a un origen con su destino. Una de las formas de estimar la clausura transitiva de una matriz de adyacencia es utilizando el algoritmo de Floyd-Warshall, procedimiento que fue adoptado en este trabajo (ver Apéndice). Para el Ejemplo 1 la matriz de clausura transitiva 1
T A se aprecia a continuación. 1 1 2 1 1 1 2 0 1 0 1 3 4 0 1 3 4 T A
Por ejemplo, el camino mínimo entre el nodo 3 y el nodo 4 es de 3. Es decir, la información debe pasar tres nodos antes de llegar finalmente desde el nodo 3 al nodo 4. El Código Netlogo 5, a continuación, presenta el extracto del código utilizado para calcular los beneficios directos e indirectos de los nodos de cada matriz utilizados para los modelos basados en Bala y Goyal (2000) y Larrosa y Tohmé (2003b). Las entradas para los códigos son
50
el número de nodos (num-nodes), el vector de conexiones individual (genome) derivado de
la matriz de adyacencia, el vector de información indirecta (indirect-info) que se deriva
de la matriz de alcanzabilidad (Floyd-Warshall) y la tasa de decaimiento de la información (rate-of-decay). El Apéndice 2 al final desarrolla el algoritmo de Floyd-Warshall
implementado en este trabajo.
Código Netlogo 5. Procedimiento de cálculo de beneficios (fitness) para modelos de formación de red basado en Bala y Goyal (2000) y Larrosa y Tohmé (2003b, 2005)
Entrada: genome (lista de conexiones de cada nodo), indirect-info (lista de clausura transitiva de cada nodo), rate-of-decay (tasa de decaimiento de la información), own-information (valor de la información poseía por cada agente, estandarizada a 1) y ratio-info-edge (determina el valor relativo de la información respecto al costo de conexión);
Salida: profits (definido como el valor de toda la información de toda la sociedad menos los costos sociales de conexión)
to calculate-profits
;; Procedimiento delegado a los nodos dado que se utilizan variables de su dominio ask nodes [
set direct-edging-costs 0
set direct-information own-information set indirect-information 0
set indirect-edging-costs 0 set net-direct-benefit 0 set net-indirect-benefit 0 set profits 0
set edge-cost own-information / ratio-info-edge ]
;; itero sobre los nodos y les inquiero sobre sus costos y beneficios de información “directos” let j 0
let k 0
while [j < num-nodes] [set k 0
while [k < num-nodes]
[ask node j [if (item k genome = 1)
[ifelse decay [set direct-information direct-information + (rate-of-decay * [own- information] of node k)]
[set direct-information direct-information + [own-information] of node k] set direct-edging-costs direct-edging-costs + edge-cost ]
set k k + 1] ] set j j + 1]
;; se itera sobre los nodos y se les pregunta por sus costos e información "indirectos" set j 0
set k 0
51
[set k 0
while [k < num-nodes]
[ask node j [ifelse (item k indirect-info > 0) [ifelse decay
[set indirect-information indirect-information + ([direct-information] of node k * (rate-of-decay ^ item k indirect-info))]
[ set indirect-information indirect-information + [direct-information] of node k] set indirect-edging-costs indirect-edging-costs + (item k indirect-info * edge-cost)] [ set indirect-information indirect-information
set indirect-edging-costs indirect-edging-costs] set k k + 1]]
set j j + 1] ask nodes [
if edge-Cost-Structure = "direct cost direct info" [set indirect-information 0 set indirect-edging-costs 0] if edge-Cost-Structure = "direct cost indirect info" [set indirect-edgeing-costs 0]
if edge-Cost-Structure = "indirect cost direct info" [set indirect-information 0]
if edge-Cost-Structure = "indirect cost indirect info" []
]
;; Ahora sumamos todos los ingresos y costos individuales para obtener el beneficio social set net-direct-benefit sum [direct-information] of nodes - sum [direct-edging-costs] of nodes set net-indirect-benefit sum [indirect-information] of nodes -
sum [indirect-edging-costs] of nodes
set profits precision (net-indirect-benefit + net-direct-benefit) 3 end
El Código Netlogo 6 hace lo propio para los modelos de Goyal y Joshi (2003) y Billand y Bravard (2005).
Código Netlogo 6. Procedimiento de cálculo de beneficios (fitness) para modelos de formación de red basado en Goyal y Joshi (2003) y Billand y Bravard (2005)
Entrada: alpha, gamma, gamma_0, phi, num-nodes (variables definidas en la definición formal de cada modelo);
Salida: profits (definido como el valor de la suma todos la beneficios individuales de todas las firmas)
to calculate-profits
;; Procedimiento delegado a los nodos dado que se utilizan variables de su dominio set production 0
set profits 0 set q2 0
;; Sumo todos los nodos realizados por todos las firmas para saber después el n-i let i 0
52
while [i < num-nodes][
set sum-genome sum-genome + sum [genome] of node i set i i + 1
]
;; Cumplo con la condición de producción positiva let h 0
set condition-positive-production ((alpha - gamma_0) - gamma * (num-nodes - 1) ^ 2) ;; recorro todos los nodos para determinar cuánto producen de acuerdo a la función de ;; producción del paper.
while [h < num-nodes] [
ifelse condition-positive-production < 0 [set production 0]
[set production production + ((alpha - gamma_0) + ((gamma * num-nodes * sum [genome] of node h) - (gamma * (sum-genome - sum [genome] of node h))) / (num-nodes + 1))]
set q2 q2 + ((alpha - gamma_0) + ((gamma * num-nodes * sum [genome] of node h) - (gamma * (sum-genome - sum [genome] of node h))) / (num-nodes + 1)) ^ 2
set profits profits + precision (production ^ 2 - (phi * sum [genome] of node h)) 1 set h h + 1
]
;; Calculo los valores críticos para las topologías óptimas
set g_c (gamma * num-nodes) * ((2 * (alpha - gamma_0) - (gamma * num-nodes * (num-nodes - 3))) / ((num-nodes + 1) ^ 2)) ;; valores criticos para red completa
set g_e (gamma * num-nodes) * ((2 * (alpha - gamma_0) + (gamma * num-nodes * (num-nodes + 1))) / ((num-nodes + 1) ^ 2)) ;; valores criticos para red vacía
set gamma_critical (alpha - gamma_0) / (num-nodes - 1) ^ 2 end
Otro indicador de performance del algoritmo será el indicador de densidad de red. El mismo se define como la proporción de enlaces realizados sobre el total de enlaces potencialmente realizables.
Hay dos indicadores de densidad de red empleados en este trabajo. Para grafos dirigidos:
1
i G i i N g D n n Y para grafos no dirigidos es:
2 1 i G i i N g D n n 53