0

我有一个代码可以在两个小于特定值的数组之间寻找最佳组合。该代码一次仅使用数组 B 的每一行中的一个值。

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 列,并且每行一次只能选择一个值。但是,如果不能使用例如 B(1,2),它将被替换为零。例如,如果第 1 行B不能使用,那么B(1,1:3)将是单个 0。结果将是 [0;x;y;z]。

  • 因此,如果2从第1 行中选择,并且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 回答