【问题标题】:Algorithm to find possible combinations in Matlab with one constraint?在具有一个约束的Matlab中找到可能组合的算法?
【发布时间】:2013-02-17 07:45:03
【问题描述】:

一个非常简单的例子:

A=[100 250 300]

如何找到所有可能的组合,只要每个组合的总和小于 500 ?

【问题讨论】:

  • 你的数组总是大小为 3 吗?
  • 澄清一下,对于上面的例子你想返回[250 100], [100], [250], [300], [300 100]?
  • @learnvst 是的,完全正确。

标签: matlab combinations linear-programming


【解决方案1】:

这段代码应该可以工作。结果将存储在元胞数组C中:

A = [100 250 300];
B = 500;
C = cell(0);

for i = 1:size(A,2)
    D = nchoosek(A,i);
    for j = 1:size(D,1)
        if (sum(D(j,:)) < B)
            C{end+1} = D(j,:);
        end
    end
end

或更紧凑:

A = [100 250 300];
B = 500;
C = cell(0);

for i = 1:size(A,2)
    C = [C; num2cell(nchoosek(A,i),2)];
end
C = C(cellfun(@(x) sum(x), C) < B);

【讨论】:

    【解决方案2】:

    这个简单的代码

    A=[100 250 300];
    p = perms(A);
    
    for nn = 1:numel(A)    
        p(sum(p(:,1:nn), 2) < 500, 1:nn)
    end
    

    给出以下输出

    ans =
    
       300
       300
       250
       250
       100
       100
    
    ans =
       300   100
       250   100
       100   250
       100   300
    

    如果要删除重复项,例如 [300 100] 和 [100 300],只需使用 sort 命令对值进行排序,然后您可以使用 unique 删除重复项

    【讨论】:

    • 您能解释一下如何删除重复项吗?我无法让它工作。
    • 查看unique 的文档,特别是关于C = unique(A,'rows') 的部分
    猜你喜欢
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 2018-05-03
    相关资源
    最近更新 更多