【发布时间】:2025-12-27 09:35:15
【问题描述】:
我拥有的是一个向量(示例中为 n = 4):
x = '0123';
我想要的是一个与 x 大小相同且具有与 x 中相同元素但顺序不同的向量 y:
y = ['0123'; '0132'; '0213'; '0231'; '0312'; '0321'; '1023'; '1032'; '1203'; '1302'; '2013'; '2031'; '2103'; '2301'];
y(ceil(rand * numel(y(:, 1))), :)
即一个排列,使得 y 中的每个元素相对于其在 x 中的原始位置(在示例中为 k = 2)随机更改不超过 k 个位置。概率分布必须是均匀的(即每个排列必须同样可能发生)。
一种明显但低效的方法当然是找到一个随机的无约束排列,并事后检查这是否符合约束。对于小向量,您可以找到所有排列,删除那些不允许的排列,然后在剩余的排列中随机选择。 关于如何更有效地执行相同操作的任何想法,例如通过实际交换元素?
【问题讨论】:
标签: matlab permutation constraint-programming