【问题标题】:Generating K-multisets when order matters and repetition is allowed当顺序很重要并且允许重复时生成 K-multisets
【发布时间】:2023-03-12 06:05:01
【问题描述】:

对不起,如果我的问题是基本的,但我在过去 15 年没有编码,尽管我正在尝试再次为研究项目学习编码。我有一组 12 个对象 [ABCDEFGHIJKL],我想为 1 到 6 之间的任何 K 创建一个任何可能的 K-multiset 列表。(我确实有一个选择概率列表,但在项目的这个阶段我可以假设所有人的选择概率相等)。顺序很重要并且允许重复(所以它们只是 k 元组)。例如:[A]、[AA] [BAA] [ABA]、[BAAAAA] 等。我尝试在RNDNetLogo 扩展中使用weighted-n-of-with-repeats,但似乎顺序并不重要,所以[BA] 和 [AB] 是相同的东西,报告为 [AB]。能否请您提供NetLogo 代码?

这是我迄今为止尝试过的,但不幸的是它无法识别顺序:

to k-multiset let n 0 let pairs [[ "A" 0.1 ] [ "B" 0.1 ] ["C" 0.1] [“D” 0.1] [“E” 0.1] [“F” 0.1] [“G” 0.1] [“H” 0.1] [“I” 0.1] [“J” 0.1] [“K” 0.1]] while [n < 7] [print map first rnd:weighted-n-of-list-with-repeats n pairs [[p] -> last p ]] end

【问题讨论】:

    标签: combinations netlogo multiset


    【解决方案1】:

    请注意,每个包含 K 个项目的多重集都可以表示为 12 进制数字系统中的整数值,其中 A 对应于 0,B 对应于 1,依此类推,直到 L=11。

    因此,您可以遍历0..12^K-1 范围内的所有整数(K=6 大约为 3 百万),并获得 12 进制数字作为项目的索引。

    较小项目列表和输出范围的python代码:

    List = list('ABC')
    L = len(List)
    for K in range(1,4):
        for i in range(L**K):
            j = i
            output = []
            for n in range(K):   #K digits
                 d = j % L      #integer modulo for n-th digit
                 j = j // L     #integer division
                 output.insert(0,List[d])
            print(output)
    part of output:
    ['A']
    ['B']
    ['C']
    ['A', 'A']
    ['A', 'B']
    ['A', 'C']
    ...
    ['C', 'C']
    ['A', 'A', 'A']
    ['A', 'A', 'B']
    ['A', 'A', 'C']
    ...
    ['C', 'B', 'C']
    ['C', 'C', 'A']
    ['C', 'C', 'B']
    ['C', 'C', 'C']
    

    【讨论】:

    • 谢谢@MBo。我的其余代码是用NetLogo 编写的,所以我仍然想知道如何在那里做!
    • 我不知道netlogo但希望你可以使用这种方法
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 2022-01-25
    • 2018-04-25
    • 2013-01-06
    相关资源
    最近更新 更多