网络优化2|最小生成树|Kruskal|Prim|Matlab

news2024/9/24 7:18:38

最小生成树问题

连通图 G = ( V , E ) G=(V,E) G=(V,E),若G中不含任何回路,则称G为树。
∣ V ∣ = 1 |V |=1 V=1时称之为平凡树
![[Pasted image 20240826122021.png]]

生成树

G = ( V , E ) G=(V,E) G=(V,E),若G的一个生成子图是一棵树,则称之为G的一棵生成树,或者支撑树
![[Pasted image 20240826122236.png]]

定理

任何连通图至少有一棵生成树
![[Pasted image 20240826122331.png]]

最小生成树

无向图G的所有生成树中,边的权值总和最小的称为G的最小生成树,或最短树
![[Pasted image 20240826122525.png]]

性质

假设一个图中存在最小生成树,并且该图具有n个节点,m条边,则该图的最小生成树一定含有n个节点,并且具有n-1条边

最小生成树构造方法
  1. Kruskal算法
    每次选择一条最小且不会构成回路权边直至构成一个生成树
  2. Prim算法
    从一个结点的子图开始构造生成树:
    选择连接当前子图和子图外结点的最小权边,将相应结点和边加入子图,直至将所有结点加入子图。

构造最小生成树Kruskal算法

Kruskal算法基本思想
  1. 按所有边权值排序,升序(从小到大)
  2. 按排好序的边集合,选择一条边加入生成树
    贪心准则:不会产生环路
    按耗费递增顺序考察每条边
  • 若产生环路,丢弃
  • 否则,加入
Kruskal算法示例

![[Pasted image 20240826124506.png]]

B = ( 1 1 2 2 3 4 4 5 2 3 3 4 5 5 6 6 1 2 3 5 4 3 2 1 ) B=\begin{pmatrix} 1&&1&&2&&2&&3&&4&&4&&5 \\ 2&&3&&3&&4&&5&&5&&6&&6 \\ 1&&2&&3&&5&&4&&3&&2&&1 \end{pmatrix} B= 121132233245354453462561
按权值排序
B ′ = ( 1 5 1 4 2 4 3 2 2 6 3 6 3 5 5 4 1 1 2 2 3 3 4 5 ) B'=\begin{pmatrix} 1&&5&&1&&4&&2&&4&&3&&2 \\ 2&&6&&3&&6&&3&&5&&5&&4 \\ 1&&1&&2&&2&&3&&3&&4&&5 \end{pmatrix} B= 121561132462233453354245
加入第一条边
![[Pasted image 20240826125252.png]]

加入第二条边
![[Pasted image 20240826125337.png]]

第三条边
![[Pasted image 20240826125350.png]]

加入46
![[Pasted image 20240826125413.png]]

不能加入23,和45会形成回路
![[Pasted image 20240826125448.png]]

加入35
![[Pasted image 20240826125513.png]]

Kruskal算法的Matlab实现
s = [1 1 2 2 3 4 4 5]; 
t = [2 3 3 4 5 5 6 6];
weights = [1 2 3 5 4 3 2 1]; 
G = graph(s, t, weights);
p = plot(G, 'EdgeLabel', G.Edges.Weight);
[T, pred] = minspantree(G); 
highlight(p,T)

![[Pasted image 20240826125829.png]]

构造最小生成树Prim算法

贪心准则

  • 加入后仍形成树,且耗费最小
  • 始终保持树的结构一一Kruskal算法是森林
    算法过程
  1. 从单一顶点的树T开始
  2. 不断加入耗费最小的边 ( u , v ) (u,v) (u,v),使 T ∪ { ( u , v ) } T\cup \left\{ (u,v) \right\} T{(u,v)}仍为树
  3. u , v u,v u,v中有一个已经在T中,另一个不在T中
Prim算法示例过程

![[Pasted image 20240826132918.png]]

W = ( 0 1 2 ∞ ∞ ∞ 1 0 3 5 ∞ ∞ 2 3 0 ∞ 4 ∞ ∞ 5 ∞ 0 3 2 ∞ ∞ 4 3 0 1 ∞ ∞ ∞ 2 1 0 ) W=\begin{pmatrix} 0&&1&&2&&\infty&&\infty&&\infty \\ 1&&0&&3&&5&&\infty&&\infty \\ 2&&3&&0&&\infty&&4&&\infty \\ \infty&&5&&\infty&&0&&3&&2 \\ \infty&&\infty&&4&&3&&0&&1 \\ \infty&&\infty&&\infty&&2&&1&&0 \end{pmatrix} W= 0121035230450324301210
从v1开始,v2和v3选,选择权值小的那一条边,连接v1v2
![[Pasted image 20240826133434.png]]

从相邻的边开始选,v1v3,v2v3,v2v4中选,选择权值最小的边v1v3
![[Pasted image 20240826133526.png]]

从v2v4和v3v5选择权值小的边,v3v5
![[Pasted image 20240826133647.png]]

再选择v5v6
![[Pasted image 20240826133719.png]]

选择v6v4
![[Pasted image 20240826133730.png]]

Kruskal算法和Prim算法比较

![[Pasted image 20240826133825.png]]

m是边数,n是顶点

最小生成树的应用

制造系统的分组技术

![[Pasted image 20240826134117.png]]
![[Pasted image 20240826134200.png]]

设用 M i M_{i} Mi表示需由机器 i i i加工的零件集,对任意两台机器 i , j i,j i,j,定义相异度
w ( i , j ) = ∣ M i ⊕ M j ∣ M i ∪ M j w(i,j)=\frac{| M_{i}\oplus M_{j}|}{M_{i}\cup M_{j}} w(i,j)=MiMjMiMj
![[Pasted image 20240826134507.png]]

⊕ \oplus ,对称差
分子:在机器i但不在机器j上加工,或在机器j但不在机器i上加工的零件数
分母:或在机器i,或在机器j上加工的零件数
显然 0 ≤ w ≤ 1 0\le w\le 1 0w1

构造加权图

以机器为顶点,作一个完全图,每条边 ( i , j ) (i,j) (i,j)被赋予权 w ( i , j ) w(i,j) w(i,j)

原问题的转化

加权图的最小生成树是由那些相异度最小的边构成的连通图,如果希望把机器分成k个组,就继续删去最小生成树上权最大的k-1条边。于是得到k个分离的子树,每棵树的顶点集就构成各机器组。

对表1给出的数据,加权完全图的边权矩阵如下:

[1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 5 5 5 5 6 6 6 7 7 8; 
2 3 4 5 6 7 8 9 3 4 5 6 7 8 9 4 5 6 7 8 9 5 6 7 8 9 6 7 8 9 7 8 9 8 9 9;
0.5 1 0.89 0.14 1 1 1 1 1 1 0.6 2 1 1 1 1 1 1 1 1 1 0.5 0.87 0.67 0.75 0.75 1 1 1 1 1 1 1 1 0 1 1]

第一行表示每条边的起点,第二行表示每条边的终点,第三行对应每条边的相异度例如第一列1 2 0.5,就表示边12的相异度为0.5,下面我们简单说明一下计算过程:
第1台机器能加工的零件为2, 3, 7, 8, 9, 12, 13
第2台机器能加工的零件为2, 7, 8, 11, 12
两者的并集为2, 3, 7, 8, 9, 11, 12, 13,
两者的交集为2,7,8,12,
则对称差为3, 9, 11, 13,
因此边12的相异度 w ( 1 , 2 ) = w(1,2)= w(1,2)=对称差元素个数/并集元素个数=4/8=0.5

sj=[1 1 1 1 1 1  1 1 2 2 2 2 2 2 2 3 3 3 3 3 3 4 4 4 4 4 5 5 5 5 6 6 6 7 7 8; 
2 3 4 5 6 7 8 9 3 4 5 6 7 8 9 4 5 6 7 8 9 5  6 7 8 9 6 7 8 9 7 8 9 8 9 9;
0.5 1 0.89 0.14 1 1 1 1 1 1 0.62 1 1 1 1 1  1 1 1 1 0.5 0.87 0.67 0.75 0.75 1 1 1  1 1 1 1 1 0 1 1];
s = sj(1,:); 
t = sj(2,:);
weights = sj(3,:);
G = graph(s, t, weights);
[T, pred] = minspantree(G);
subplot(1, 2, 1);
plot(G, 'EdgeLabel', G.Edges.Weight); 
subplot(1, 2, 2);
plot(T, 'EdgeLabel', T.Edges.Weight);

![[Pasted image 20240826140129.png]]

要分为三组,去掉两条最大的边
去掉1和0.87
![[Pasted image 20240826140157.png]]

机器的分组
3,9
1,2,5
4,6,7,8

机器分组的目的是减少零件跨组加工的情况
相异度 = 1,表示两个机器加工的零件是完全不同的,因此不会出现跨机器加工的情况,这两台机器可以分到不同的组。
相异度w = 0,表示两台机器加工零件完全相同,因此应该分到一个组里才能保证不会出现跨组加工现象。
相异度w越小,二者在一组里的可能性越大,因此可以达到我们对机器分组的目的。

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

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

相关文章

Redis中的缓存穿透、缓存击穿、缓存雪崩(面试版)

缓存穿透 缓存穿透:查询一个不存在的数据,在mysql数据库中查询不到数据也不会写入缓存,导致每次请求都查询数据库,增加数据库负载。 解决办法: 1、缓存空值:将数据库中不存在的结果(例如空值)也缓存起来&#xff0c…

链式二叉树(C语言数据结构)

前言: 前期学习二叉树,包括堆,都是利用数组实现。 接下来就用链表的形式实现二叉树,并实现二叉树的相关功能。 二叉树前序遍历: 什么是前序遍历,任何一棵二叉树都可以分为根和左子树、右子树。 例如&…

【黑马点评】优惠券秒杀(单体模式)

优惠券秒杀业务流程 一人一单:要保证一个用户最多只能下一单 用户提交优惠券id根据优惠券id查询优惠券信息判断秒杀是否开始或结束,如果秒杀尚未开始或已经结束就直接返回错误信息判断库存是否充足,如果库存数量小于1就直接返回错误信息根据…

火源类型检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

火源类型检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …

word技巧:保护Word文档页眉,确保内容不被随意修改

我们设置了页眉内容之后,不想其他人修改自己的页眉内容,我们可以设置加密的,设置方法如下: 先将页眉设置好,退出页眉设置之后,我们选择布局功能,点击分隔符 – 连续 设置完之后页面分为上下两节…

无线领夹麦克风哪个牌子好?麦克风品牌排行榜前十名推荐

在直播与Vlog盛行的当下,一款性能卓越、稳定可靠的无线领夹麦克风无疑是内容创作者的最佳拍档。然而,市场上的无线领夹麦克风种类繁多,质量参差不齐。不少商家为追求利润最大化,采用廉价材料制造,导致收音效果差、噪音…

SqlHelper 使用EF-Core框架

public async Task AddAsync<T>(T entity) where T : class{await _context.Set<T>().AddAsync(entity);await _context.SaveChangesAsync();} //增加实体 public 表面方法是公开的&#xff0c;所有其他类都可以调用 async 表方法内可能包含异步操作&#xff0c…

快手如何去水印教程,推荐五款免费高效去水印工具

随着互联网的快速发展&#xff0c;视频内容创作和分享变得越来越普及。很多视频创作者在分享自己的作品时&#xff0c;都希望能够去除视频中的水印&#xff0c;以保护自己的版权或提高视频的观感。本文将为您介绍五款高效的视频去水印工具&#xff0c;帮助您轻松去除视频中的水…

特斯拉CEO马斯克呼吁加州加强AI监管,市场关注国际贸易动态

特斯拉与AI监管&#xff1a;马斯克的倡议 特斯拉&#xff08;TSLA&#xff09;首席执行官埃隆马斯克&#xff08;Elon Musk&#xff09;周一在社交媒体上再次表达了他对人工智能&#xff08;AI&#xff09;监管的坚定立场。他呼吁加州通过SB 1047法案&#xff0c;要求科技公司和…

前端自我提升秘籍:用这个工具快速成为全栈开发者!

最近&#xff0c;有不少前端开发者都在讨论如何进一步提升自己的技能&#xff0c;尤其是那些一直在公司里负责后台管理系统的同学。毕竟&#xff0c;后台管理系统虽然重要&#xff0c;但往往功能固定、需求清晰&#xff0c;相对来说技术挑战有限。要想突破自己的技术瓶颈&#…

黑神话悟空配置要求_2024年黑神话悟空游戏电脑配置推荐

《黑神话&#xff1a;悟空》作为一款采用虚幻引擎打造的高品质游戏&#xff0c;对硬件配置有着一定的要求。包括操作系统、处理器、内存、显卡等多方面需求。有些同学一直问&#xff0c;黑神话悟空配置要求是什么&#xff1f;下面小编就针对这个问题给大家介绍黑神话悟空官方配…

查找算法刷题【二分查找算法】

一、原理 如下图所示的就是二分查找算法的原理&#xff1a; 注意&#xff1a;二分查找算法中一个重要的思想&#xff1a;数组和函数是一样的概念&#xff0c;对可以使用二分法查找要求如下所示。 &#xff08;1&#xff09;数组f[i]是有序数组 &#xff08;2&#xff…

mapstruct和lombok同时使用时,转换实体类时数据丢失

全局搜一下maps&#xff0c;找到你进行转换的方法 可以看到新建了TswCaseInfoPlus后直接返回了&#xff0c;说明TswCaseInfoPlus没有set方法&#xff0c;或者说编译后lombok没生效 在pom文件中&#xff0c;编译打包插件中将lombok&#xff0c;mapstruct&#xff0c;lombok-map…

武汉流星汇聚:未来已来,亚马逊多元化战略引领电商行业新纪元

在全球电商的浩瀚星空中&#xff0c;亚马逊无疑是最耀眼的明星之一。凭借其强大的品牌影响力、完善的运营体系以及不断创新的技术应用&#xff0c;亚马逊不仅在美国市场稳坐头把交椅&#xff0c;更在全球范围内不断拓展其业务版图。展望未来&#xff0c;亚马逊的未来发展前景依…

新生开学,需要带的东西有哪些!

每年开学季&#xff0c;先给学子们来个灵魂拷问&#xff1a;你们是否已经做好了迎接新挑战的准备&#xff0c;还是在迷茫中踏入新的征程&#xff1f; 不管怎样&#xff0c;我们先来解决下当下寄件问题。上大学要带啥&#xff1f;行李怎么寄便宜&#xff1f; 寄快递注意事项 …

[论文笔记] LLM-ICL论文:AI模型对prompt格式分隔符的敏感性——结构化Prompt格式

又见惊雷&#xff0c;结构化Prompt格式小小变化竟能让LLM性能波动高达76%&#xff0c;ICLR2024

在Windows上用Visual Studio编译Tesseract

Tesseract是著名的OCR&#xff08;文字识别&#xff09;开源项目。我想自己编译它的源代码。然而总体而言&#xff0c;大型开源项目在Windows上编译多少都会有些磕磕绊绊&#xff0c;如果有幸最后成功了&#xff0c;都值得写一篇文章来纪念一下。这便是本文的由来。 编译环境&…

CRMEB 多店版供应商入驻及管理

一、功能介绍 供应商于移动端提出入驻申请&#xff0c;平台可于入驻申请中审核&#xff0c;审核通过后&#xff0c;该供应商可于平台上架商品。 二、供应商申请 供应商入驻申请 一、功能介绍 平台可以设置商品的供应商&#xff0c;用户下单后由供应商直接发货&#xff0c;自…

FT8493PA-RT隔离型SOP8快充充电器电源IC

FT8493XX&#xff0c;FT8493PA-RT是应用于隔离反激电压变换器的- -款高性能PWM控制器.芯片工作在CCM模式,工作频率随着负载降低而减小.拥有更高的效率,更快的瞬态响应以及更低的待机功耗.同时使用内部抖频技术可以更好的处理ENI. FT8493XX内部集成高压启动可以更快的起机以及更…

智能化Web3:如何利用人工智能优化区块链技术

随着数字技术的飞速发展&#xff0c;Web3和人工智能&#xff08;AI&#xff09;逐渐成为技术创新的两个重要领域。Web3代表了去中心化互联网的未来&#xff0c;而AI则是驱动智能化应用的核心技术。当AI与Web3相结合时&#xff0c;将会对区块链技术的优化产生深远的影响。本文将…