Используйте ненаправленные ссылки вместо направленных ссылок

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

Теперь я пробую разные методы, чтобы уменьшить потребности в вычислениях. Одна из вещей, которая пришла мне в голову, - это объединить все направленные ссылки с неориентированными ссылками и присвоить значение взаимодействия end1 и end2 друг другу как атрибуты ссылок, например end1-end2-Relationship-Value и end2-end1-Relationship-Value и Frequency1 Frequency2. Эта реализация сделает мою модель немного более сложной для отладки, поскольку порядок ссылок будет намного сложнее отслеживать, и я часто использую вычисление этих значений, поэтому мне было интересно, есть ли у кого-нибудь лучший способ увеличить представление :)

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

agents-own [Belongs_to My-home popularity ]
patches-own [label_ storage]
links-own[Value-Of-The-Relationship frequency] 

to Update_link_Values  [Self_Agent Other_Agent Value]
 ask Self_Agent 
   [     ifelse any? links with [end1 = Self_Agent and End2 = Other_Agent]

         [ask out-link-to Other_Agent  [ set Value-Of-The-Relationship Value-Of-The-Relationship + Value  set Frequency Frequency + 1 ]  set hidden? true] 
         [create-link-to Other_Agent [set Value-Of-The-Relationship Value-Of-The-Relationship + Value set Frequency Frequency + 1 ] set hidden? true ] 

     ] 

end

to SeTPoPularity
   set Popularity sum[Value-Of-The-Relationship] of links with [end2 = mySelf]
 end 

Обновление 2: я думаю, что уже нашел лучший способ (очевидный! который я должен был сделать в первую очередь) установить популярность, вместо того, чтобы называть его каждый тик, я просто могу обновить его, только если он изменилось, я даже думаю, что мне может не понадобиться Переменная под названием "популярность" каждый раз, когда она мне нужна, я просто вызываю my-in-links

* Обновление 3: *

to Update_link_Values  [Self_Agent Other_Agent Value]
     ask Self_Agent 
       [     ifelse out-link-neighbor? Other_Agent

             [ask out-link-to Other_Agent  [ set Value-Of-The-Relationship Value-Of-The-Relationship + Value  set Frequency Frequency + 1 ]  set hidden? true] 
             [create-link-to Other_Agent [set Value-Of-The-Relationship Value-Of-The-Relationship + Value set Frequency Frequency + 1 ] set hidden? true ] 

         ] 

end

Спасибо Сету за его комментарии

Спасибо . Марзи.


person Marzy    schedule 03.11.2013    source источник
comment
После проверки текущей производительности я заметил, что проверка значений исправлений - еще одна основная проблема производительности в моем моделировании, каждый агент имеет свойство My-Home, которое хранит адрес исправления, и все члены семьи имеют одинаковое значение my-home, каждый исправление хранит свойство стоимость, которая принадлежит всей семье, когда население растет и количество людей в одном патче превышает 7, старший сын со своим товарищем (если таковой имеется) переедет и передаст свою долю на новый участок моего дома, если вся семья члены умирают, доля всей семьи будет перенесена на заплатку сообщества.   -  person Marzy    schedule 04.11.2013
comment
Вас смущают все новые вопросы в ваших обновлениях - может быть, открыть один или несколько новых, отдельных вопросов?   -  person Seth Tisue    schedule 05.11.2013
comment
Хорошо, я только что сделал, я совершенно новичок в Stackoverflow! Спасибо за ваш вклад :)   -  person Marzy    schedule 05.11.2013


Ответы (2)


Мне не кажется, что ваш план поможет улучшить производительность. Похоже, что все будет как медленнее, так и быстрее.

Вы пробовали использовать расширение профилировщика, чтобы узнать, какие процедуры используют больше всего ЦП? http://ccl.northwestern.edu/netlogo/5.0/docs/profiler.html

ОБНОВЛЕНИЕ: (теперь этот код предоставлен)

links with [end2 = mySelf] работает медленно, потому что он должен проверять каждую ссылку, чтобы увидеть, удовлетворяет ли она заданному условию. Я думаю, вы имеете в виду [my-in-links] of myself; такие примитивы, как my-in-links, возвращают ответы немедленно, без необходимости проверять каждую ссылку.

Аналогично у вас any? links with [end1 = Self_Agent and End2 = Other_Agent]. Опять же, использование with означает, что каждая ссылка должна быть проверена на соответствие условию. Вместо этого напишите [out-link-neighbor? Other_Agent] of Self_Agent. out-link-neighbor? может проверить наличие ссылки напрямую, без необходимости сканировать каждую ссылку.

У меня есть подозрение, что отказ от ненужного использования with решит ваши проблемы с производительностью. Но еще одно менее важное замечание:

Почему foreach sort sss? Почему не просто ask sss? Есть ли причина, по которой он должен работать в отсортированном порядке? ask быстрее, чем foreach плюс sort плюс ?.

person Seth Tisue    schedule 03.11.2013
comment
Спасибо, да, я использовал это расширение, в настоящее время моя симуляция для 40000 тиков (10 жизней для популяции из 50-100 агентов), которая включает социальное взаимодействие людей, занимает 15-20 минут на win7,32bit, 2 ГБ оперативной памяти, 2,4 ГГц ПРОЦЕССОР). Наибольший объем ЦП используется тремя процедурами, одна из которых проверяет, в каком патче нет живого агента, и перемещает свойство этого патча на уровень сообщества, а та, которая устанавливает популярность агентов, которая является суммой значений взаимосвязи каждого выхода. -link-сосед и тот, который проверяет, сколько агентов живет в одном патче, и просит выселить старшего сына. - person Marzy; 04.11.2013
comment
Если вы разместили код для процедур, которые используют большую часть времени выполнения, я мог бы обнаружить возможности ускорения. (Или нет, заранее узнать невозможно.) - person Seth Tisue; 04.11.2013
comment
Да, вы правы :) Я изменю код, а пока изменение функций [Убрать и установить популярность], которые я упомянул в вопросе, значительно улучшило производительность :) - person Marzy; 05.11.2013
comment
Замечательно, приятно слышать! - person Seth Tisue; 05.11.2013

Просто для обобщения результата того, что я сделал в первую очередь, чтобы изменить направленные ссылки на ненаправленные, которые после этого доставили много проблем, поэтому я все равно буду использовать направленные ссылки:

Это код, который я использовал:

to Update_link_Values  [Self_Agent Other_Agent Value]
 ask Self_Agent 
   [     ifelse  out-link-neighbor? Other_Agent

         [ask out-link-to Other_Agent  [ set Value-Of-The-Relationship Value-Of-The-Relationship + Value  set Frequency Frequency + 1 ]  set hidden? true] ;IF already has a link 
         [create-link-to Other_Agent [set Value-Of-The-Relationship Value-Of-The-Relationship + Value set Frequency Frequency + 1 ] set hidden? true ] ;If they meet for the first time

     ] 

end

;Update_Friendship_Values 
to Update_Friendship_Values  [Self_Agent Other_Agent Value]
  ask Self_Agent 
    [     
      ifelse any? Friendships with [end1 = Self_Agent and End2 = Other_Agent]

      [
        ask Friendships with [end1 = Self_Agent and End2 = Other_Agent] 
        [ 
          set End1-End2-Value-Of-The-Relationship End1-End2-Value-Of-The-Relationship + Value  
          set End1-End2-Frequency End1-End2-Frequency + 1  
        ]  
       ; set hidden? true
      ] ;IF already has a link and first agent is end1
      [  
        ifelse any? Friendships with [end2 = Self_Agent and End1 = Other_Agent]

          [
            ask Friendships with [end2 = Self_Agent and End1 = Other_Agent] 
            [ 
              set End2-End1-Value-Of-The-Relationship End2-End1-Value-Of-The-Relationship + Value  
              set End2-End1-Frequency End2-End1-Frequency + 1
            ]  
            ;set hidden? true
          ] ;IF already has a link and first agent is end2 
          [ ifelse count Other_Agent = 1 
            [create-Friendship-with Other_Agent [
              set End1-End2-Value-Of-The-Relationship End1-End2-Value-Of-The-Relationship + Value
              set End1-End2-Frequency End1-End2-Frequency + 1 
            ]] [
            create-Friendships-with Other_Agent [
              set End1-End2-Value-Of-The-Relationship End1-End2-Value-Of-The-Relationship + Value
              set End1-End2-Frequency End1-End2-Frequency + 1]
            ;set hidden? true 
          ] ]
      ]
    ] 

end

С поправками, которые предложил Сет, я думаю, что иметь больше ссылок лучше, чем иметь более сложные вычисления для поиска правильных ненаправленных ссылок (здесь это называется Дружба).

person Marzy    schedule 05.11.2013