Перестановка с повторением списка с длинным списком переменных в Netlogo - PullRequest
1 голос
/ 17 марта 2019

Я новичок в Netlogo, а также программирую и борюсь со следующей проблемой: мне нужно реализовать функцию Permu [k,n] в Netlogo, где k - это список элементов, например, [1 2], а n - длина получающегосясписок например 3.Функция должна возвращать все списки перестановок, скажем, длиной n, где элементы взяты из k.

Пример 1: Permu [1 2] 3 должен возвращать в результате все перестановки с повторениями [[1 1 1] [1 1 2] [1 2 1] [1 2 2] [2 1 1] [2 1 2] [2 2 1] [2 2 2]]

Пример2: Permu [1 2 3] 2 должен вернуть [[1 1] [1 2] [1 3] [2 1] [2 2] [2 3] [3 1] [3 2] [3 3]]

На самом деле эквивалентная функция в Mathematica будет Tuples[{1,2},3]

Я уже проверил сообщение Генерация перестановок списка в NetLogo , но не смог настроить его под мои нужды.

У вас есть идеи, как это сделать, или вы знаете какой-то псевдокод?Заранее спасибо!

Редактировать

Я придумал (плохое) решение, просто создав случайные списки, состоящие из элементов из k, пока не будут найдены все возможные комбинации:

to-report permu [k n]

  let number-of-all-combinations ( length k ) ^ n ;; stopping condtion

  let results []
  let temp-results []

  while [ length results < number-of-all-combinations ] [

    set temp-results []
    repeat n [ set temp-results fput (one-of k) temp-results ]
    if not member? temp-results results [set results fput temp-results results ] ;; makes sure that there are no duplicates in the result.
  ]

  report results

end

Я бы все равно оценил лучшую альтернативу. Спасибо!

...