0

特定の値よりも小さい2つの配列間の最適な組み合わせを探すコードがあります。コードは、一度に配列Bの各行から1つの値のみを使用します。

B =
       1           2           3
      10          20          30
     100         200         300
    1000        2000        3000

そして私が使用しているコードは:

B=[1 2 3; 10 20 30 ; 100 200 300 ; 1000 2000 3000];
A=[100; 500; 300 ; 425];
SA = sum(A);
V={}; % number of rows for cell V = num of combinations -- column = 1                
n = 1;
for k = 1:length(B)                    
    for idx = nchoosek(1:numel(B), k)'  
       rows = mod(idx, length(B));
       if ~isequal(rows, unique(rows)) %if rows not equal to unique(rows)
           continue  %combination possibility valid      
       end %Ignore the combination if there are two elements from the same row 
       B_subset = B(idx);
       if (SA + sum(B_subset) <= 2000) %if sum of A + (combination) < 2000
           V(n,1) = {B_subset(:)}; %iterate cell V with possible combinations
           n = n + 1;
        end
    end
end

ただし、このコードが結果をセルに格納する方法とは異なる方法で結果を表示したいと思います。

次のようなセルに結果を表示する代わりにV

[1]
[10]
[300]
[10;200]
[1000;30]
[1;10;300]

これが推奨されます:(各行X列はセル内の特定の位置を取ります)ここでは、これは、それらがとして配置される必要があることを意味しcell(1,1)={[B(1,x),B(2,y),B(3,z),B(4,w)]}ます。x y z w選択した値の列はどこにありますか。表示される出力は次のようになります。

[1;0;0;0]
[0;10;0;0]
[0;0;300;0]
[0;10;200;0]
[0;30;0;1000]
[1;10;300;0]

各回答では、行列Bの1行目から4行目までの値を選択して組み合わせを決定します。各行には3つの列があり、各行から一度に選択できる値は1つだけです。ただし、たとえばB(1,2)を使用できない場合は、ゼロに置き換えられます。たとえば、の行1をB使用できない場合はB(1,1:3)、単一の0になります。結果は[0; x;y;z]になります。

  • したがって、が21行目20から選択され、2行目から選択された場合、3行目と4行目は含まれていませんが、0が表示されます。したがって、答えは[2; 20;0;0]になります。
  • 4行目のみを使用する場合(たとえば1000など)、答えは[0; 0;0;1000]になります。

要約すると、私は以下を実装したいと思います:

  • 各セルにはlength(B)、Bのすべての行の値が含まれています(組み合わせに基づく)
  • 組み合わせに使用されない各値は0であり、セルに出力される必要があります

私は現在これを実装しようとしていますが、私のメソッドは機能していません..さらに情報が必要な場合は、私に知らせてください。

編集

以下のdfbの回答にコードを実装しようとしましたが、問題が発生しました。解決策の半分が含まれているため、回答を確認してください。

4

1 に答える 1

0

私のMATLABは非常に錆びていますが、このようなものはあなたが必要とすることをしませんか?

arr =  zeros(1,len(B))
arr(idx) = B_subset(:)
V(n,1) = {arr}
于 2013-03-08T01:24:32.093 に答える