【问题标题】:Branch and bound algorithm for the Set Cover problem? [closed]Set Cover 问题的分支定界算法? [关闭]
【发布时间】:2010-12-05 02:50:26
【问题描述】:

有人可以与我分享一个使用分支和绑定方法解决 Set Cover 问题的 java 程序吗? 以下是我到目前为止所拥有的。因此,在每个阶段,算法都应该获取一个集合并获取问题的两个实例: 1. 从数组列表中选择第一个集合 2. 不要从数组列表中获取第一个集合。 在这一点上,我被困在如何启动分支和绑定上。

导入 java.util.*;

public class BranchAndBound {
    static int bestSoFar=100;
    static int count=0;
    public static void main(String args[]){

    //create the universe
    int numU = 10;
    MySets universe = new MySets();
    for(int i=1;i<=numU;i++){
           universe.add(i);
    }

    //create each set
    MySets s1 = new MySets();
    MySets s2 = new MySets();
    MySets s3 = new MySets();
    MySets s4 = new MySets();
    MySets s5 = new MySets();

    ArrayList<MySets> s=new ArrayList<MySets>();
    //elements
    s1.add(1);s1.add(2);s1.add(3);s1.add(8);s1.add(9);s1.add(10);
    s2.add(1);s2.add(2);s2.add(3);s2.add(4);s2.add(5);
    s3.add(4);s3.add(5);s3.add(7);
    s4.add(5);s4.add(6);s4.add(7);
    s5.add(6);s5.add(7);s5.add(8);s5.add(9);s5.add(10);

    s.add(s1);s.add(s2);s.add(s3);s.add(s4);s.add(s5);
    branchAndBound(universe,s,0);

    }

    public static void branchAndBound(MySets U,ArrayList<MySets> listSets,int countSelected){
        MySets universe = new MySets();
        universe.addAll(U);

        ArrayList<MySets> s=new ArrayList<MySets>();
        s.addAll(listSets);

        MySets selectedSet= new MySets();

        selectedSet.addAll(listSets.get(0));
        count++;

        universe.removeAll(selectedSet);//the universe now contains the elements still need to be covered
        listSets.remove(0);//remove the first elemeent from the list

        displaySet(selectedSet, "selected set");
        displaySet(universe, "universe");

        while(!universe.isEmpty() && !listSets.isEmpty()){
            branchAndBound(universe,listSets,count);
        }
    }




public static void displaySet(MySets s, String name){
    System.out.print(name+"==>");
    Iterator it=s.iterator();
    while(it.hasNext()){
      Integer value=(Integer)it.next();
      System.out.print(+value+" ");
    }//while
    System.out.println();
}//displaySet
}

【问题讨论】:

    标签: java algorithm


    【解决方案1】:

    我相信你之前问过一个类似的问题和一个相关的问题here。正如那里指出的那样,集合覆盖是 NP-Hard。因此,已知不存在任何多项式算法。当您从问题的细节中抽象出来时,它就是一个整数程序 (IP)。因此,您可以使用任何通用 IP 解算器,例如 MS-Excel 中提供的解算器。所有一般整数规划问题都使用分支定界方法解决。因此,您不需要一个专门用于 Set Covering 的设备。您需要做的就是将集合覆盖问题制定为一个整数程序,并将其提供给应该处理其余部分的求解器。 SO 上的人们不太可能有现成的代码可以与您共享。整数规划/线性规划(构成整数规划的基础)代码非常详细和专业。

    【讨论】:

    • 是的,我做到了。没有多时间算法。设置封面以找到最小值。设置封面,我同意。但我们可以设计分支和绑定算法。找到最小值,这不会是多时间,但会生成一个最小值。设置封面。
    • @user:我不明白你为什么需要“设计”一个 B&B 算法。我可以看到你有homework 标签...我真的很惊讶你必须从头开始为你的作业设计一个 B&B 算法。这是要编程以便它可以解决任何大小的问题吗?或者您是否有一个小问题需要(手动)展示分支定界算法在解决它时将遵循的步骤?
    • 我真的没有把作业标签放在我的问题上。其他人做了并为混乱道歉。这不是家庭作业问题。我知道这是一个 np 难题,我正在尝试编写一个使用 B&B 找到最小覆盖率的 java 程序,但我不知道从哪里开始。我正在更新我的帖子以显示我到目前为止所写的内容。非常感谢
    • @user:如果这不是家庭作业,那么您正在尝试在这里重新发明轮子......那里有很多 IP 求解器......MS Solver 和 ILOG CPLEX 仅举几例...... .为什么要从头开始编写 B&B 求解器?只需将模型呈现给现成的求解器即可。
    • 我敢肯定很多人之前都尝试过用B&B的方式自己解决这个问题。
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 1970-01-01
    • 2012-08-20
    • 1970-01-01
    • 2012-12-18
    相关资源
    最近更新 更多