获取所有连接节点的网络(逻辑谜题)
Posted
技术标签:
【中文标题】获取所有连接节点的网络(逻辑谜题)【英文标题】:Get all networks of connected nodes (Logic puzzle) 【发布时间】:2022-01-13 19:51:45 【问题描述】:我知道这是一个更多关于逻辑而不是实际编程问题的问题,但我希望有人可以指导我找到正确的方向来解决这个问题。看看它就像降临编程谜题:)
我有节点,它们通过端口相互连接。我知道节点,我知道所有的关系。现在我需要获取所有可能的网络。
为了进一步阐明我的需要,我制作了以下草稿: 网络布局图:https://ibb.co/51zmkfj
传说:
A-F:节点 1-5:关系 6:冗余关系(如果节点 D 是 乱序) I-IV:我需要进入列表的网络(每个节点的所有节点 网络,因此一个节点可以在多个网络中) V:冗余网络,我必须在一个单独的 列表(包含源节点和目标节点)请注意,网络可以更大,并且可能有多个冗余网络
正如所写,我需要这些网络 I-V。我尝试了各种方法,得到了一个适用于 I-IV 的版本,但它的代码很多,而且我可能想太多了。
我的做法:
循环遍历关系并创建一个Dictionary<int, List<String>>
,其具有随机的 int 标识符和 id+portNumber 作为所有相互连接的关系的唯一字符串。
然后,我使用 Dictionary 执行嵌套 foreach 以将每个条目与其他条目进行比较,以查找任何重复项和不完整的组。
然后我从字典中删除这些错误的组。
之后,我从字典列表中的所有值中删除了 portNumber。
我还制作了一个 .NET Fiddle,它使用与上图完全相同的数据准备。 https://dotnetfiddle.net/SQnZYs
【问题讨论】:
你考虑过图形数据库吗?它是他们设计的问题类型,并且有一种查询语言可以帮助您解决此类问题而无需迭代代码docs.microsoft.com/en-us/azure/cosmos-db/graph/… @TheGeneral 听起来不错,但对于我的用例来说这可能有点过头了,因为平均有 15-20 个节点将被连接,这对于大数据来说似乎很棒。我还需要一个为此运行的服务器,我想尽可能省略它。 【参考方案1】:作为有一点网络经验的人,我首先要指出的是,你不能像那样将多条电缆插入同一个端口?
我可以在这里看到几种方法,但您需要向数据模型添加更多信息,例如将备份链接标记为不涉及“正常”的单独连接的方法网络,因此需要隔离。
不过,重要的是您的术语需要更精细的定义:
Object | Definition |
---|---|
Node |
A collection of Port s (including Backup versions of those Port s). |
Port |
An object that can belong to one Network and has an arbitrary number of Connection s. |
Connection |
Links two Port s, contained by a single Network . |
Network |
A collection of Port s and the Connection s that link them together. |
Backup |
A Port , Connection or Network that is separate from the normal set such than Backup Port s and Backup Connection s exist exclusively in Backup Network s. |
好的,最后一个有点笨拙,但我认为在这种情况下这是问题的必要部分。如果不区分标准链接和备用链接,您就无法将网络V
与其他网络分开。当然,并非所有这些对象都是实际的类,它们是概念。有用的最小值似乎是:Node
、Port
和 Connection
,Network
和 Backup
成为属性...虽然公平地说,您可能可以用一些逻辑替换 Port
,但它在一些方法。
有了这些定义,应该可以解决问题。它的伪代码算法可能是这样的:
For each Node:
For each connected Port with no assigned network:
Add port to new network.
Add all Connections to network.
Repeat for all connected ports.
For each connected Backup Port with no assigned Backup Network:
Add port to new Backup Network
Add all Backup Connections to network.
Repeat for all connected ports.
当然,我们可以用正确的数据结构将两个内部循环合并为一个。
而且由于我喜欢过度设计的对象,这些对象使我的***代码更易于阅读(如果并非总是更容易理解),因此我今天有一些时间,而且可能是精神上的圣诞节...我为你写了一个fun implementation。
注意:不可用于生产!
(说真的,别看我用 ToString()
覆盖带来的所有乐趣。)
【讨论】:
谢谢你,我会检查它是否适用于我的情况。也许要澄清一下,这是针对无线网络的,“端口”实际上是无线电发射器(因此允许多个设备相互连接:)),我只是想让问题“简单”。真正的结构中包含更多数据,但我为此省略了它 我想我将能够使用您的想法,唯一不工作的部分是“备份”部分。这是因为此布局实际上是在 GUI 中创建的,并且看起来与我的图像相似,如果不是绝对必要,我希望避免让用户定义任何数据。我应该能够以某种方式评估冗余连接以了解这些备份连接。 (每个节点都有一个类型,在我的示例中 NodeC 和 NodeD 是中继,因此对于操作来说是可选的,我应该能够在所有网络都提取这些备份网络之后) @Xavjer 在真实网络中,您会使用不同的东西来区分备用故障转移链接。至少链接的度量将用于确定路由,但我们不是在谈论生成树等。我试图回答所问的问题......也许我有点忘乎所以:P 我接受了您的回答,因为我现在使用的解决方案是在您的基础上构建的。我使用了网络术语,因为它更容易理解目的是什么。实际上,它不是一个真正意义上的网络,而是一个非常特殊的网络,如果我试图解释它会让人恼火。但我可以用你做的。我只需要为备份网络部分做一些特殊的逻辑以上是关于获取所有连接节点的网络(逻辑谜题)的主要内容,如果未能解决你的问题,请参考以下文章
在为网格创建单个文件时创建单个逻辑时发出问题。使用kivy进行数独谜题的2x2,4x4和6x6网格