根据百分比分配变量

发布于 2025-02-10 07:54:56 字数 1270 浏览 2 评论 0原文

我试图根据百分比分配称为“撤离”年龄的品种。撤离人员的数量基于界面中的滑块,这意味着我没有固定的人口可以使用。他们有两个属性,“性别”和“年龄”,它们都是基于百分比的。 我以以下方式分配了性别:

let women n-of (count evacuees * 0.513) evacuees

ask women [set sex "female"]

ask evacuees [if not member? self women [set sex "male"]]

如果您只有两个类别,那就可以了。但是,当您有两个以上(我有五个不同的年龄段)时,这已经不再起作用了。我试图仍然使用n-of,但是如果条件,则不会从整个撤离者的整个池中绘制代理,而只是尚未分配的年龄的代理:

set men-0-14 n-of (count evacuees with [sex = "male"] * 0.11) evacuees

    ask men-0-14 [set age "0-14"]
    ask evacuees [
      if not member? self men-0-14 [
        set men-15-19 n-of (count evacuees with [sex = "male"] * 0.04) evacuees with [sex = "male" AND 
        not member? self men-0-14]
      ] 
    ]
    ask men-15-19 [set age "15-19"]
    ask evacuees [
      if not member? self men-0-14 AND not member? self men-15-19 [
        set men-20-39 n-of (count evacuees with [sex = "male"] * 0.26) evacuees with [sex = "male" AND 
        not member? self men-0-14 AND not member? self men-15-19]
      ] 
   ]
   ask men-20-39 [set age "20-39"]

。 ..等所有五个类别等等。但是最后,我仍然会有一些没有分配年龄的男性撤离者。我认为这可能是因为的n of的使用始终是从整个撤离者中汲取的,即使使用 - 条件。或者可能是Netlogo计划的一个问题,所有撤离者仍然是池的一部分,因为在完成过程后,年龄组绝对会分配。

是否有另一种方法可以创建根据一定百分比分配年龄的五个代理集?

I'm trying to assign my breed called "evacuees" their age based on a percentage. The number of evacuees is based on a slider in the interface, meaning that I don't have a fixed population to work with. They have two properties, "sex" and "age", which are both based on a percentage.
I assigned the sex the following way:

let women n-of (count evacuees * 0.513) evacuees

ask women [set sex "female"]

ask evacuees [if not member? self women [set sex "male"]]

That works fine if you only have two categories. But when you have more than two (I have five different age groups) this doesn't work anymore. I tried to still use n-of but with if conditions, so that the agents are not drawn from the whole pool of the evacuees, but only the ones that haven't had an age assigned yet:

set men-0-14 n-of (count evacuees with [sex = "male"] * 0.11) evacuees

    ask men-0-14 [set age "0-14"]
    ask evacuees [
      if not member? self men-0-14 [
        set men-15-19 n-of (count evacuees with [sex = "male"] * 0.04) evacuees with [sex = "male" AND 
        not member? self men-0-14]
      ] 
    ]
    ask men-15-19 [set age "15-19"]
    ask evacuees [
      if not member? self men-0-14 AND not member? self men-15-19 [
        set men-20-39 n-of (count evacuees with [sex = "male"] * 0.26) evacuees with [sex = "male" AND 
        not member? self men-0-14 AND not member? self men-15-19]
      ] 
   ]
   ask men-20-39 [set age "20-39"]

... and so on for all five categories. But in the end I will still have some male evacuees that don't have an age assigned. I think that might be because of the usage of n-of, that it always draws from the whole evacuees, even if using if-conditions. Or it might be a problem of scheduling in NetLogo, that all of the evacuees are still part of the pool because the age group gets assigned definitely when the procedure is finished.

Is there another way to create the five agentsets that have an age assigned based on a certain percentage?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

錯遇了你 2025-02-17 07:54:56

这是一个通用解决方案,可让您在设置中以不错的表格格式分配性别和年龄组,然后将每个组的这些百分比应用于多大的海龟,并报告结果。它似乎有效。

globals [ sex-percentages age-percentages ]

turtles-own [ sex_code sex_label age_code age_label ]
to setup
  clear-all
  
  let delist []
  ;; assume the percent lists are % of total population desired, code, and label 
  
  set sex-percentages [
      [0.4 "M" "male"   ] 
      [0.6 "F" "female" ]
  ]
  
  set age-percentages [
     [0.2 1 "under 10" ]
     [0.5 2 "11-30"    ]
     [0.2 3 "31-50"    ]
     [0.1 4 "over 50 " ]
  ]
  create-turtles ( 100 + random 20)  [set size 2 set shape "person" setxy random-xcor random-ycor 
    
    set delist assign sex-percentages
    set sex_code first delist
    set sex_label last delist
    set label sex_code
    
    set delist assign age-percentages
    set age_code first delist
    set age_label last delist
    set label age_code

    
    
    
  ]
  report-sexes
  report-ages
  
  reset-ticks
end

to report-sexes
  let sexlist []
  let n count turtles
  ask turtles [ set sexlist lput sex_code  sexlist ]
  let sexes sort remove-duplicates sexlist
  foreach sexes 
   [ x ->  let thiscount length filter [ i -> i = x ] sexlist
     let pct ( 100 * thiscount / n )
     print (word   x " has "  thiscount " of " n " = " precision pct 3  " percent" ) 
  ]
   print "Requested: "
  foreach age-percentages [ x -> print x ]
end

to report-ages
    let agelist []
  let n count turtles
  ask turtles [ set agelist lput age_code  agelist ]
  let ages sort remove-duplicates agelist
  foreach ages
   [ x ->  let thiscount length filter [ i -> i = x ] agelist
     let pct ( 100 * thiscount / n )
     print (word   x " has "  thiscount " of " n " = " precision pct 3  " percent" ) 
  ]
 print "Requested: "
  foreach age-percentages [ x -> print x ]
end

 
  
to-report  assign [ distribution ]
  let chooser random-float 1  ;; returns value in range [0, 0.99999]
  let assigned false
  
  let running_sum  0
  
  ;; set default values in case the code isn't working correctly
  let decode "?"
  let delabel "?"
  
  foreach distribution
  [
      x -> 
      let group-pct item 0 x
      let group-code item 1 x
      let group-label item 2 x
    
      set running_sum ( running_sum + group-pct) 
    
    if ( running_sum > 1) [ print "ERROR - total is over 100%" stop]
    
      if (( assigned = false ) and ( chooser <= running_sum))
         [ set decode group-code
           set delabel group-label
           set assigned true
         ]
  ]
  
  report (list decode delabel )
  
end

Here's a generic solution that lets you assign sexes and age-groups in a nice table format in setup, then applies those percentages of each group to however many turtles you have, and reports on the results. It seems to work.

globals [ sex-percentages age-percentages ]

turtles-own [ sex_code sex_label age_code age_label ]
to setup
  clear-all
  
  let delist []
  ;; assume the percent lists are % of total population desired, code, and label 
  
  set sex-percentages [
      [0.4 "M" "male"   ] 
      [0.6 "F" "female" ]
  ]
  
  set age-percentages [
     [0.2 1 "under 10" ]
     [0.5 2 "11-30"    ]
     [0.2 3 "31-50"    ]
     [0.1 4 "over 50 " ]
  ]
  create-turtles ( 100 + random 20)  [set size 2 set shape "person" setxy random-xcor random-ycor 
    
    set delist assign sex-percentages
    set sex_code first delist
    set sex_label last delist
    set label sex_code
    
    set delist assign age-percentages
    set age_code first delist
    set age_label last delist
    set label age_code

    
    
    
  ]
  report-sexes
  report-ages
  
  reset-ticks
end

to report-sexes
  let sexlist []
  let n count turtles
  ask turtles [ set sexlist lput sex_code  sexlist ]
  let sexes sort remove-duplicates sexlist
  foreach sexes 
   [ x ->  let thiscount length filter [ i -> i = x ] sexlist
     let pct ( 100 * thiscount / n )
     print (word   x " has "  thiscount " of " n " = " precision pct 3  " percent" ) 
  ]
   print "Requested: "
  foreach age-percentages [ x -> print x ]
end

to report-ages
    let agelist []
  let n count turtles
  ask turtles [ set agelist lput age_code  agelist ]
  let ages sort remove-duplicates agelist
  foreach ages
   [ x ->  let thiscount length filter [ i -> i = x ] agelist
     let pct ( 100 * thiscount / n )
     print (word   x " has "  thiscount " of " n " = " precision pct 3  " percent" ) 
  ]
 print "Requested: "
  foreach age-percentages [ x -> print x ]
end

 
  
to-report  assign [ distribution ]
  let chooser random-float 1  ;; returns value in range [0, 0.99999]
  let assigned false
  
  let running_sum  0
  
  ;; set default values in case the code isn't working correctly
  let decode "?"
  let delabel "?"
  
  foreach distribution
  [
      x -> 
      let group-pct item 0 x
      let group-code item 1 x
      let group-label item 2 x
    
      set running_sum ( running_sum + group-pct) 
    
    if ( running_sum > 1) [ print "ERROR - total is over 100%" stop]
    
      if (( assigned = false ) and ( chooser <= running_sum))
         [ set decode group-code
           set delabel group-label
           set assigned true
         ]
  ]
  
  report (list decode delabel )
  
end
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文