2015-11-28 4 views
2

Мне нужно рассчитать ближайшую черепаху ближайшего соседа в одном патче для всех черепах, ограниченных некоторыми свойствами. Код, который я написал, занимает много времени, и мне интересно, есть ли другой способ его оптимизации. Я определил имущество сосед в черепахе, чтобы сохранить ближайший сосед.Netlogo: Оптимизируйте вычисления соседа-черепахи внутри патча

to set_neighbor 
    ask patches [ 
    ask turtles-here with [ life_stage = "STAGE1" ] [ 
     set neighbor min-one-of other turtles-here with [ life_stage != "STAGE2" ] [ (distance myself) ] 
    ] 
    ] 
end 

Я попытался оптимизировать код, внеся следующие изменения, но в итоге у него появилось больше времени. Я предположил, что если я сохранил результаты запроса в переменной и позже использовал эту переменную, это было бы быстрее, чем выполнение самого запроса несколько раз.

to set_neighbor 
    ask patches [ 
    let turt_temp turtles-here with [ life_stage != "STAGE2" ] 
    ask turtles-here with [ life_stage = "STAGE1" ] [ 
     set neighbor min-one-of other turt_temp [ (distance myself) ] 
    ] 
    ] 
end 

Я бы очень признателен за любые указания по этому вопросу. Заранее спасибо.

ответ

2

Почему у патчей спрашивают черепах? Это должно сделать то же самое, но хороший немного быстрее, особенно если у вас есть много пятен, не имеющих черепах в STAGE1:

to set_neighbor 
    ask turtles with [ life_stage = "STAGE1" ] [ 
    set neighbor min-one-of other turtles-here with [ life_stage != "STAGE2" ] [ (distance myself) ] 
    ] 
end 

Я не уверен, просто глядя, почему ваша вторая реализация была медленнее. Я мог видеть, что это медленнее, если у вас много патчей без черепах в STAGE1 (особенно, если на них много других черепах).

+0

'' '' необходимо для настоящей модели. В этом примере только спрашивают черепах stage1 и выбирают только черепахи stage2. – JenB

+0

Проверка STAGE2 - это неравенство, а не равенство, поэтому оно включает черепахи STAGE1. Таким образом, «другое» необходимо. Хорошо подумать об этом, так как удаление ненужного «другого» ускорит все! –

+0

Хороший момент - я не читал его достаточно внимательно. лучше пойти исправить свой ответ слишком – JenB

0

Другой вариант (и я не могу сказать, что будет быстрее) - это ограничить количество запросов, только делая это, когда на одном патче есть и черепахи stage1, а не (stage2). Я также использовал with-min вместо min-one-of, но снова я не знаю, что быстрее.

to set_neighbor 
    ask patches with [ any? turtles with [ life_stage = "STAGE1" ] and any? turtles with [ life_stage != "STAGE2" ] ] 
    [ ask turtles-here with [ life_stage = "STAGE1" ] 
    [ set neighbor other turtles-here with [ life_stage != "STAGE2" ] with-min [ distance myself ] 
    ] 
    ] 
end 
Смежные вопросы