五大算法之分支定界法 2——通过剪枝提升效率

本贴最后更新于 3015 天前,其中的信息可能已经时过境迁

上篇博客(五大算法之分支定界法)介绍了使用分支定界法解决装载问题,该算法的时间、空间复杂度均为2^n,这篇博客考虑如何改进该算法,提升效率。

每次加入活节点之前,都需要考虑一下当前装载重量加上剩余货物总重量是否大于当前最优解,如果不是的话则表明该分支不可能在产生最优解,可以去除。也即根据这个约束条件进行剪枝。

改进后运行w={ 10, 2, 5, 7, 5, 9, 4, 3, 2, 5, 3, 3, 4, 2, 3, 4, 3, 3, 4, 1, 2, 1, 2, 1, 2, 1 }实例,需要1838ms,没有优化之前的算法需要27776ms,效率提升明显。

代码:

package test;

import java.util.LinkedList;

/**

  • 用分支定界法求装载问题,改进版
  • @author yanghang

*/
public class Fenzhidingjie2 {

private static float[] w = { 10, 2, 5, 7, 5, 9, 4, 3, 2, 5, 3, 3, 4, 2, 3, 4, 3, 3, 4, 1, 2, 1, 2, 1, 2, 1 }; // 货箱质量数组 private static int n = w.length; // 货箱数量 private static float c1 = 50; // 第一艘船的载重量 private static float c2 = 50; // 第二艘船的载重量 private static float bestw; // 第一艘船的最大装载 private static float ew; // 当前船的装载量 private static LinkedList<Float> mq = new LinkedList<Float>(); // FIFO队列 /** * 最优装载值 * * @param c */ public static float maxLoading(float c) { mq.addLast(new Float(-1)); // 初始化结点队列,标记分层 int i = 0; // E-结点的层 ew = 0; // 当前船的装载量 bestw = 0; // 目前的最优值 // 剩余货物的重量,用于剪枝 float r = 0; for (float f : w) { r += f; } r -= w[0]; while (!mq.isEmpty()) { // 搜索子集空间树 // 检查E-结点的左孩子,货箱i是否可以装载 if (ew + w[i] <= c) { if (ew + w[i] > bestw) { bestw = ew + w[i]; // 更新最优值 } addLiveNode(ew + w[i], i); // 货箱i可以装载 } // 剪枝,当前重量加剩余重量大于当前最优值才继续,否则该分支不可能产生最优解 if (ew + r > bestw) { addLiveNode(ew, i); // 右孩子总是可行的,不装载货物i } ew = (Float) mq.removeFirst(); // 取下一个结点 if (ew == -1) { // 到达层的尾部 if (mq.isEmpty()) { return bestw; } mq.addLast(new Float(-1)); ew = (Float) mq.removeFirst(); // 取下一个结点 i++; // ew的层 r -= w[i]; // 更新剩余重量 } } return bestw; } /** * 入队 * * @param wt * @param i */ public static void addLiveNode(float wt, int i) { if (i == n - 1) { // 下标从0开始,是叶子 if (wt > bestw) { bestw = wt; } } else { // 不是叶子 mq.addLast(new Float(wt)); } } public static void main(String[] args) { // TODO Auto-generated method stub // 所有货箱的重量之和 long start = System.currentTimeMillis(); float s = 0; for (float f : w) { s += f; } if (s <= c1 || s <= c2) { System.out.println("need only one ship!"); } if (s > c1 + c2) { System.out.println("no solution!"); return; } float bestw = Fenzhidingjie2.maxLoading(c1); if (s - bestw <= c2) { System.out.println("The first ship loading " + bestw); System.out.println("The second ship loading " + (s - bestw)); } else { System.out.println("no solution!"); } long end = System.currentTimeMillis(); System.out.println(end - start); }

}

  • 算法
    429 引用 • 254 回帖 • 24 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    132 引用 • 1115 回帖 • 119 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 679 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 2 关注
  • Sillot

    Insights(注意当前设置 master 为默认分支)

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。

    主仓库地址:Hi-Windom/Sillot

    文档地址:sillot.db.sc.cn

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    3. ⚠️ 汐洛绞架基于思源笔记,开发者尽最大努力与思源笔记保持兼容,但无法实现 100% 兼容
    29 引用 • 25 回帖 • 105 关注
  • wolai

    我来 wolai:不仅仅是未来的云端笔记!

    2 引用 • 14 回帖 • 1 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 787 关注
  • GitLab

    GitLab 是利用 Ruby 一个开源的版本管理系统,实现一个自托管的 Git 项目仓库,可通过 Web 界面操作公开或私有项目。

    46 引用 • 72 回帖 • 1 关注
  • DNSPod

    DNSPod 建立于 2006 年 3 月份,是一款免费智能 DNS 产品。 DNSPod 可以为同时有电信、网通、教育网服务器的网站提供智能的解析,让电信用户访问电信的服务器,网通的用户访问网通的服务器,教育网的用户访问教育网的服务器,达到互联互通的效果。

    6 引用 • 26 回帖 • 528 关注
  • ReactiveX

    ReactiveX 是一个专注于异步编程与控制可观察数据(或者事件)流的 API。它组合了观察者模式,迭代器模式和函数式编程的优秀思想。

    1 引用 • 2 回帖 • 175 关注
  • GitBook

    GitBook 使您的团队可以轻松编写和维护高质量的文档。 分享知识,提高团队的工作效率,让用户满意。

    3 引用 • 8 回帖 • 1 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 458 关注
  • 宕机

    宕机,多指一些网站、游戏、网络应用等服务器一种区别于正常运行的状态,也叫“Down 机”、“当机”或“死机”。宕机状态不仅仅是指服务器“挂掉了”、“死机了”状态,也包括服务器假死、停用、关闭等一些原因而导致出现的不能够正常运行的状态。

    13 引用 • 82 回帖 • 79 关注
  • RIP

    愿逝者安息!

    8 引用 • 92 回帖 • 393 关注
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 399 关注
  • jsoup

    jsoup 是一款 Java 的 HTML 解析器,可直接解析某个 URL 地址、HTML 文本内容。它提供了一套非常省力的 API,可通过 DOM,CSS 以及类似于 jQuery 的操作方法来取出和操作数据。

    6 引用 • 1 回帖 • 488 关注
  • 笔记

    好记性不如烂笔头。

    310 引用 • 794 回帖 • 1 关注
  • Windows

    Microsoft Windows 是美国微软公司研发的一套操作系统,它问世于 1985 年,起初仅仅是 Microsoft-DOS 模拟环境,后续的系统版本由于微软不断的更新升级,不但易用,也慢慢的成为家家户户人们最喜爱的操作系统。

    226 引用 • 476 回帖
  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 617 关注
  • OpenShift

    红帽提供的 PaaS 云,支持多种编程语言,为开发人员提供了更为灵活的框架、存储选择。

    14 引用 • 20 回帖 • 650 关注
  • 设计模式

    设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。

    200 引用 • 120 回帖 • 1 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖
  • sts
    2 引用 • 2 回帖 • 224 关注
  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    87 引用 • 139 回帖
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    946 引用 • 1460 回帖
  • 音乐

    你听到信仰的声音了么?

    61 引用 • 512 回帖
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 5 关注
  • 服务

    提供一个服务绝不仅仅是简单的把硬件和软件累加在一起,它包括了服务的可靠性、服务的标准化、以及对服务的监控、维护、技术支持等。

    41 引用 • 24 回帖 • 2 关注