kay21
kay21

Reputation: 43

Let agents follow its neighbour but got the error "FACE expected input to be an agent but got NOBODY instead."

I try to move each agents to its related agents (defined by high trust connection and in my view) if there are any such agents, and else move the agent to one of its neighbours. However, I get the error "FACE expected input to be an agent but got NOBODY instead." and I don't know how to solve it. I think the use != nobody might cause the error. Any suggestions on how to solve this?

This is my code:

breed [ persons a-person ]

undirected-link-breed [ connections connection ]
connections-own [ trust ]

persons-own [ neighbours ]

to setup
  clear-all
  create-persons 10
  [ setxy random-xcor random-ycor ]
  setup-connections
  reset-ticks
end

to setup-connections
  ask persons 
  [  
    create-connections-with other persons 
    [ set trust 0.6 ] 
  ]
end

to go
  setNeighbours
  movePersons
  tick
end

to setNeighbours
  ask persons [ set neighbours other persons in-cone 4 360 ]
end

to movePersons
  ask persons
  [
    let highlyRelatedPersons (turtle-set [other-end] of my-out-connections with [trust = 0.6]) in-cone 4 360
    let relatedPersons (turtle-set [other-end] of my-out-connections with [trust = 0.6])
    ifelse any? highlyRelatedPersons
    [ 
      face one-of highlyRelatedPersons
    ]
    [ 
      let weaklyRelatedNeighbour one-of neighbours with [not member? self highlyRelatedPersons] ;select one of my neighbours that is not a highlyRelatedPerson
      ifelse weaklyRelatedNeighbour != nobody
      [
        face weaklyRelatedNeighbour
      ]
      [
        face one-of relatedPersons
      ]
    ]
  ]
end

Upvotes: 2

Views: 56

Answers (1)

LeirsW
LeirsW

Reputation: 2305

You are correct in what is causing the error highlyRelatedPersons is an agentset and while an agentset can be empty, an agentset can never be nobody. one-of highlyRelatedPersons however, will be nobody if the agentset is empty, so you could use ifelse (one-of highlyRelatedPersons != nobody). That said, is easier to just check if the agentset is empty by using any?: ifelse any? highlyRelatedPersons

Your code also never actually creates any links for highlyRelatedPersons and relatedPersons is always empty. This means that the code will always return false on the first ifelse and move on to the second. Generally most turtles will have neighbours they can face, but sometimes there are none so they try to face one-of relatedPersons, which again causes a crash since relatedPersons is an empty agentset.

Upvotes: 1

Related Questions