【问题标题】:Creating a List of Variables to find maxima创建变量列表以找到最大值
【发布时间】:2023-10-14 01:03:02
【问题描述】:

我试图创建一个列表,其中包含一组变量的值,这些变量是根据其他变量在每个 go 过程中计算出来的。在这种情况下,我试图创建一个实用程序值列表,这将导致运行程序的代理决定更改其 TIME 变量。所有计算部分都是正确的,唯一的问题是尝试为实用程序创建列表并从中选择最大值以继续该过程。有谁知道我可以做些什么来避免这个问题?干杯

to utility-runway


  let feepKG7 [feepKG] of runway1
  let feepKG8 [feepKG] of runway2
  let feepKG9 [feepKG] of runway3
  let feepKG10 [feepKG] of runway4
  let feepKG11 [feepKG] of runway5
  let feepKG12 [feepKG] of runway6
  let feepKG13 [feepKG] of runway7
  let feepKG14 [feepKG] of runway8
  let feepKG15 [feepKG] of runway9
  let feepKG16 [feepKG] of runway10
  let feepKG17 [feepKG] of runway11
  let feepKG18 [feepKG] of runway12
  let feepKG19 [feepKG] of runway13
  let feepKG20 [feepKG] of runway14
  let feepKG21 [feepKG] of runway15
  let feepKG22 [feepKG] of runway16
  let feepKG23 [feepKG] of runway17


   set utility7 ( ( previous-business1 + previous-leisure1 + previous-business2 + previous-leisure2 ) / feepKG7 )
   set utility8 ( ( previous-business1 + previous-leisure1 + previous-business2 + previous-leisure2 + previous-business3 + previous-leisure3 ) / feepKG8 )
   set utility9 ( ( previous-business2 + previous-leisure2 + previous-business3 + previous-leisure3 + previous-business4 + previous-leisure4 ) / feepKG9 )
   set utility10 ( ( previous-business3 + previous-leisure3 + previous-business4 + previous-leisure4 + previous-business5 + previous-leisure5 ) / feepKG10 )
   set utility11 ( ( previous-business4 + previous-leisure4 + previous-business5 + previous-leisure5 + previous-business6 + previous-leisure6 ) / feepKG11 )
   set utility12 ( ( previous-business5 + previous-leisure5 + previous-business6 + previous-leisure6 + previous-business7 + previous-leisure7 ) / feepKG12 )
   set utility13 ( ( previous-business6 + previous-leisure6 + previous-business7 + previous-leisure7 + previous-business8 + previous-leisure8 ) / feepKG13 )
   set utility14 ( ( previous-business7 + previous-leisure7 + previous-business8 + previous-leisure8 + previous-business9 + previous-leisure9 ) / feepKG14 )
   set utility15 ( ( previous-business8 + previous-leisure8 + previous-business9 + previous-leisure9 + previous-business10 + previous-leisure10 ) / feepKG15 )
   set utility16 ( ( previous-business9 + previous-leisure9 + previous-business10 + previous-leisure10 + previous-business11 + previous-leisure11 ) / feepKG16 )
   set utility17 ( ( previous-business10 + previous-leisure10 + previous-business11 + previous-leisure11 + previous-business12 + previous-leisure12 ) / feepKG17 )
   set utility18 ( ( previous-business11 + previous-leisure11 + previous-business12 + previous-leisure12 + previous-business13 + previous-leisure13 ) / feepKG18 )
   set utility19 ( ( previous-business12 + previous-leisure12 + previous-business13 + previous-leisure13 + previous-business14 + previous-leisure14 ) / feepKG19 )
   set utility20 ( ( previous-business13 + previous-leisure13 + previous-business14 + previous-leisure14 + previous-business15 + previous-leisure15 ) / feepKG20 )
   set utility21 ( ( previous-business14 + previous-leisure14 + previous-business15 + previous-leisure15 + previous-business16 + previous-leisure16 ) / feepKG21 )
   set utility22 ( ( previous-business15 + previous-leisure15 + previous-business16 + previous-leisure16 + previous-business17 + previous-leisure17 ) / feepKG22 )
   set utility23 ( ( previous-business16 + previous-leisure16 + previous-business17 + previous-leisure17) / feepKG23 )


  set utility-list [ utility7 utility8 utility9 utility10 utility11 
    utility12 utility13 utility14 utility15 utility16 
    utility17 utility18 utility19 utility20 utility21 utility22 utility23 ]

  let max-utility max-one-of utility-list

  if max-utility = utility7 [set time 7]  
  if max-utility = utility8 [set time 8]  
  if max-utility = utility9 [set time 9] 
  if max-utility = utility10 [set time 10] 
  if max-utility = utility11 [set time 11] 
  if max-utility = utility12 [set time 12] 
  if max-utility = utility13 [set time 13] 
  if max-utility = utility14 [set time 14] 
  if max-utility = utility15 [set time 15] 
  if max-utility = utility16 [set time 16] 
  if max-utility = utility17 [set time 17] 
  if max-utility = utility18 [set time 18] 
  if max-utility = utility19 [set time 19] 
  if max-utility = utility20 [set time 20] 
  if max-utility = utility21 [set time 21] 
  if max-utility = utility22 [set time 22] 
  if max-utility = utility23 [set time 23] 




end

【问题讨论】:

    标签: netlogo


    【解决方案1】:

    首先,我假设每个runway# 都是乌龟或品种runway 的链接。构建此代码的更好方法是一次对所有值应用相同的操作。为此,首先我们创建一个feepKG 值列表:

    let feepKGs map [ [ feepKG ] of ? ] sort runways
    

    runways 前面的排序使得feepKGs 的第一项对应于第一个runway,依此类推。不幸的是,由于您 sort 返回一个列表,因此您必须使用 map 而不是 of 来获取 feepKGs 的列表。

    接下来,我们需要从feepKG 列表中获取实用程序列表。看起来您对utility7 的计算可能不正确,因为它是唯一不同的。无论如何,要对列表中的每个项目应用相同的操作,我们使用map

    let utilities map [(previous-business1 + previous-leisure1 + previous-business2 + previous-leisure2 + previous-business3 + previous-leisure3 ) / ?] feepKGs
    

    map 将该大表达式应用于feepKGs 的每个元素(其中? 是元素)。所以这里的utilities 与您的utility-list 相同(假设您对utility7 的表达实际上是错误的)。要获取 max 实用程序的值,您可以使用 max

    let max-utility max utilities
    

    然后,我们获取 max-utility 的索引以找出它是哪一个。由于您的实用程序编号从 7 开始,而列表索引从 0 开始,我们必须将 7 添加到索引:

    set time 7 + position max-utility utilities
    

    【讨论】:

    • [ feepKG ] of sort runways 实际上不是有效代码
    • 我刚刚意识到我工作中的一个错误,它已被编辑。我的问题是每条跑道都是一个独立的品种,因为当我对 netlogo 的了解有限并且我无法为每只海龟独立设置变量时,这就是我开始编程的方式。实用程序7 eq。是正确的,错误的是utility23。
    • 这个想法是,每条跑道的效用是其时间段的需求量与使用费的比率。但是航空公司本身会根据可变时间分配跑道时段。
    • 这就是我最后两行所做的。只需使用max 获取最大值本身,然后使用position 获取其索引。
    • 你没有说你得到什么错误信息。但我猜问题是你需要用set utility-list (list utility7 utility8 ...) 替换set utility-list [ utility7 utility8 utility9 ... ]。这是ccl.northwestern.edu/netlogo/docs/faq.html#listexpectedconstant