生成一组随机数,在两个组合下形成和



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

谢谢。

这个问题可以作为具有随机加权成本函数的整数程序来解决,然后每次运行此代码时,都会得到不同的解决方案。

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

最新更新