在Matlab中使用排除标准计算排列数

问题描述 投票:0回答:1

我有一个包含 12 个项目的单词列表,由 4 个语义类别组成,每个类别有 3 个项目。这包括沙发、架子、桌子(家具)、飞机、船、卡车(车辆)、夹克、鞋子、毛衣(衣服)、生菜、胡萝卜、菠菜(蔬菜)。我需要生成包含这 12 项的随机列表,但是有一些规则。

首先,来自同一语义类别的项目不能在列表中彼此相邻(例如生菜和菠菜)。其次,该清单分为 3 个块(第 1-4、5-8 和 9-12 项)。在每个块中,每个语义类别必须至少但不超过一项。

完全编码菜鸟,所以我了解如何计算排列,但我不知道如何实现其他规则。非常感谢任何帮助。

algorithm math permutation
1个回答
0
投票

经过思考,我就给出伪代码。并使其看起来足够像 Matlab,这样您就可以弄清楚如何使其工作。

首先,你的单词可以排列在数组的数组中。像这样。

word_lists = [
    ["couch", "shelf", "table"],
    ["plane", "boat", "truck"],
    ["jacket", "shoes", "sweater"],
    ["lettuce", "carrot", "spinach"]]

让我们打乱每个内部列表。我猜语法是这样的:

for i = 1:4
    word_lists[i] = word_lists[i](randperm(3))
end

现在让我们选择列表的选项。 (每个列表都是一个类别。)

list_choices = [randperm(4), randperm(4), randperm(4)]

但是可能会出现问题。我们可能会让一个组中的最后一个列表选项与下一组中的第一个列表选项相同。解决这个问题。

while list_choices(1, 4) == listchoices(2, 1)
    list_choices(2) = randperm(4)
end

while list_choices(2, 4) == listchoices(3, 1)
    list_choices(3) = randperm(4)
end

现在提取您的单词列表。如果我的索引规则正确,它应该是这样的:

word_list = cat(1,
                word_lists(list_choices(1), 1),
                word_lists(list_choices(2), 2),
                word_lists(list_choices(3), 3))
© www.soinside.com 2019 - 2024. All rights reserved.