Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.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
Java 分配算法/可用性算法_Java_Algorithm - Fatal编程技术网

Java 分配算法/可用性算法

Java 分配算法/可用性算法,java,algorithm,Java,Algorithm,我想知道是否有人知道一种算法可以帮助我解决以下问题: 将人员(n)分配给某些事件(m),m只能有一个人连接到该事件,并且每次必须随机化(如果只有一个选项可用,则允许同一个人(n))。n具有可用时间和可用日期等属性。要使n与m匹配,可用时间和可用天数必须与n和m匹配。可以有多个n与m的时间匹配,但它必须是最佳匹配,以便可以分配m的其余部分。下面的图表很可能会更好地解释它(对不起)。n可以分配给多个m,但是应该公平地分配,使得一个n没有所有可用的m 如您所见,人员A可以附加到事件A,但由于需要使其

我想知道是否有人知道一种算法可以帮助我解决以下问题:

将人员(n)分配给某些事件(m),m只能有一个人连接到该事件,并且每次必须随机化(如果只有一个选项可用,则允许同一个人(n))。n具有可用时间和可用日期等属性。要使n与m匹配,可用时间和可用天数必须与n和m匹配。可以有多个n与m的时间匹配,但它必须是最佳匹配,以便可以分配m的其余部分。下面的图表很可能会更好地解释它(对不起)。n可以分配给多个m,但是应该公平地分配,使得一个n没有所有可用的m

如您所见,人员A可以附加到事件A,但由于需要使其全部匹配(最佳匹配尝试),因此将其附加到事件B,以允许人员C分配到事件A,人员B分配到事件C


我只是想知道是否有人知道这类问题的名称以及我如何着手解决它,我正在用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

  • 人员事件创建Java对象
  • 将所有事件放入池(Java集合)
  • 让每个从池中选择一个事件。由于每个人只能选择特定日期的事件,因此创建事件的子集,该子集将位于池中,以便从中进行选择

  • 事件添加必要的属性,以确保人员只能选择一次

    这是的一个变体。泰勒提出了许多算法来解决最大流问题,包括或其细化。一旦您能够将问题变为最大流问题,请在这很简单。但是最大流量问题是什么

    该问题采用加权有向图,并提出问题“从源(一个节点)到汇(另一个节点)的最大流量是多少?”。 当将图形视为水流网络时,有一些约束是合乎逻辑的

  • 通过每条边的流量必须小于或等于图中每条边的“容量”(权重)。它们也必须是非负数
  • 进入每个节点的流量必须等于离开该节点的流量(源节点和汇节点除外)。通过节点的流量没有限制
  • 考虑下图,其中
    s
    为源,
    t
    为汇

    最大流量问题的解决方案是总流量为25,流量如下:

    将问题转化为最大流量问题很简单。假设您的输入为:

    • N
      人员,以及人员
      p_i
      何时可用的相关信息
    • M
      带有时间和地点的事件
    创建具有以下属性的图形:

    • 超级源代码
      s
    • N
      person节点
      p_1…p_N
      ,具有无限容量的边
      s
      连接到
      p_i
      ,用于1…N中的所有
      i
    • 超级接收器
      t
    • M
      事件节点
      e_1…e_M
      ,具有容量边缘
      1
      连接
      e_i
      t
      ,用于所有
      i…M中的
    • 对于人和事件的每一个组合
      (p_i,e_j)
      ,一条具有无限容量
      的边连接
      p_i
      e_j
      iff
      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