Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 匈牙利算法与多因素_Algorithm_Language Agnostic_Scheduling_Graph Theory_Matching - Fatal编程技术网

Algorithm 匈牙利算法与多因素

Algorithm 匈牙利算法与多因素,algorithm,language-agnostic,scheduling,graph-theory,matching,Algorithm,Language Agnostic,Scheduling,Graph Theory,Matching,我的情况是,我需要将人员分配到几个活动中。如果我们只是把价格作为一个因素,那就好了,但是有很多因素 首先是一些背景。这是为一个非营利组织设计的,该组织为因任何原因住院的儿童推广故事时间,因此他们依靠志愿工作来做到这一点。因此,由于他们依赖于人们的善意,他们给人们尽可能多的工作,就像人们可以/想要做的一样,这有如下变化: 有些人只能在上午做,有些人只能在下午做 有些人只能在星期一和星期四去,有些人不能在八月或十二月去 有些人一个月只能去一次,其他人可以去4次(甚至其他人在这些行动中被给予“优先权

我的情况是,我需要将人员分配到几个活动中。如果我们只是把价格作为一个因素,那就好了,但是有很多因素

首先是一些背景。这是为一个非营利组织设计的,该组织为因任何原因住院的儿童推广故事时间,因此他们依靠志愿工作来做到这一点。因此,由于他们依赖于人们的善意,他们给人们尽可能多的工作,就像人们可以/想要做的一样,这有如下变化:

  • 有些人只能在上午做,有些人只能在下午做
  • 有些人只能在星期一和星期四去,有些人不能在八月或十二月去
  • 有些人一个月只能去一次,其他人可以去4次(甚至其他人在这些行动中被给予“优先权”,因为他们更有经验,可以一个月去10次)
所以,我算出来了前两个。因为匈牙利算法是关于价格的,我会给他们一个愚蠢的高价格,因为他们不能去。但是,你会怎么做其他人

我想给他们一些分数。大致可以这样说:一个人一个月能做一次,大概要花费1000分。如果一个人一个月能去10次,那他就得100分(1000除以10)。此外,分配的方法是,每当单独采取行动时,就提高价格,例如(选定的人员对其相关成本有一个*):

第一次迭代 第二次迭代 这将是在所有人之间进行相应分配的方式,将更多的优先权给予那些能够多次这样做的人


你怎么想?你会怎么做?

这是一个计划/优化问题,所以关键问题是“你想最大化的数量是多少?”?我猜你是想最大限度地提高所有志愿者的工作总小时数,而不发生冲突,这取决于每个志愿者的时间表限制。你还提到优先考虑更有经验的志愿者,所以听起来你是在说“一些志愿者比其他人更受欢迎”

这是一部经典之作。参见史蒂文·斯基纳(Steven Skiena)的第498页(第二版)。基本方法是构造一个顶点同时表示志愿者集合和您尝试填充的时间段集合的图。边缘将志愿者链接到有效的时间段。然后,最佳解决方案是最大可能的边集,其中不重复志愿者或时隙。这是一个匹配

你的一些志愿者可能会做不止一个插槽;这可以通过多次复制该自愿者顶点来建模

如果你想对志愿者进行优先级排序,那么这将有效地为每一条边增加一个权重,为志愿者在该任务中的体验建模。在本例中,正如您所想,您将需要类似匈牙利算法的东西。如果你不需要这个,你就可以把问题转化成一个等价的问题,然后应用一个网络流算法。这里有一个例子


如果您想要更多的细节,包括其他替代方案,以及更多的实现链接,我强烈建议您自己购买一份算法设计手册-这是一份非常清晰和实用的参考资料。

仔细研究并回答。非常感谢您的反馈。
         | August 1st 2009
Person A | 1000
Person B | 500 *
         | August 8th 2009
Person A | 1000 *
Person B | 1000