Выбор элемента в списке - PullRequest
0 голосов
/ 28 января 2020

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

    let selected_house max-one-of turtle-set my-list [price]
    let selected_landlord [my-landlord] of selected_house
       print (word "Landlord" [selected_landlord] of selected_house)
    let new_list (list selected_house selected_landlord)

       print (word  "Landlord " selected_landlord "of house: " selected_house " by price: " [price] of selected_house)

, но если, скажем, у меня есть:

Список:

"Landlord 2 is the owner of house 4 by price 400000"
"Landlord 5 is the owner of house 1 by price 100000"
"Landlord 4 is the owner of house 3 by price 300000" 

, а затем я использую selected_house/landlord чтобы выбрать владельца дома с наивысшей ценой, я должен получить (house 4, landlord 2); однако я получаю (house 4, landlord 5), то есть домовладелец выбрал один тик раньше.

Я определил домовладельца и дом следующим образом (у меня есть похожие упражнения, но на разные темы):

if breed = landlords [

          hatch-houses n_house [

            set price precision (random-float 1) 3

            set this-house self
            set this-landlord myself

            ask myself [

              set my-list fput (list this-house this-landlord) my-list

            ]
        ]

, где this-house и this-landlord - глобальные, а my-list - landlords' own.

Не могли бы вы помочь мне разобраться и решить проблему с этой частью кода?

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

Большое спасибо

1 Ответ

2 голосов
/ 30 января 2020

Я не уверен, почему this-house и this-landlord являются глобальными, и я думаю (без полного кода до go на), что это может быть вашей проблемой. Если я понимаю вашу модель, у каждого арендодателя есть набор домов, и вы хотите, чтобы вы могли найти самый дорогой дом и владельца, который владеет им. Если каждый дом отслеживает своего арендодателя и цену, а каждый арендодатель отслеживает свои дома, то это должно позволить вам связать любой дом с его владельцем или просмотреть все дома, которые принадлежат владельцу.

Следующая модель, возможно, даст вам представление о том, как действовать дальше. Он создает домовладельцев, каждый из которых затем создает дома со случайной ценой. Затем он находит самый дорогой дом и его хозяина. Затем для каждого арендодателя он находит самый дорогой дом этого арендодателя. Домовладелец может хранить список домов с [домовладельцем], но второй пункт будет одинаковым для всех домов хозяина.

breed [landlords landlord]
breed [houses house]

landlords-own [my-houses my-house-list]
houses-own [price my-landlord]

to test
  clear-all
  create-landlords 10
  ask landlords [
    hatch-houses 5 [
      set price precision (random-float 1) 3
      set my-landlord myself
    ]
    set my-houses houses with [my-landlord = myself]
  ]

  let most-expensive max-one-of houses [price]
  show (word "The mostexpensive house is house " most-expensive " owned by " [my-landlord] of most-expensive " with price =" [price] of most-expensive)

  ask landlords [
    let my-most-expensive max-one-of my-houses [price]
    show (word "landlord " self "'s most expensive house is house " most-expensive " with price =" [price] of my-most-expensive)
  ]
end

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

globals [house-list]

to list-houses
  set house-list []
  ask houses [
    set house-list fput (list self my-landlord price) house-list
  ]
  show house-list
  let sorted-by-price sort-by [[a b] -> item 2 a > item 2 b] house-list
  let most-expensive first sorted-by-price
  show (word "the most expensive house is house " item 0 most-expensive " with owner " item 1 most-expensive " and price " item 2 most-expensive)
end

Надеюсь, это поможет, Чарльз

...