Propose Expanding Netlogo sort to allow identical list elements without cutting them out

20 views
Skip to first unread message

Wolfgang Pfleghaar

unread,
Jul 31, 2021, 1:42:26 PM7/31/21
to netlogo-devel
Working on a stock market model I'd need some alternative to the Netlogo sort algorithm:

extensions [matrix]
globals [ii jj comp mip ord ordm ordl ordr]

to setup
  print ("  Problem: The sort algorithms provided by Netlogo cuts out identical list elements upon sorting ") 
  print ("  input : ord  is a list to be sorted  ")   
  print ("  output: ordm is a nested list of 1. Sorted List   2. Corresponding Input" )
  print("  ")
end ;setup
to go
  list-in
  arrange
end
to list-in ; example :
  set ord [ 5 7 3 45 23 54 1 4 8 9 0 2 6 3 89 78 43 -5]
end
to arrange
  let ltr length ord                   ;  type ("ltr   ")  print ltr
  let r1 n-values ltr [ i -> i ]         type ("r1    ") print r1
  set ordm matrix:make-constant 2 ltr 0;  type ("ordm  ") print ordm
  matrix:set-row ordm 0 ord
  matrix:set-row ordm 1 r1           ;      print"ordm Matrix in " print matrix:pretty-print-text ordm
  ;set ord  matrix:to-row-list ordm       ;  type("ord  List    ") print ord
  set ordr ordm
  set ii 0
  set jj 0
  set comp matrix:get ordr 0 jj
  set mip min matrix:get-row ordr 0
    while [jj < ltr]
    [
;      type("ordm  in    ") print ordm
;      type("ordr  in    ") print ordr
      set comp matrix:get ordr 0 jj
      set mip min matrix:get-row ordr 0
;      type ("comp in ") print comp
;      type ("mip  in ") print mip
      ifelse comp = mip
        [ if jj != 0 [ matrix:swap-columns ordm  ii  (jj + ii)]
          set jj 0
          if ii < ltr - 1 [set ii ii + 1]
          let lr length matrix:get-row ordr 0 ;  type ("lr ") print lr
          ifelse ii < ltr and lr > 1 [set ordr matrix:submatrix ordm 0 ii 1 ltr ]
          [let ords matrix:to-row-list ordm ; type("ords  ") print ords
          set jj ltr]; end if
      ] [ set jj jj + 1 ] ; end else
    ] ; end while jj

      set ordl matrix:get-row ordm 0
      type ("ord  :in  unsorted list  ") print ord
      type( "ordl :out sorted list    ") print ordl
      print "   "
      print "ordm Matrix out compared with corresponding input " print matrix:pretty-print-text ordm
end   ; arrange

Seth Tisue

unread,
Aug 1, 2021, 12:07:50 PM8/1/21
to netlogo-devel
NetLogo's `sort` primitive doesn't remove duplicates:

observer> show sort [3 2 1 1 2 3 3 2 1]
observer: [1 1 1 2 2 2 3 3 3]

So, I'm unable to understand your request. The code you've provided that purports to illustrate the problem is quite complicated and difficult to follow. Are you able to demonstrate the issue more simply? (And by the way, what version of NetLogo are you using? I'm using NetLogo 6.2.0.)

Seth
Reply all
Reply to author
Forward
0 new messages