在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
我已经考虑了很长一段时间了,现在似乎无法解决这个问题 - 任何想法都有吗?
答案 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