生成一组在两种组合下形成总和的随机数

时间:2015-03-22 04:21:56

标签: python matlab heuristics

我想生成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.所以,显然我写的不会很有帮助。任何帮助都会很棒!

感谢。

1 个答案:

答案 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);