2017-08-17 3 views
-1

Je m'excuse d'avance pour la simplicité de la réponse à cette question, je suis très nouveau sur netlogo et très hors de ma profondeur. J'essaie de lire une température de l'eau à partir d'un fichier et par conséquent, mes tortues meurent/se reproduisent en fonction de la température. J'ai enfin le fichier à lire, et j'ai défini la température de l'eau comme une variable globale, mais je suis maintenant coincé sur la partie comparaison. Cela ne me laissera pas comparer la variable à un nombre parce que je pense que la variable est une liste. Le message d'erreur suivant apparaît;Netlogo comparant la liste des variables globales aux nombres

The > operator can only be used on two numbers, two strings, or two agents of the same type, but not on a list and a number. 
error while turtle 7 running > 
    called by procedure REPRODUCE 
    called by procedure GO 
    called by Button 'go' 

Le code est ci-dessous;

globals [ year 
    month 
water-temperature ] 
extensions [ csv ] 


to setup 
    ca 
    load-data 
    create-turtles 50 
    [ set size 1 
    set color red 
    setxy random-xcor random-ycor ] 
    reset-ticks 
end 

to go 
    ask turtles [ move 
    reproduce ] 
    run-temperature 
end 

to load-data 
    file-close-all 
    file-open "C:\\Users\\Hannah\\Documents\\Summer research project\\test3.csv" 
end 

to run-temperature 
    file-close-all 
    file-open "C:\\Users\\Hannah\\Documents\\Summer research project\\test3.csv" 
    while [ not file-at-end? ] [ 
    set water-temperature csv:from-row file-read-line 
    tick ] 
    file-close 
end 

to move 
rt random 50 
    lt random 50 
    fd 1 
end 

to reproduce 
    if water-temperature > 35 [ die ] 
    if water-temperature > 30 and water-temperature < 34 [ hatch 1 rt random-float 360 fd 1 ] 
    if water-temperature > 25 and water-temperature < 29 [ hatch 2 rt random-float 360 fd 1 ] 
    if water-temperature > 20 and water-temperature < 24 [ hatch 3 rt random-float 360 fd 1 ] 
end 

Je serais tellement reconnaissant pour toute aide!

Merci de

Hannah

Répondre

2

Bienvenue sur Stack Overflow. Pouvez-vous s'il vous plaît fournir un exemple des premières lignes de votre fichier "test3.csv"? Cela vous aidera à trier votre question - si vous avez un en-tête ou plusieurs colonnes qui pourraient causer vos problèmes - plusieurs colonnes pourraient être lues en tant que liste. De même, je pense que vous voulez file-read au lieu de file-read-line.

Quelques autres choses - votre procédure load-data est inutile pour autant que je sache (vous avez seulement besoin que le chargement se produise en run-temperature).

Plus important encore, votre bon code dit maintenant quelque chose comme: «Toutes les tortues, se déplacer et se reproduire Maintenant, lisez la toute la ligne de fichiers de température par ligne. » Le problème est que votre instruction while dit "jusqu'à ce que vous ayez atteint la fin du fichier, lisez une ligne, cochez et passez à la suivante". De plus, votre modèle va tick une fois par ligne, sans que les tortues ne fassent quoi que ce soit - il est probablement plus simple d'avoir votre tick à la toute fin de votre procédure go. Il est préférable d'éviter l'utilisation de while dans votre procédure go dans ce scénario, car il bouclera jusqu'à ce que la condition while soit satisfaite.

Il peut être plus facile de lire simplement l'ensemble de votre test.csv et de le stocker dans une variable pour en faciliter l'accès. Voici un exemple. En utilisant cette configuration:

globals [ 
    water-temperature 
    water-temperature-list 
] 

to setup 
    ca 
    crt 50 [ 
    setxy random-xcor random-ycor 
    ] 

Tout d'abord, dites à Netlogo water-temperature-list est une liste utilisant set et []. Ensuite, faites le même fichier fermer/ouvrir comme avant pour préparer votre fichier à lire. Ensuite, utilisez une boucle while semblable à lire vos températures en water-temperature-list, en utilisant lput:

set water-temperature-list [] 

    file-close-all 
    file-open "test3.csv" 
    while [ not file-at-end? ] [ 
    set water-temperature-list lput file-read water-temperature-list 
    ] 
    file-close-all 
    reset-ticks 
end 

Maintenant votre modèle plus simplement accéder à ces valeurs, car elles sont stockées dans une variable de modèle directement. Vous pouvez facilement utiliser la valeur ticks avec item comme index pour cette liste. Par exemple, cochez 0, le premier élément de la liste sera accédé, cochez 1 le deuxième élément, et ainsi de suite.Par exemple:

to go 
    set water-temperature item ticks water-temperature-list 

    ask turtles [ 
    if water-temperature > 30 [ 
     die 
    ] 
    if water-temperature <= 30 [ 
    rt random 60 
    fd 1 
    ] 
    ] 
    tick 
end 

Notez que cette configuration une fois que vous arrivez à la fin de vos températures, il y aura une erreur vous indiquant que Netlogo ne peut pas trouver la liste suivante element- vous devrez mettre un arrêter la condition quelque part pour empêcher cela.

Je sais que c'est une alternative à votre approche mais j'espère que c'est utile. Pour un autre exemple similaire mais plus compliqué, consultez ce model by Uri Wilensky.