匈牙利算法解决英雄配色问题

news2024/11/24 22:41:18

匈牙利算法解决英雄配色问题
最近在开发中遇到了这种情况,策划要为每个英雄去做配色,一个英雄在表中可能有多个配色(可能重复),每次对局要选出五个英雄并让他们的颜色不同
(实际不是这个,简化成的这个需求)

第一反应应该用图去做,想到是递归、回溯

匈牙利算法

匈牙利算法是一种经典的图论算法,用于解决二分图最大匹配问题。匈牙利算法是一种在多项式时间内求解任务分配问题的组合优化算法,并推动了后来的原始对偶方法。美国数学家哈罗德·库恩于1955年提出该算法。此算法之所以被称作匈牙利算法,是因为算法很大一部分是基于以前匈牙利数学家Dénes Kőnig和Jenő Egerváry的工作之上创建起来的。

在正式了解匈牙利算法之前,我们必须先知道什么是二分图:又称作二部图,是图论中的一种特殊模型。 设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A,j in B),则称图G为一个二分图。
如图所示

在这里插入图片描述
这就是一个典型的二分图,我们区别二分图,通常要看它是否能分成两个独立的点集。二分图是这样一个图: 有两顶点集且图中每条边的的两个顶点分别位于两个顶点集中,每个顶点集中没有边直接相连接

在图论中,一个匹配是一个边的集合其中任意两条边没有公共顶点。

每一条线都代表该英雄可能有的配色
在这里插入图片描述
按照策划的要求应该变成这样
在这里插入图片描述
最大匹配:选择这样的边数最大的子集称为图的最大匹配问题(maximal matching problem)
完美匹配:如果一个匹配中,图中的每个顶点都和图中某条边相关联,则此匹配称为完美匹配。
我们的问题就是找最大匹配,借助的就是匈牙利算法,(当配色无法满足时可能需要加上临时配色,这个需要后续沟通)
该算法的核心就是寻找增广路径,用增广路径来求二分图的最大匹配的算法。

增广路径

增广路径(Augmenting Path)是匈牙利算法中的一个重要概念。它在寻找二分图最大匹配的过程中起到关键作用。

在匈牙利算法中,增广路径是指从一个未匹配的顶点开始,经过一系列交替的匹配边和非匹配边,最终到达另一个未匹配的顶点的路径。增广路径的特点是它的起点和终点都是未匹配的顶点。

匈牙利算法通过不断寻找增广路径来增加匹配的数量。具体步骤如下:

选择一个未匹配的顶点作为起始点。
尝试将起始点与其相邻的未匹配顶点进行匹配。
如果存在增广路径,则通过交替改变匹配和非匹配边的状态,增加匹配的数量。
重复步骤2和步骤3,直到无法找到增广路径为止,即找到了最大匹配。
增广路径的寻找可以使用深度优先搜索(DFS)或广度优先搜索(BFS)等方法。在每次寻找增广路径时,算法会记录访问过的顶点,以避免重复访问,从而提高效率。

通过不断寻找增广路径并更新匹配,匈牙利算法可以找到二分图的最大匹配。

总结来说,增广路径是匈牙利算法中用于增加匹配数量的关键概念。它是从一个未匹配的顶点开始,通过交替的匹配和非匹配边构成的路径,最终到达另一个未匹配的顶点。匈牙利算法通过不断寻找增广路径来增加匹配的数量,从而求解二分图的最大匹配问题。

以上就是思路,下边是关键代码

一些变量


hero color两个table
bool line[maxn][maxn];//用邻接矩阵来存储hero和color的关系,行代表hero,列代表color,有则为true,无则false。
bool used[maxn];//判断颜色是否被使用。true则有,false则无。
int nex[maxn]//挪位置的

关键就是Find()方法,如何发现可以配对,则就有很多要点了,我们通过上述可知,若没有被使用,我们则可以直接使用,但我们判断颜色可不仅仅只是根据used来判断的,还有就是nex[]或者根据递归来腾位置,判断可不可以腾位置。

function Find(heroID)
    for i = 1, #color do -- 遍历颜色
        if line[heroID][i] and not used[i] then -- 如果可以使用该颜色且该颜色没有被使用
            used[i] = true -- 我们则让它被使用
            if nex[i] == 0 or Find(nex[i]) then
                nex[i] = heroID -- 保存与该颜色配对的hero序号
                return true -- 配对成功
            end
        end
    end
    return false -- 配对失败
end

然后就根据该方法计算match数,为五个就可以去把匹配数组的数据取出来,返回掉,不为五个就可能需要临时颜色补充一下。
需要将hero\color数据转换成类似邻接矩阵的形式(对数据进行处理)等着策划配表吧qwq

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

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

相关文章

nacos面经详解

1 为什么要懂nacos的详细原理? 只要你简历写过你用过nacos,则大厂(阿里),尤其是使用过这款产品的大中厂,基本必问其中的原理。里面的设计理念还有很多分布式系统的原理值得学习和深究。 2 分布式理论基础…

进制转换详解(解释原理简单易懂)

前言:在网上看了许多篇关于不同进制之间如何转换的文章,包括很多浏览量上万的博客。大多都只是把转换的规则罗列了出来,例如十进制转二进制,可能大家都知道方法,“除以2反向取余数,直到商为0”。应用该方法…

黎曼猜想的验证

11 for n 1 : 100000 sum sum cos(14.134725*log(n))/(n^(-0.5)) end sum -1.1151e06

IDEA设置自动导包功能

IDEA设置自动导包功能 选择File--Settings--Edotor-General-Auto Import,勾选上下图中的选项后点击 OK 即可。导包无忧~~ Add unambiguous imports on the fly:自动导入不明确的结构 Optimize imports on the fly:自动帮我们优化导入的包

vep加密视频破解转换翻录为mp4教程

可能有很多人都没有听说过这个视频格式,这是大黄蜂云课堂播放器所独有的格式,只有通过该播放器才能够打开这个加密的视频,安全系数很高,但也极大的限制了一个视频的传播和播放。如果我们在网络上下载了vep格式的视频,可…

消息队列总结(2)- RabbitMQ Kafka RocketMQ运行架构

目录 1 RabbitMQ 1.1 工作原理 1.2 名词解释 1.3 交换机的几种类型 2 Kafka 2.1 工作原理 2.2 基本概念 3 RocketMQ 3.1 工作原理 3.2 基本概念 4 RabbitMQ & Kafka & RocketMQ的差异 5 参考文档 1 RabbitMQ 1.1 工作原理 1.【消息生产】生产者&#xff0…

TMS FNC Core Crack

TMS FNC Core Crack 跨框架核心层,用于创建丰富的可视化和非可视化组件。 特点 JSON读、写和解析功能 Base64和URL编码和解码 组件持久性 撤消/恢复管理器 数字、字母数字字符集的验证 消息、文件打开和保存对话框 轻松访问应用程序和文档文件夹 打开文件和URL 位图…

非对称加密算法关于公钥和私钥

公钥和私钥成对出现 公开的密钥叫公钥,只有自己知道的叫私钥 用公钥加密的数据只有对应的私钥可以解密 用私钥加密的数据只有对应的公钥可以解密 如果可以用公钥解密,则必然是对应的私钥加的密 如果可以用私钥解密,则必然是对应的公钥加的密 …

leetcode 17 电话号码的字母组合

题目描述: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 思路: 从示例上来说,输入"…

第十七章:Dual Attention Network for Scene Segmentation ——双重注意力网络用于场景分割

0.摘要 在本文中,我们通过基于自注意机制捕捉丰富的上下文依赖来解决场景分割任务。与以往通过多尺度特征融合来捕捉上下文的方法不同,我们提出了一种双重注意力网络(DANet),以自适应地将局部特征与全局依赖性相结合。…

.net6中WPF的串口通信和USB通信

之前写过串口通信,不过是winform的。 c#使用串口进行通信_c# 串口通信_故里2130的博客-CSDN博客 今天说一下,.net6中wpf的串口通信和USB通信,在工控行业中,这2种的方式非常多,还有网口通信,它们都是用来和…

TypeScript基础教程

ts与js区别 TypeScript is a syntactic sugar for JavaScript. TypeScript syntax is a superset of ECMAScript 2015 (ES2015) syntax. Every JavaScript program is also a TypeScript program. 语言层面:JavaScript和TypeScript都是ECMAScript(ECMA-2…

【布局优化】基于遗传算法的车间布局优化 车间设施布局优化【Matlab代码#50】

文章目录 【获取资源请见文章第5节:资源获取】1. 车间布局优化2. 基于GA的布局优化模型3. 部分代码展示4. 仿真结果展示5. 资源获取 【获取资源请见文章第5节:资源获取】 1. 车间布局优化 车间设施布置的规划一直是工业工程领域不断研究和探索的内容&am…

【2023江西省研究生数学建模竞赛】第二题 国际“合作-冲突”的演化规律研究 80页论文及Python代码

【2023江西省研究生数学建模竞赛】第二题 国际“合作-冲突”的演化规律研究 80页论文及Python代码 相关链接 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论文及MATLAB代码 【江西省研究生数学建模竞赛】第一题 蒸汽发生器倒U型管内液体流动 70页论…

<数据结构>并查集

目录 并查集概念 合并 查找集合的数量 并查集类代码实现 并查集概念 并查集和堆一样,都是通过数组来实现树的节点映射,不过并查集作用是,把一堆数据分为不同的几个小集合 不过并查集是森林的概念,并查集的学习可以帮助我们去更…

(QGIS)在QGIS中加载星图地球数据云的数据

本文以“瓦片数据”为例进行操作示例说明,类似矢量数据、地形数据等,方法步骤一样,将URL换成对应数据的示例网址与本人的token即可。 1、星图地球数据云上注册用户 注册登录星图地球数据云网站:https://datacloud.geovisearth.c…

Python 函数(二)

Python 函数(二) 一、可变参数、不可变参数 ​ 什么是可变类型,什么又是不可变类型? 这里我们首先要了解一个东西,在计算机程序中我们定义一个变量,并对其存储一个数值。这里有两个关键概念:内…

数码管显示(静态与动态)

文章目录 一、数码管简介二、数码管连接方式2.1 共阴极2.2 共阳极2.3 数码管真值表 三、数码管驱动方式3.1 静态显示3.2 动态显示四、Cyclone IV数码管原理图 五、模块代码六、引脚分配七、动态显示八、引脚分配 一、数码管简介 数码管分七段数码管和八段数码管。七段和八段的…

为什么不推荐在头文件中直接定义函数?

1. 函数的分文件编写 在C中,函数的分文件编写是一种让代码结构更加清晰的方法,通常可以分为以下几个步骤: 创建后缀名为 .h 的头文件,在头文件中写函数的声明,以及可能用到的其他头文件或命名空间创建后缀名为 .cpp …

ES6迭代器、Set、Map集合和async异步函数

目录 迭代器 Iterator 的作用 Iterator 的遍历过程 Set Map集合 map和对象区别? async异步函数 迭代器 迭代器(Iterator)就是这样一种机制。它是一种接口,为各种不同的数据结构提供统一的访问机制。任何数据结构只要部署Iterator接口&…