运行此代码netlogo时出现以下错误

时间:2015-01-24 19:36:00

标签: netlogo

我的模特 netlogo

globals [ mejor-recorrido
          coste-mejor-recorrido ]
breed [ nodos nodo ]
breed [ hormigas hormiga ]
links-own [ coste
            feromona ]       
hormigas-own [ recorrido
               coste-recorrido ]
to setup
  __clear-all-and-reset-ticks
  set-default-shape nodos "circle"
  ask patches [set pcolor white]
  crea-nodos
  crea-aristas
  crea-hormigas
  set mejor-recorrido camino-aleatorio
  set coste-mejor-recorrido longitud-recorrido mejor-recorrido
end

to crea-nodos
  ask n-of num-nodos patches
  [  
    sprout-nodos 1
    [
      set color blue + 2
      set size 2
      set label-color black
      set label (word "Ciudad-" who)
    ]
  ]
end

to crea-aristas
  ask nodos
  [ 
    create-links-with other nodos
    [
     ; hide-link
      set color red
      set coste link-length 
      set feromona random-float 0.1
    ]
  ]
  ask links [
    if(feromona < 0.05) [die] ]
  let max-coste max [coste] of links
  ask links
  [
    set coste coste / max-coste
  ]
end

to crea-hormigas
  create-hormigas num-hormigas [
    hide-turtle
    set recorrido []
    set coste-recorrido 0
  ]
end

to reset
  ask hormigas [die]
  ask links [
    hide-link
    set feromona random-float 0.1
  ]
  crea-hormigas
  set mejor-recorrido camino-aleatorio
  set coste-mejor-recorrido longitud-recorrido mejor-recorrido  
  clear-all-plots
end

to go
  no-display
  ask hormigas [
    set recorrido generar-recorrido
    set coste-recorrido longitud-recorrido recorrido 
    if coste-recorrido < coste-mejor-recorrido [
      set mejor-recorrido recorrido
      set coste-mejor-recorrido coste-recorrido
    ]
  ]

  actualiza-feromona
  tick
  display
end

to-report camino-aleatorio
  let resp [self] of nodos
  report lput (first resp) resp
end

to-report generar-recorrido
  let origen one-of nodos
  let nuevo-recorrido (list origen)
  let resto-nodos [self] of nodos with [self != origen]
  let nodo-actual origen

  while [not empty? resto-nodos] [
    if (self = origen) [
        ask hormigas [die]
      ]
    let siguiente-nodo elige-siguiente-nodo nodo-actual resto-nodos
    set nuevo-recorrido lput siguiente-nodo nuevo-recorrido
    set resto-nodos remove siguiente-nodo resto-nodos
    set nodo-actual siguiente-nodo
  ]
  set nuevo-recorrido lput origen nuevo-recorrido

  report nuevo-recorrido
end

to-report elige-siguiente-nodo [nodo-actual resto-nodos]
  let probabilidades calcula-probabilidades nodo-actual resto-nodos
  let rand-num random-float 1
  report last first filter [first ? >= rand-num] probabilidades
end

to-report calcula-probabilidades [nodo-actual resto-nodos]
  let pt map [([feromona] of ? ^ alpha) * ((1 / [coste] of ?) ^ beta)]
             (map [arista nodo-actual ?] resto-nodos)
  let denominador sum pt
  set pt map [? / denominador] pt
  let probabilidades sort-by [first ?1 < first ?2]
                             (map [(list ?1 ?2)] pt resto-nodos)
  let probabilidad-normalizada []
  let ac 0
  foreach probabilidades [
    set ac (ac + first ?)
    set probabilidad-normalizada lput (list ac last ?) probabilidad-normalizada
  ]
  report probabilidad-normalizada  
end

to actualiza-feromona
  ;; Evapora la feromona del grafo
  ask links [
    set feromona (feromona * (1 - rho))
  ]
  ask hormigas [
    let inc-feromona (100 / coste-recorrido)
    foreach aristas-recorrido recorrido [
      ask ? [ set feromona (feromona + inc-feromona) ]    
    ]
  ]
end

to-report aristas-recorrido [nodos-recorrido]
  report map [arista (item ? nodos-recorrido)
                     (item (? + 1) nodos-recorrido)] (n-values num-nodos [?])
end

to-report arista [n1 n2]
  report (link [who] of n1 [who] of n2)
end

to-report longitud-recorrido [nodos-recorrido]
  report reduce [?1 + ?2] map [[coste] of ?] (aristas-recorrido nodos-recorrido)
end

1 个答案:

答案 0 :(得分:2)

我添加了

print aristas-recorrido nodos-recorrido

作为to-report longitud-recorrido [nodos-recorrido]之后的第一行。这表明aristas-recorrido nodos-recorrido返回一个列表,其中一些元素为nobody。这就是产生你提到的错误的一条线所处理的。

我认为问题在于aristas-recorrido的定义,

to-report aristas-recorrido [nodos-recorrido]
  report map [arista (item ? nodos-recorrido)
                     (item (? + 1) nodos-recorrido)]
             (n-values num-nodos [?])
end

arista尝试报告列表nodo中后续nodos-recorrido个海龟之间的链接,但某些nodos对没有链接。

在我看来,crea-aristas程序会将每个nodo与其他nodo相关联,但随后会删除feromona < 0.05的链接。之后,并非所有nodos都已关联。由于上面的nodos-recorrido只是nodos的随机排序列表(这是对吗?),nodos的一些对没有关联,因此arista返回{ {1}}而不是某些对的链接。然后这导致nobody中的错误。

(我没有调查产生错误的其他行,但我认为你现在有足够的信息来追踪错误。)