代码之家  ›  专栏  ›  技术社区  ›  delaye

在NetLogo中对具有两个条件的修补程序集或代理集进行排序

  •  2
  • delaye  · 技术社区  · 12 年前

    我的补丁有 cost 和 gain 属性,我想对补丁列表进行排序 费用 和最大值 获得 这个 sort-by 该函数适用于对一个属性进行排序,但如何对两个属性进行分类?

    1 回复  |  直到 12 年前
        1
  •  3
  •   Nicolas Payette    12 年前

    要在多个属性上对代理集进行排序,可以使用 sort-by 或 sort-on :

    patches-own [ cost gain ]
    
    to sort-patches
      ca
      ask patches [
        set cost random 100
        set gain random 100
      ]
    
      let patches-sorted-by sort-by [
        ([ cost ] of ?1 > [ cost ] of ?2) or
        ([ cost ] of ?1 = [ cost ] of ?2 and [ gain ] of ?1 < [ gain ] of ?2)
      ] patches
      show map [[ list cost gain ] of ? ] patches-sorted-by
    
      let patches-sorted-on sort-on [ (cost * -1000) + gain ] patches
      show map [[ list cost gain ] of ? ] patches-sorted-on
    end
    

    你喜欢哪一个取决于你。使用 排序方式 需要仔细构造公式(即,如果增益大于1000,则上述公式将不起作用),但稍微不那么冗长。

    编辑:对多个条件进行排序的更一般的方法

    好吧,这对你的情况来说可能是过度了,但我提出了一个更一般的问题:

    to-report sort-by-criteria [ criteria items ]
      ; `criteria` needs to be a task that returns a list of numbers
      report sort-by [
        compare-lists (runresult criteria ?1) (runresult criteria ?2)
      ] items
    end
    
    to-report compare-lists [ l1 l2 ]
      report ifelse-value (empty? l1 or empty? l2) [ false ] [
        ifelse-value (first l1 = first l2)
          [ compare-lists but-first l1 but-first l2 ]
          [ first l1 < first l2 ]
      ]
    end
    

    你需要通过的 sort-by-criteria 是一个 task 给定您要排序的项目之一,它将报告一个数字列表,您的项目将根据该列表进行排序。

    在您的情况下,您可以这样使用:

    let sorted-patches sort-by-criteria (
      task [[ list (-1 * cost) gain ] of ? ]
    ) patches
    

    对于两个标准,它可能不值得使用,但如果您有一长串标准,那么它可能比任何其他方法都更容易使用,更清晰。