как удалить нижнюю из двух ссылок в netlogo - PullRequest
0 голосов
/ 11 июля 2020

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

max-links = [(ссылка 4 2) (ссылка 2 1) (ссылка 0 5) (ссылка 3 2) (ссылка 1 2) (ссылка 5 3)]

ссылка [2 1] и [1 2] отображаются в списке, и я хочу, чтобы ссылка с меньшим значением на d ie и список обновлялись. теперь я написал этот код, но ничего не происходит. его первого конца, если это так, это означает, что между одними и теми же двумя черепахами установлено две связи. Я думаю, проблема в том, что когда я вызываю end2 или end1 для x или y, код не понимает, что end2 и end1 принадлежат элементам списка, может ли кто-нибудь сказать мне, как это исправить? спасибо

1 Ответ

1 голос
/ 11 июля 2020

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

links-own [ value ]

to setup
  ca
  random-seed 1
  foreach ( range 0 360 90 ) [ angle ->
    create-turtles 1 [
      set heading angle 
      fd 8
    ]
  ]
  ask turtles [
    create-links-to n-of 2 other turtles [
      set value random-float 1
      set label precision value 3
    ]
  ]
  reset-ticks
end

Это создает сеть с четырьмя «повторяющимися» ссылками - значения ссылок помечены:

enter image description here

Next, some code that:

  • Pulls all end pairs
  • Filters so that only duplicated end pairs are processed
  • Iterates over duplicated unique pairs and removes the lower-value link
to link-filter
  ; Get each link's end pairs
  let endPairs map [ i -> sort [ both-ends ] of i ] sort links

  ; Filter for end pairs that occur more than once
  let duplicatedEnds  ( map [ i -> filter [ j -> j = i ] endPairs ] endPairs )

  ; Keep only unique values
  let uniquePairs reduce sentence map remove-duplicates filter [ k -> length k > 1 ] duplicatedEnds

  ; Iterate over each unique pair
  foreach uniquePairs [ pair ->
    ; Filter for links with those ends, sorted by value
    let matchingLinks filter [ i -> sort [ both-ends ] of i = pair ] sort-on [value] links
    print matchingLinks

    ; Drop the first of the matching links as it is the lower value
    ; if its complement has not already been removed
    if length matchingLinks > 1 [
      ask first matchingLinks [ die ]
    ]
  ]
end

After this is run, you can see that the lower-value links are removed:

введите описание изображения здесь

...