我想生成16个随机非负整数,比如a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p。
a+b+c+d = a particular sum
e+f+g+h = another sum
i+j+k+l = another sum
m+n+o+p = another sum
这很容易。但是,麻烦的是,
a+e+i+m = another sum
b+f+j+n = another sum
c+g+k+o = another sum
d+h+l+p = another sum
我在Matlab中编写了一个非常精细的代码,生成满足条件的数字。代码大约需要0.5秒,并在运行1000次迭代后生成大约920个这样的数组。 16号是原型。实际的数字是1794.所以,显然我写的不会很有帮助。任何帮助都会很棒!
感谢。
答案 0 :(得分:0)
这个问题可以解决为具有随机加权成本函数的整数程序,然后每次运行此代码时,都会得到不同的解决方案。
A = [A1; -A1; -eye(N)]
b = [sum1; sum2; ...; sumM ; -sum1; -sum2; ... ; -sumM; zeros(N,1)];
intcon = N;
f = randn(N,1); %random cost function, will generate different solution everytime
solution = intlinprog(f,intcon,A,b);
其中A1
是表示总和的矩阵,在您的示例中它将是
A1 = [1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0;
1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0;
1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0;
1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0;
1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0;
0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0;
0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0;
0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1];
简而言之,您将约束转换为Ax <= b
。
改进的表现形式:
Aeq = A1
beq = [sum1; sum2; ...; sumM];
ub = inf*ones(N,1);
lb = zeros(N,1);
intcon = N;
f = randn(N,1); %random cost function, will generate different solution everytime
solution = intlinprog(f,intcon,[],[], Aeq, beq, lb, ub);