【算法分析与设计】分支限界法(下)

news2024/10/7 6:46:05

目录

  • 一、最大团问题
    • 1.1 问题描述
    • 1.2 上界函数
    • 1.3 算法思想
  • 二、旅行售货员问题
    • 2.1 问题描述
    • 2.2 算法描述
  • 三、电路板排列问题
    • 3.1 算法描述
  • 四、批处理作业调度问题
    • 4.1 问题的描述
    • 4.2 限界函数
    • 4.3 算法描述
  • 五、小结
  • 六、随机化算法


一、最大团问题

1.1 问题描述

  给定无向图G=(V,E)。如果UV,且对任意u,vU有(u,v)E,则称U是G的完全子图。G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点数最多的团
  下图G中,子集{1,2}是G的大小为2的完全子图这个完全子图不是团,因为它被G的更大的完全子图{1,2,5}包含。{1,2,5}是G的最大团。{1,4,5}和{2,3,5}也是G的最大团。
在这里插入图片描述


1.2 上界函数

  用变量cliqueSize表示 与该结点相应的团的顶点数level表示 结点在子集空间树中所处的层次;用cliqueSize +n-level+1作为顶点数上界upperSize的值。
  在此 优先队列式分支限界法 中,upperSize实际上也是优先队列中元素的优先级算法总是从活结点优先队列中抽取具有最大upperSize值的元素作为下一个扩展元素


1.3 算法思想

  子集树根结点是初始扩展结点,对于这个特殊的扩展结点,其cliqueSize的值为0。
  算法在扩展内部结点时,首先考察其左儿子结点。在左儿子结点处,将顶点i加入到当前团中,并检查该顶点与当前团中其它顶点之间是否有边相连。当顶点i与当前团中所有顶点之间都有边相连,则相应的左儿子结点是可行结点将它加入到子集树中并插入活结点优先队列,否则就不是可行结点
  接着继续考察当前扩展结点的右儿子结点。当upperSize>bestn时,右子树中可能含有最优解,此时将右儿子结点加入到子集树中并插入到活结点优先队列中。

  算法的while循环的 终止条件遇到子集树中的一个叶结点(即n+1层结点)成为当前扩展结点
  对于子集树中的叶结点,有upperSize=cliqueSize。此时活结点优先队列中剩余结点的upperSize值均不超过当前扩展结点的upperSize值,从而进一步搜索不可能得到更大的团,此时算法已找到一个最优解
  由于算法找到一个解就结束,所以无法找到该问题的所有解,这也是分支限界法的缺点!
在这里插入图片描述
  左子树:从顶点i到已选入的顶点集中每一个顶点都有边,否则剪枝
  右子树:顶点数上界小于当前最优值(就是上面的bestn)时剪枝
  顶点数上界=已确定的顶点数+未确定的顶点数的上界,以此作为优先队列中结点的优先级
在这里插入图片描述


二、旅行售货员问题

2.1 问题描述

  某售货员要到若干城市去推销商品,已知各城市之间的路程(或旅费)。他要选定一条从驻地出发,经过每个城市一次,最后回到驻地的路线,使总的路程(或总旅费)最小
  路线是一个 带权图图中各边的费用(权)为正数。图的一条周游路线是包括V中的每个顶点在内的一条回路周游路线的费用是这条路线上所有边的费用之和
  旅行售货员问题的解空间可以组织成一棵树,从树的根结点到任一叶结点的路径定义了图的一条周游路线。旅行售货员问题要在图G中找出费用最小的周游路线。


2.2 算法描述

在这里插入图片描述
  算法开始时创建一个最小堆,用于表示 活结点优先队列堆中每个结点的子树费用的下界lcost值是优先队列的优先级。接着算法计算出图中每个顶点的最小费用出边并用minout记录。如果所给的有向图中某个顶点没有出边,则该图不可能有回路,算法即告结束。如果每个顶点都有出边,则根据计算出的minout作算法初始化。
  算法的while循环体完成对排列树内部结点的扩展。对于当前扩展结点,算法分2种情况进行处理:
  1、首先考虑 s=n-2 的情形,此时当前扩展结点是排列树中某个叶结点的父结点。如果该叶结点相应一条可行回路且费用小于当前最小费用,则将该叶结点插入到优先队列中,否则舍去该叶结点。
  2、当 s<n-2 时,算法依次产生当前扩展结点的所有儿子结点。由于当前扩展结点所相应的路径是x[0:s],其可行儿子结点是从剩余顶点x[s+1:n-1]中选取的顶点x[i],且(x[s],x[i])是所给有向图G中的一条边。对于当前扩展结点的每一个可行儿子结点,计算出其前缀(x[0:s],x[i])的费用cc和相应的下界lcost。当lcost<bestc时,将这个可行儿子结点插入到活结点优先队列中
在这里插入图片描述
  算法中while循环的终止条件是排列树的一个叶结点成为当前扩展结点。当s=n-1时,已找到的回路前缀是x[0:n-1],它已包含图G的所有n个顶点。因此,当s=n-1时,相应的扩展结点表示一个叶结点。此时该叶结点所相应的回路的费用等于cc和lcost的值剩余的活结点的lcost值不小于已找到的回路的费用。它们都不可能导致费用更小的回路。因此已找到的叶结点所相应的回路是一个最小费用旅行售货员回路,算法可以结束。
  算法结束时返回找到的最小费用,相应的最优解由数组v给出
在这里插入图片描述


三、电路板排列问题

  将n块电路板以最佳排列方式插入带有n个插槽的机箱中。n块电路板的不同排列方式对应于不同的电路板插入方案。设B={1, 2, …, n}是n块电路板的集合,L={N1, N2, …, Nm}是连接这n块电路板中若干电路板的m个连接块。Ni是B的一个子集,且Ni中的电路板用同一条导线连接在一起。设x表示n块电路板的一个排列,即在机箱的第i个插槽中插入的电路板编号是x[i]。x所确定的电路板排列Density (x)密度定义为跨越相邻电路板插槽的最大连线数

  例:如图,设n=8, m=5,给定n块电路板及其m个连接块:B={1, 2, 3, 4, 5, 6, 7, 8},N1={4, 5, 6},N2={2, 3},N3={1, 3},N4={3, 6},N5={7, 8};其中两个可能的排列如图所示,则左电路板排列的密度是2。
在这里插入图片描述
在这里插入图片描述
  在设计机箱时,插槽一侧的布线间隙由电路板的排列的密度确定。因此,电路板排列问题要求对于给定的电路板连接条件(连接块),确定电路板的最佳排列,使其具有最小密度
  电路板排列问题的 解空间是一颗排列树。采用优先队列式分支限界法找出所给电路板的最小密度布局。算法中采用最小堆表示活节点优先级队列


3.1 算法描述

  算法开始时,将排列树的根结点置为当前扩展结点在do-while循环体内算法依次从活结点优先队列中取出具有最小cd值的结点作为当前扩展结点,并加以扩展
  首先考虑s=n-1的情形,当前扩展结点是排列树中的一个叶结点的父结点。x表示相应于该叶结点的电路板排列。计算出与x相应的密度并在必要时更新当前最优值和相应的当前最优解。
  当s<n-1时,算法依次产生当前扩展结点的所有儿子结点。对于当前扩展结点的每一个儿子结点node,计算出其相应的密度node.cd。当node.cd<bestd时,将该儿子结点N插入到活结点优先队列中。

do {// 结点扩展
      if (E.s == n - 1) {// 仅一个儿子结点
         int ld = 0; // 最后一块电路板的密度
         for (int j = 1; j <= m; j++)
            ld += B[E.x[n]][j];
         if (ld < bestd) {// 密度更小的电路板排列
            delete [] bestx;
            bestx = E.x;
            bestd = max(ld, E.cd);
            }

  S=n-1的情况,计算出此时的密度和bestd进行比较。

else
         {// 产生当前扩展结点的所有儿子结点
 for (int i = E.s + 1; i <= n; i++) {
         BoardNode N;
         N.now = new int [m+1];
         for (int j = 1; j <= m; j++)
            // 新插入的电路板
            N.now[j] = E.now[j] + B[E.x[i]][j];         

int ld = 0; // 新插入电路板的密度
         for (int j = 1; j <= m; j++)
            if (N.now[j] > 0 && total[j] != N.now[j]) ld++;
         N.cd = max(ld, E.cd);
         if (N.cd < bestd) {// 可能产生更好的叶结点
         //计算出每一个儿子结点的密度与bestd进行比较大于bestd时加入队列
            N.x = new int [n+1]; N.s = E.s + 1;
            for (int j = 1; j <= n; j++) N.x[j] = E.x[j]; 
            N.x[N.s] = E.x[i]; N.x[i] = E.x[N.s]; H.Insert(N);}
         else delete [] N.now;}
         delete [] E.x;}

四、批处理作业调度问题

4.1 问题的描述

  给定n个作业的集合J={J1,J2,…,Jn}。每一个作业Ji都有2项任务要分别在2台机器上完成。每一个作业必须先由机器1处理,然后再由机器2处理。作业Ji需要机器j的处理时间为tji,i=1,2,…,n;j=1,2。对于一个确定的作业调度,设是Fji是作业i在机器j上完成处理的时间。则所有作业在机器2上完成处理的时间和在这里插入图片描述 称为该作业调度的完成时间和。批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小


4.2 限界函数

  在结点E处相应子树中叶结点完成时间和的下界是:
在这里插入图片描述
  注意到如果选择Pk,使t1pk在k>=r+1时依非减序排列,S1则取得极小值。同理如果选择Pk使t2pk依非减序排列,则S2取得极小值
在这里插入图片描述
  这可以作为 优先队列式分支限界法中的限界函数
在这里插入图片描述


4.3 算法描述

  算法的while循环完成对排列树内部结点的有序扩展。在while循环体内算法依次从活结点优先队列中取出具有最小bb值(完成时间和下界)的结点作为当前扩展结点,并加以扩展
  首先考虑E.s=n的情形,当前扩展结点E是排列树中的叶结点。E.sf2是相应于该叶结点的完成时间和。当E.sf2 < bestc时更新当前最优值bestc和相应的当前最优解bestx。
  当E.s<n时,算法依次产生当前扩展结点E的所有儿子结点。对于当前扩展结点的每一个儿子结点node,计算出其相应的完成时间和的下界bb。当bb < bestc时,将该儿子结点插入到活结点优先队列中。而当bb bestc时,可将结点node舍去。
在这里插入图片描述

else {// 产生当前扩展结点的儿子结点
         for (int i = E.s; i < n; i++) {
               Swap(E.x[E.s],E.x[i]);
               int f1,f2;
               int bb=Bound(E,f1,f2,y);
               if (bb < bestc ) {
               //当bb<bestc时,将儿子结点插入到活结点优先队列中
                   MinHeapNode N;
                   N.NewNode(E,f1,f2,bb,n);
                   H.Insert(N);}
               Swap(E.x[E.s],E.x[i]);
               }
         delete [] E.x;}  // 完成结点扩展

五、小结

  与回溯法非常相似,但采用广度优先或者最小代价优先
  下层结点可能优于上层节点扩展,到叶节点算法可以结束
  分支限界法适用于组合优化问题
  当前结点为根子树的可行解的上界或下界
  极大化与极小化问题的区别
  定义界的初值,得到新的更好的可行解就更新界


六、随机化算法

  现有一片不规则的树叶,如何在不使用微积分的情况下,求该叶片的面积,要求保留小数点后两位
  如果可以用微积分,只要获得叶片边缘曲线方程即可,无任何难度
  古人没有微积分,也能求出面积,而且很准,请问是如何求得的?
  求解的方法可以认为就是随机化算法

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1090863.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年中国智能矿山发展历程及趋势分析:智能矿山健康有序发展[图]

智能矿山系统对矿山生产提质增效的效果已经开始显现&#xff1a;对不合规、有风险的行动进行及时预警&#xff0c;减少安全事故发生概率&#xff0c;避免因停产整顿产生的巨额亏损&#xff1b;精细化管理整个生产流程&#xff0c;避免过往传统粗放的流程导致的浪费&#xff0c;…

2023年中国精准PCI行业发展规模及发展趋势分析:精准PCI日益普及[图]

精准PCI的主要诊断技术包括作为血管内生理学诊断技术的血流储备分数&#xff08;FFR&#xff09;&#xff0c;以及作为成像技术的血管内超声 &#xff08;IVUS&#xff09;及光学相干断层扫描&#xff08;OCT&#xff09;。随着功能性和解剖评估的发展&#xff0c;在精密PCI领…

IDEA启动C:\Users\badboy\.jdks\corretto-17.0.7\bin\java.exe -Xmx700m报错

出现的现象 这里没有记录当时的截图&#xff0c;主要报错如下&#xff1a; C:\Users\badboy.jdks\corretto-17.0.7\bin\java.exe -Xmx700m … Error occurred during initialization of VM Failed setting boot class path. 排查方式 遇到这种问题我首先就是百度&#xff0c;…

14.4 Socket 双向数据通信

所谓双向数据传输指的是客户端与服务端之间可以无差异的实现数据交互&#xff0c;此类功能实现的核心原理是通过创建CreateThread()函数多线程分别接收和发送数据包&#xff0c;这样一旦套接字被建立则两者都可以异步发送消息&#xff0c;本章将实现简单的双向交互功能。 首先…

2023年中国光纤传感器发展历程、需求量及行业市场规模分析[图]

光纤传感器是利用光纤作为媒介&#xff0c;将外界温度、应变等被测量转化为光纤中传输的光波的强度、相位、频率、波长、偏振态等光学信息的部件。光纤传感器由光源、入射光纤、出射光纤、光调制器、光探测器及解调器组成。其基本原理是将光源的光经入射光纤送入调制区&#xf…

嵌入式开发学习之STM32F407点亮LED及J-Link下载(二)

嵌入式开发学习之STM32F407点亮LED及J-Link下载&#xff08;二&#xff09; 开发涉及工具控制端口配置端口的设定与确认端口配置方法实现点亮LED程序下载与仿真 有工程实例&#xff0c;链接在最底部。 开发涉及工具 开发环境&#xff08;IDE&#xff09;&#xff1a;IAR-ARM8…

2023年中国尾气净化催化材料产量、需求量及行业市场规模分析[图]

尾气处理催化单元系由催化剂厂商将以催化材料和活性组分物质为主要组成的催化剂涂覆在蜂窝陶瓷或金属等载体上而成&#xff0c;催化剂则起到处理尾气中有害物质的各类化学反应的关键催化作用&#xff0c;主要由稀土材料、氧化铝材料、贵金属材料等催化材料和增强催化材料性能的…

华为云云耀云服务器L实例评测 | 实例评测使用之硬件参数评测:华为云云耀云服务器下的 Linux 网络监控神器 bmon

华为云云耀云服务器L实例评测 &#xff5c; 实例评测使用之硬件参数评测&#xff1a;华为云云耀云服务器下的 Linux 网络监控神器 bmon 介绍华为云云耀云服务器 华为云云耀云服务器 &#xff08;目前已经全新升级为 华为云云耀云服务器L实例&#xff09; 华为云云耀云服务器是什…

Ubuntu中不能使用ifconfig命令

​ 问题 打开终端使用如下命令不能运行&#xff1a; ifconfig显示如下错误: 解决方法 在VMware中的虚拟机下面打开“编辑虚拟机设置”&#xff0c;或者在已经打开的虚拟机面板上面打开“虚拟机—设置” 选择网络适配器&#xff0c;选择“NAT模式”&#xff0c;没开机的就…

如何使用C/C++刷新在终端上已经打印的内容

写本文的起源是因为在安装一些工具的时候&#xff0c;发现在终端上并行安装的情况下&#xff0c;显示安装信息是会修改之前已经打印出来的内容&#xff0c;这是怎么做到的呢&#xff1f;抱着对这个问题的好奇我进行了一些探索。 终端是如何运行的 首先是最关键的问题&#xf…

华为OD机考算法题:基站维修工程师

题目部分 题目基站维护工程师难度难题目说明题目说明小王是一名基站维护工程师&#xff0c;负责某区域的基站维护。 某地方有 n 个基站 ( 1 < n < 10 )&#xff0c;已知各基站之间的距离 s ( 0 < s < 500 )&#xff0c;并目基站 x 到基站 y 的距离&#xff0c;与基…

力扣第669题 修剪二叉搜索树 c++(注释)

题目 669. 修剪二叉搜索树 中等 相关标签 树 深度优先搜索 二叉搜索树 二叉树 给你二叉搜索树的根节点 root &#xff0c;同时给定最小边界low 和最大边界 high。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[low, high]中。修剪树 不应该 改变保留在树中的元…

实验室超声波清洗机有什么优点?

无论是在工业生产中&#xff0c;还是在日常生活中&#xff0c;清洁工作总是贯穿其中。特别是在社会加工过程中&#xff0c;必须清洗仪器和表面的工作量很大。此外&#xff0c;还有许多人力不能接触到需要清洗的部分&#xff0c;需要使用专业设备进行清洗工作。实验室超声波清洗…

【数值分析】0 - 数值分析绪论

文章目录 一、数值分析介绍二、数值分析应用2.1 解三角函数2.2 计算多项式2.3 解线性方程组2.4 供水计划和生产调度计划的制定2.5 湘江水流量估计的实际意义2.6 机器学习或大数据 三、数值分析内容四、数值分析参考书目 学习视频&#xff1a;《数值分析》| 华科 | 研究生基础课…

C++标准模板(STL)- 类型支持 (数值极限,max_digits10,radix,min_exponent)

数值极限 定义于头文件 <limits> 定义于头文件 <limits> template< class T > class numeric_limits; numeric_limits 类模板提供查询各种算术类型属性的标准化方式&#xff08;例如 int 类型的最大可能值是 std::numeric_limits<int>::max() &…

XXL-Job分布式任务调度框架-单机模式和分片模式执行任务4

一 调度模式分类 1.1 调度模式 1.单个任务&#xff1a;一个任务实例便可完成 a)单机单任务&#xff1a;单机模式下任何路由模式都只有一个实例执行 b)集群单任务&#xff1a;由路由策略(广播模式除外)选择其中一个实例完成 2.集群部署&#xff1a;每个实例都同时执行一部分…

RS232电路设计

学习一下RS232的电路设计 在学习过RS485电路设计后&#xff0c;对232就没那么陌生了。 下面我来说一下对于一个新手从0到1 的过程 首先我会查询关于RS232的相关只是&#xff0c;对他有初步了解&#xff0c;在485的基础上很好理解232了。 串口、COM口、UART口, TTL、RS-232、…

尚硅谷Flink(一)

目录 ☄️前置工作 fenfa脚本 &#x1f30b;概述 ☄️Flink是什么 ☄️特点&#xff08;多nb&#xff09; ☄️应用场景&#xff08;不用看&#xff09; ☄️分层API &#x1f30b;配环境 ☄️wordcount ☄️WcDemoUnboundStreaming &#x1f30b;集群部署 ☄️集…

机器视觉工程师为什么要反复调试?

目录 那么程序debug原因有哪些&#xff1f;图像处理debug的原因有哪些&#xff1f; 我们机器视觉项目的程序包含&#xff0c;业务逻辑图像处理&#xff0c;所以我们不单单调试图像处理部分&#xff0c;还要调试C#&#xff0c;界面&#xff0c;数据等等。我们必须保证程序稳定性…

手把手带你用Python和文心一言搭建《AI看图写诗》网页项目(附上完整项目源码)

今年年初&#xff0c;ChatGPT的火爆在全球掀起AI大模型的开发热潮&#xff0c;国内外的科技公司纷纷加入“百模大战”行列。百度在率先发布了国内第一款人工智能大语言模型“文心一言”后&#xff0c;又推出了文心千帆大模型平台&#xff0c;帮助企业和开发者加速大模型应用落地…