Java 分配算法/可用性算法
我想知道是否有人知道一种算法可以帮助我解决以下问题: 将人员(n)分配给某些事件(m),m只能有一个人连接到该事件,并且每次必须随机化(如果只有一个选项可用,则允许同一个人(n))。n具有可用时间和可用日期等属性。要使n与m匹配,可用时间和可用天数必须与n和m匹配。可以有多个n与m的时间匹配,但它必须是最佳匹配,以便可以分配m的其余部分。下面的图表很可能会更好地解释它(对不起)。n可以分配给多个m,但是应该公平地分配,使得一个n没有所有可用的m 如您所见,人员A可以附加到事件A,但由于需要使其全部匹配(最佳匹配尝试),因此将其附加到事件B,以允许人员C分配到事件A,人员B分配到事件CJava 分配算法/可用性算法,java,algorithm,Java,Algorithm,我想知道是否有人知道一种算法可以帮助我解决以下问题: 将人员(n)分配给某些事件(m),m只能有一个人连接到该事件,并且每次必须随机化(如果只有一个选项可用,则允许同一个人(n))。n具有可用时间和可用日期等属性。要使n与m匹配,可用时间和可用天数必须与n和m匹配。可以有多个n与m的时间匹配,但它必须是最佳匹配,以便可以分配m的其余部分。下面的图表很可能会更好地解释它(对不起)。n可以分配给多个m,但是应该公平地分配,使得一个n没有所有可用的m 如您所见,人员A可以附加到事件A,但由于需要使其
我只是想知道是否有人知道这类问题的名称以及我如何着手解决它,我正在用Java编写程序,创建一个名为AllocatePerson的类,该类有一个人和一个事件列表作为名为lsinRevents的属性(您必须首先定义类Person和类Events,两者都有一个时间和日期列表) 在AllocatePerson的构造函数中,为一个人和事件列表提供信息,构造函数将循环事件并仅向内部列表添加与此人参数匹配的事件 主代码将为实现以下逻辑的每个人(当时1人)创建一个分配器人员: 如果新创建的对象“objAllocatePerson”具有大小为1的LsinRevents列表,则从要分配的事件列表中删除LsinRevents中包含的元素,并将触发一个名为MaintainEvents(Events removedEvents)的过程,传递已分配的事件(LsinRevents内部的事件) MaintainEvents函数将在当前AllocatePerson数组中循环,并从其LsinRevents中删除“removedEvents”,如果在此之后LsinRevents的大小为=1,它将使用新删除的事件递归调用MaintainEvents(),并从要分配的主事件列表中删除新的LsinRevents
在执行结束时,你将简单地通过循环的数组来分配所有的关联,其中LSiNEL事件的大小是1
。为事件添加必要的属性,以确保人员只能选择一次这是的一个变体。泰勒提出了许多算法来解决最大流问题,包括或其细化。一旦您能够将问题变为最大流问题,请在这很简单。但是最大流量问题是什么 该问题采用加权有向图,并提出问题“从源(一个节点)到汇(另一个节点)的最大流量是多少?”。 当将图形视为水流网络时,有一些约束是合乎逻辑的
s
为源,t
为汇
最大流量问题的解决方案是总流量为25,流量如下:
将问题转化为最大流量问题很简单。假设您的输入为:
人员,以及人员N
何时可用的相关信息p_i
带有时间和地点的事件M
- 超级源代码
s
person节点N
,具有无限容量的边p_1…p_N
将
连接到s
,用于1…N中的所有p_i
i
- 超级接收器
t
事件节点M
,具有容量边缘e_1…e_M
连接1
到e_i
,用于所有t
i…M中的
- 对于人和事件的每一个组合
,一条具有无限容量(p_i,e_j)
的边连接
到p_i
iffe_j
可以有效地参加事件p
(否则没有边连接e
和p_i
)e_j
O(1)+O(N)+O(N)+O(M)+O(M)+O(1)+O(NM)=O(NM)
runtime
对于您的示例,构造的图如下所示(未标记的边具有无限容量):
您正确地注意到,在本例中,存在一个值为
4
的最大流,任何最大流都将返回相同的值。一旦您可以执行此转换,您就可以运行任何最大流算法并解决您的问题。乍一看,它似乎是背包的一个版本problem@AmirAfghani我是n