我正在寻找一种用特定约束将双链图分成子图的算法。我不确定是否有任何现有算法解决我的问题。

我有一个无向两分的图,其中节点是客户( $ c $ )和服务( $ s $ < / span>)。我想将其分成几个较小的子图,将每个子图中的服务量限制为一些最大数量 $ n $ 。不幸的是,寻找断开连接的子图是不够的,因为图形连接太高,所以我认为我需要重复服务。

正式,我想要一组子图,使得:

  • 每个客户 $ c \中的c $ 恰好出现在一个子图
  • 所有边缘都以一个子图(他们的客户出现的那个)出现在一个子图中
  • 每个服务 $ s \在s $ 中可以出现在任意数量的子图中(可以重复的服务来帮助拆分)
  • 每个子图都应该有大多数 $ n $ 服务(其中 $ n $ 是一个给定的常量这保证大于连接到任何单个客户的最高服务数量)
  • 子图应该具有尽可能多的客户(没有这种限制,它通过将每个客户用他们的服务副本将每个客户放入他们的服务副本来琐碎。这可能是启发式而不是正式证明。

任何人都可以建议这样做的算法?节点的数量不是大大(大约1000个客户,100个服务,每个客户连接到5或更少的服务),所以蛮力方法或具有糟糕Big-O缩放的人可能是合适的。

有帮助吗?

解决方案

它的味道就像它可能是np-hard。

一种合理的方法是使用SAT求解器或ILP求解器。假设您决定最多是大多数 $ m $ 子图。然后,您可以拥有布尔变量 $ x_ {i,k},y_ {j,k} $ 指示客户 $ i$ 进入subgraph $ k $ 和service $ j $ 进入subgraph $ k $ 。您可以根据您的要求获取一堆约束(条款),然后询问SAT Solver或ILP求解器以查找可行的解决方案。最坏情况的运行时间是指数级的。这可能或可能在您的情况下可能无法正常工作。

许可以下: CC-BY-SA归因
不隶属于 cs.stackexchange
scroll top