matlab - 找到满足不规则约束的所有可能的向量

时间:2014-09-28 15:17:45

标签: matlab

在Matlab中,我需要找到满足某些约束条件的矢量的所有可能组合,我发现它们非常不规则。

向量x有12个条目:x_0,x_1,...,x_11

本地限制:

x_0 in {1,...,6}

x_i in {0,...,6}, i = 1,...,6

x_j in {0,...,12-j}, j = 7,...,11

全球约束:

sum(x) = 12

for any k, x_k = y ==> x_{k+j} = 0 for j = 1,...,y-1

我已经考虑了很长一段时间了,现在似乎无法解决这个问题 - 任何想法都有吗?

1 个答案:

答案 0 :(得分:0)

使用递归和中间约束检查。这样的事情可以解决问题:

function dispConstraintSatisfyingVectors()

global lb ub sumVal

lb = [1 0 0 0 0 0 0 0 0 0 0 0];
ub = [6 6 6 6 6 6 6 5 4 3 2 1];
sumVal = 12;

x = zeros(1,12);
addValueRecursive(x,1);

end

function addValueRecursive(x,idx)

global lb ub sumVal

for val = lb(idx):ub(idx)
    x(idx) = val;
    if checkZerosConstraint(x) == 0 && sum(x) <= sumVal
        if idx < 12
            addValueRecursive(x,idx+1);
        else
            if sum(x) == sumVal
                disp(num2str(x))
            end
        end
    end
end

end

function c = checkZerosConstraint(x)

c = 0;
for j=1:11
    c = c + sum(x(j+1:j+x(j)-1));
end

end