あなたの持っているものは、しばしばinteger-linear programmingと呼ばれ、NP-hard(解決策が出るまで息を止めないこと)を意味します。
整数なしで解きたいのであれば、リニアプログラムがあり、linprog
を使うことができます。あなたは、未知のエントリのベクトルとしてご不明な行列を考える場合は、列合計は同様に、行の合計が
row_sum = repmat(eye(3),1,4);
row_sum =
1 0 0 1 0 0 1 0 0 1 0 0
0 1 0 0 1 0 0 1 0 0 1 0
0 0 1 0 0 1 0 0 1 0 0 1
これらは、あなたの等式制約されているだけで
col_sum = kron(eye(4),[1,1,1]);
col_sum =
1 1 1 0 0 0 0 0 0 0 0 0
0 0 0 1 1 1 0 0 0 0 0 0
0 0 0 0 0 0 1 1 1 0 0 0
0 0 0 0 0 0 0 0 0 1 1 1
です、その後もあなたは不等式制約を持っているだけに未知の値を束縛する。 linprog
はそれらを余分な引数として拘束できます。しかし、すべての未知数を最小化したものやそれらの1つまたは他の線形目的関数の和のようなものを作ることができる目的関数を持っていないか、空にしておけば実行可能な結果が得られます。
Aeq = [col_sum;row_sum]
beq = [2 6 6 1 5 7 3]';
X = linprog([],[],[],Aeq,beq,zeros(12,1),10*ones(12,1))% 0 <= vars <= 10
X = reshape(X,3,4)
X =
0.6550 2.0160 2.0160 0.3130
1.1192 2.5982 2.5982 0.6845
0.2258 1.3859 1.3859 0.0025
>> sum(X,1)
ans =
2.0000 6.0000 6.0000 1.0000
>> sum(X,2)
ans =
5.0000
7.0000
3.0000
ゼロなどが保証されているエントリがある場合は、すべてのソリューションが強制的に整数になる可能性があります。それ以外の場合は、非凸型の整数型プログラミングソルバを使用する必要があります。given here
このような解決策が指数関数的に多く存在することは確かです。 –