美文网首页
分支界限法(BFS)

分支界限法(BFS)

作者: 鱿鱼炸酱面 | 来源:发表于2021-09-27 17:59 被阅读0次
应用场景

分支限界法的求解目标是找出满足约束条件的一个解,或是在满足约束条件的解中找出的在某种意义下的最优解。

装载问题
import java.util.LinkedList;
import java.util.Queue;

public class BestLoading {

    public static void main(String[] args) {
        float c1 = 12;  // 第一艘船的载重量
        float c2 = 10;  // 第二艘船的载重量
        float[] goods = {8, 6, 2, 3};      // 货箱质量数组
        float sumGoods = 0;  // s为所有货箱的重量之和
        for (float g : goods) {
            sumGoods += g;
        }
        // 创建分支界限队列搜索对象
        BranchLimitFIFOSearch bFis = new BranchLimitFIFOSearch();
        float bestW = bFis.maxLoading(c1, goods);
        if (sumGoods - bestW <= c2) {
            System.out.println("第一艘船装载" + bestW);
            System.out.println("第二艘船装载 " + (sumGoods - bestW));
        } else {
            System.out.println("无解!");
        }
    }
}

class BranchLimitFIFOSearch {
    float bestW;

    //求最优装载值
    public float maxLoading(float c, float[] goods) {
        Queue<Float> mq = new LinkedList<>(); // FIFO队列
        mq.add((float) -1); // 初始化结点队列,"-1"入队标记分层
        int n = goods.length; //货箱个数
        int i = 0; // E-结点的层
        float ew = 0; // 当前船的装载量
        bestW = 0; // 目前的最优值

        while (!mq.isEmpty()) { // 搜索子集空间树
            if (ew + goods[i] <= c) { // 检查E-结点的左孩子,货箱i是否可以装载
                addLiveNode(ew + goods[i], i, mq, n); // 货箱i可以装载
            }
            addLiveNode(ew, i, mq, n); // 右孩子总是可行的(不需要检查),不装载货物i
            ew = mq.remove(); // 取下一个结点

            if (ew == -1) { // 到达层的尾部
                if (mq.isEmpty()) {
                    return bestW;
                }
                mq.add((float) -1);//每处理完一层让"-1"入队,以此来标识"层"
                ew = mq.remove(); // 取下一个结点
                i++; // ew的层 (当层次为n时,搜索完全部叶结点,算法结束)
            }
        }
        return bestW;
    }

    //添加活结点(wt:当前装载量,i:当前层数)
    public void addLiveNode(float wt, int i, Queue<Float> mq, int n) {
        if (i == n - 1) { // 可行叶结点
            if (wt > bestW) {
                bestW = wt;  //当前解由于当前最优解,更新最佳载重量
            }
        } else { // 非叶结点
            mq.add(wt);
        }
    }
}

相关文章

  • 分支界限法(BFS)

    应用场景 分支限界法的求解目标是找出满足约束条件的一个解,或是在满足约束条件的解中找出的在某种意义下的最优解。 装载问题

  • 分支限界法

    分支界限法原理   分支限界法和回溯法是类似的问题求解方法。回溯法是通过深度优先的方式对问题进行探索性的解决,而分...

  • 分支界限法(Branch and Bound)-问题1: 0/

    本范例主要是通过分支界限法解决著名的0/1背包客问题 问题描述:有件商品,记为。每件商品的重量和价值分别为和;其中...

  • 算法理论 | 分支限界法

    分支限界法 分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树 分支限界法与回溯法的区别 ...

  • 广度优先搜索(Breadth-First-Search,缩写为B

    1. BFS是干嘛的? -- 解决异地恋乘车转车次数最少的问题,啊呸~ BFS是一种[盲目搜索是盲目搜索法,目的是...

  • 分治限界法

    以下均转载于:五大常用算法-分支界限,加入了一些我自己的想法 1.基本描述 类似于回溯法,也是一种在问题的解空间树...

  • 旅行商(TSP)问题专题——多种方法对比

    目录 1.问题描述1.1 问题描述1.2 各种方法的总结 1.2.1 分支限界法的总结 1.2.2 分支限界法与最...

  • 王辛-加一组-第四周第二十次作业-2017.06.23

    《超效率手册》--组织系统分支法 R I 1、what, 片段讲述了组织系统分支法的具体运用时需要关...

  • 五大基本算法——分支限界法

    一、基本思路 与回溯法一样,分支限界法也是在问题的解空间树上搜索问题的解的一种算法。 二、分支限界法与回溯法的区别...

  • 微众银行

    1.C++多继承时的初始化列表顺序。2.数据结构的线性与非线性3.分支界限法???4.正则表达式5.数组名6.C/...

网友评论

      本文标题:分支界限法(BFS)

      本文链接:https://www.haomeiwen.com/subject/ozhknltx.html