Как разделить черепах на разные размерные группы в зависимости от собственной черепахи? - PullRequest
0 голосов
/ 11 апреля 2019

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

В частности, в зависимости от их дохода я хочу, чтобы фирмы с 30% -ым низким доходом были размером 0,5, фирмы со средним доходом 60% были размером 1, а фирмы с 10%самый высокий доход должен быть размером 1,5.На данный момент у меня есть:

breed [ firms firm ]

firms-own [
  income
]

to setup
  create-firms number-of-firms [   ;; number of firms to be defined through slider
  set income random 100
   if income = "low" [ set size 0.5 ]   ;; firms with low output are of a small size
   if income = "medium" [ set size 1 ]   ;; firms with medium output are of a medium size
   if income = "high" [ set size 1.5 ]   ;; firms with high output are of a large size
end

Я знаю, что код не работает, потому что я не сказал фирмам, когда устанавливать для своих фирм «низкий», «средний» или «высокий».Но я не знаю, как заставить их установить его в процентах от общего дохода.

Спасибо за ваш вклад!

Ответы [ 2 ]

1 голос
/ 12 апреля 2019

Если у вас есть только три класса, вы, вероятно, можете обойтись вложенным оператором ifelse:

breed [ firms firm ]

firms-own [
  income
  income-class
]

to setup
  ca
  create-firms 10 [   
    while [ any? other turtles-here ] [
      move-to one-of neighbors 
    ]
    set income random 100
  ]
  let firm-incomes sort [income] of firms
  print firm-incomes

  ask firms [
    ifelse income < item ( length firm-incomes / 3 ) firm-incomes [
      set income-class "low"
      set size 0.5
    ] [
      ifelse income < item ( length firm-incomes * 9 / 10 ) firm-incomes [
        set income-class "medium"
        set size 1
      ] [
        set income-class "high"
        set size 1.5
      ]
    ]
  ]

  ; Just to check output:
  foreach sort-on [ income ] turtles [
    t ->
    ask t [
      show income
      show income-class
    ]
  ]
  reset-ticks
end

Выводит что-то вроде:

[16 20 20 47 52 58 69 83 88 97]
(firm 9): 16
(firm 9): "low"
(firm 0): 20
(firm 0): "low"
(firm 3): 20
(firm 3): "low"
(firm 5): 47
(firm 5): "medium"
(firm 7): 52
(firm 7): "medium"
(firm 4): 58
(firm 4): "medium"
(firm 2): 69
(firm 2): "medium"
(firm 1): 83
(firm 1): "medium"
(firm 6): 88
(firm 6): "medium"
(firm 8): 97
(firm 8): "high
0 голосов
/ 12 апреля 2019

Luke Cs ответ довольно хороший, палец вверх! В случае только 3 классов дохода, вы также можете работать max-n-of для 10% фирм с самым высоким доходом и с min-n-of для 30% фирм с низким доходом. Все остальное можно считать средним, но, пожалуйста, проверьте приведенный ниже пример кода:

breed [ firms firm ]

firms-own [
  income
  income-class
]

to setup

  clear-all
  create-firms number-of-firms [   ;; number of firms to be defined through slider
    set income random 100
    set color red
    setxy random-xcor random-ycor
  ]  

  ask ( max-n-of ( number-of-firms * 0.1 ) firms [income] ) [ set income-class "high" set size 1.5] ;; the 10% firms with the highest value of income 
  ask ( min-n-of ( number-of-firms * 0.3 ) firms [income] ) [ set income-class "low" set size 0.5] ;; the 30% firms with the lowest value of income 

  ask firms with [income-class = 0 ] [set income-class "medium" set size 1] ;; all firms who have no income-class yet are set to "medium"


end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...