- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
今天有 friend 问我一个关于分配问题的问题。我找到了一个非常简单的解决方案,但我觉得它可以变得更简单、更快。您的帮助将不胜感激。
问题:假设我有N个人,我需要将他们分配到M栋楼,每栋楼可以容纳K人。并非所有人都愿意和对方住在一起,所以我有一个 N*N 单元格矩阵和一个 1,表示愿意和对方住在一起的人。如果一个单元格包含 1,则表示 I 和 J 可以住在一起。显然矩阵围绕主对角线对称。
我的解决方案如下(伪代码):
int[] Match(int[] people, int[][] pairs, int numBuildings, int buildingsSize)
{
int[] freePeople = findFreePeople(people);
if(freePeople) = 0
{
return people;
}
foreach(int person in freePeople)
{
for(int buildingIndex=0 to numBuildings)
{
if( CheckIfPersonFitsInBuilding(...) )
{
int[] tempPeople = people.Copy();
tempPeople[person] = buildingIndex;
int[] result = Match(tempPeople,pairs,numBuildings,buildingsSize);
if(result != null)
{
return result;
}
}
}
}
return null;
}
我只是介绍了使用递归的所有可能安排。我觉得这可以大大优化,我不是在谈论启发式方法,而是一种复杂性要低得多的解决方案。
我认为这可能与 stable marriage problem 有关,虽然我不确定。
最佳答案
通过从 decomposing a graph into cliques 的 NP 完全问题减少,这个问题被认为是 NP 难的(集团掩护问题)。
首先,一些术语和讨论。 clique在一个图中是一组 k 个不同的节点,这样每个节点都连接到 clique 中的每个其他节点。一个independent set图中是一组 k 个不同的节点,使得没有两个节点相互连接。如果你采用任何图 G,然后在缺少边时引入边并删除以前存在的所有边,你会得到 complement graph的原始图形。这意味着在初始图中寻找团的问题等同于在补图中寻找独立集。
之所以有趣,是因为在您描述的问题中,您得到了一张人图,其中每条边都表示“这两个人不能住在一起”。因此,您可以将您所描述的问题视为试图找到一种方法将图形分解为 k 个子图,每个子图都是一个独立的集合。如果你构造这个图的补集,你会得到所有可以放在一起的人的图。在这种情况下,您希望将该组分成 k 个都是小集团的组。
已知下面的问题是NP完全的:
Given a graph and a number k, can you break the nodes in the graph apart into k cliques?
我们可以在多项式时间内将此问题简化为您的问题,表明您的问题是 NP-hard 问题。构造很简单——给定初始图 G 和数 k,首先构造 G 的补集。这意味着如果你可以将补集分解成 k 个独立的集合,那么原始图 G 可以分解成 k 个团(因为派系和独立集之间的二元性)。现在,将这个新图转换成一组人,每个节点一个,如果两个人的节点在原始图中连接,则不能将他们放在同一个房间里。现在,有一种方法可以将这些人分配到 k 个房子中,当且仅当 G 的补集可以分解为 k 个独立的集合,当且仅当 G 可以分解为 k 个派系。因此,已知的 NP-complete clique cover 问题可以在多项式时间内简化为您的问题,因此您的问题是 NP-hard。为了确保任何独立的集合都可以装进一个房子,只需将每个房间的最大容量设置为 n,即图中的节点数。这允许任何独立的集合被安置在任何房间。
由于您的问题是 NP 难的,因此除非 P = NP,否则不可能有多项式时间解。因此,众所周知,它没有多项式时间算法,您的回溯递归很可能是最佳解决方案。
希望这对您有所帮助!
关于c# - 在尊重偏好的情况下将人员分配到建筑物?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11172756/
我在 R Markdown 文档中设置全局选项时遇到问题。下面是一个简单的例子。在这种情况下,我试图设置 global.par = TRUE .期望是任何 par()我在一个夹头中制作的规范被带到后续
Cloudflare 正在缓存我的请求,但它忽略了语言 header 。 示例请求: URL : https://api.example.com/v1/places/?param=1¶m=2
我正在尝试创建一个分面条形图,每个分面的百分比加起来为 100。对此的解决方案似乎是 group 的组合和 ..density.. .如何 - 在我看来 group与 fill 冲突. 数据: tes
我正在开发一个 C# 应用程序,该应用程序试图遵守其运行系统的时间格式。如果 Windows 控制面板更改为 24 小时格式,这就是应用程序显示时间的格式。无论如何,它成功地做到了这一点,除了只有在应
我用过 Vundle安装 editorconfig-vim插件。它正确加载并列在 :scriptnames 中.但是当我创建一个新文件时,比如 x.js ,缩进设置不是从 ~/.editorconfi
我曾尝试使用不同的方法自行解决这个问题,但没有一个给我预期的结果。 当我在我的项目的数据库中保存一个文本类型的变量时,问题就出现了。它用换行符保存它,事实上,当我尝试从我的一个 View 中编辑它时,
让我头疼的代码是这样的: $('#timeline .selected').removeClass('selected'); 它在 IE8 中无法正常运行。这些类确实被正确删除,但不知何故该元素仍然具
在处理 java 中的 Swing 对象(还有 JFX,但我稍后会担心这个问题)时,我遇到了一个让我摸不着头脑的问题。 这是我用来在程序中打开字体的代码。这是相当标准的。 public static
我正在为电子商务购物车使用 SOAP API,但我似乎无法让 session 在不同的页面中持续存在。 作为示例,我在下面有一些测试代码(带有一堆调试消息),它将一个项目添加到购物车,然后查看购物车。
我有一个 fieldset与 legend可能加载了很长的字符串。 我想要 legend尊重 fieldset 的宽度并且只使用了 50% 的空间。 目前,如果legend太长它仍然只占fieldse
我有一个完整城市的 3D 模型,想展示一个 这些建筑物的等距 View 。我为此使用 gnuplot 多边形, 因为我不认为我可以将 pm3d 用于具有坐标的多边形 不在一个明确定义的网格上。多边形以
我理解 Clojure 的 *assert*变量可用于关闭断言,但我所做的一切似乎都不起作用。 (defn foo [a] {:pre [(pos? a)]} (assert (even? a
我有一个带有 DependencyProperty 和 CoerceValueCallback 的控件。此属性绑定(bind)到模型对象上的属性。 当将控件属性设置为导致强制的值时,绑定(bind)会
可以通过将它们放置在 smcs.rsp 中来创建全局定义,当您点击播放时 - 您会注意到代码的这些部分被点击,并且一切都表现得好像它应该的那样。 但是,在 MonoDevelop 中编辑源代码时,它无
总的来说,我非常努力尊重模块的隐私(如果变量以下划线为前缀,我不会使用它)。然而,我有一个极端的情况,它看起来相当“安全”。 这是演示 ( my previous question ) parser=
我有一个悬停动画的 div(我正在使用 jquery 的 .hover() 方法)。 div 包含一个带有选择的表单。打开选择并悬停在选项上会使 IE9 将其解释为“取消悬停”父 div,导致第二个悬
如果 max_user_connections 连接已打开,是否有方法告诉 Entity Framework 等待? 我想我可以捕获异常并重试或保留一个计数器,但这最多感觉很糟糕。 我的 Azure
在我的测试中,BitmapFactory.decodeFile() 创建的 Bitmap 不遵循 EXIF header 。 例如,当我调用 Bitmap.getWidth() 时,设备拍摄的肖像图像
请帮助我了解如何解决这个问题。 这是我的路由文件 (auth-routes.js) const userControllers = require('../controllers/user') mod
我的应用程序有时会注入(inject) 标记到网站中,然后创建一个新的 带有亲戚的标签 src 例如设置并注入(inject) 导致浏览器从 http://localhost:8080/chapter
我是一名优秀的程序员,十分优秀!