Algorithm 基于时间间隔重叠、权重约束和距离最小化的组合分组优化问题

Algorithm 基于时间间隔重叠、权重约束和距离最小化的组合分组优化问题,algorithm,optimization,grouping,nonlinear-optimization,Algorithm,Optimization,Grouping,Nonlinear Optimization,让每个元素都是单独的。考虑到一个个体被定义为每个个体都有一个时间范围、重量和位置。 目标是将时间范围重叠的个体分组,同时确保在组内个体的权重总和不超过某个阈值。同时,希望最小化组中个体之间的总距离。只要满足重量限制,就可以将尽可能多的个人放入一个组中。假设有N个个体(假设实际实现中最多有5000个个体) 目标是尽可能多的个体分组(即至少成对),同时最小化群体中个体之间的总距离。这个问题似乎是NP难的,所以我不是在寻找一个全局最小值,而是一个好的解决方案 例如,考虑离散时间情况下的一个例子,其中有

让每个元素都是单独的。考虑到一个个体被定义为每个个体都有一个时间范围、重量和位置。 目标是将时间范围重叠的个体分组,同时确保在组内个体的权重总和不超过某个阈值。同时,希望最小化组中个体之间的总距离。只要满足重量限制,就可以将尽可能多的个人放入一个组中。假设有N个个体(假设实际实现中最多有5000个个体)

目标是尽可能多的个体分组(即至少成对),同时最小化群体中个体之间的总距离。这个问题似乎是NP难的,所以我不是在寻找一个全局最小值,而是一个好的解决方案

例如,考虑离散时间情况下的一个例子,其中有十个时间间隔。[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. 权重阈值为4,个体位置为一维整数线上的点。 假设我们有以下人员:

A: time range: [1, 2, 3] | weight: 1 | location: 1
B: time range: [2, 3, 4] | weight: 2 | location: 2
C: time range: [4, 5, 6] | weight: 2 | location: -3
D: time range: [4, 5, 6] | weight: 3 | location: -3
注意:

  • A和C不能分组,因为它们没有重叠的时间范围
  • 将A和B组合在一起比将B和C组合在一起更好,因为A和B更接近
  • C和D不能分组,因为它们的权重之和超过4。 有没有人推荐一种算法来解决这样的问题
我已经看过了(计算智能666研究)Michael Mutingi,Charles Mbohwa(作者)-分组遗传算法的例子uu进展和应用Springer International Publishing(2017)。然而,没有一种分组算法看起来非常合适

理解/解释此问题的不同方式:

解释1:箱子包装问题

目标是找到个体的一个分区,这样在每个分区内,所有成员的时间范围都重叠。每个分区的总“权重”总和低于某个阈值(请注意,没有单个分区会超过权重阈值)。总“距离”总和(通过将每个分区导出的距离相加计算)最小化。只有一个单独的分区形成

解释2:

见下文

我解决这个问题的不切实际的方法

步骤1:定义个人

第2步:寻找可能与时间相容的个体

假设一天24小时被定义为24个一小时的垃圾箱。每个箱子代表一小时。例如,索引6处的箱子表示上午6点。我们把这个叫做时间表吧

我们根据个人的时间范围将其放入这些垃圾箱。例如,如果John的时间范围为[1,2],Wilson的时间范围为[2,3],则时间表将按如下方式填充:

[ [] , [John] , [John, Wilson], [Wilson], [] , ... , [] ]
在这里,同一垃圾箱中的个人可能被分组

过时的

步骤3:基于权重约束生成可行组

让我们将组的重量限制定义为4

对于时间表中的每个bin,我们生成满足权重的组 约束(个体权重之和小于4)。 注意,我们可以跳过一个或更少人的垃圾箱。在这里 每组都有以下特点:

Group:
   Individuals: [ Person1, Person2, ... ]
   Weight: INT (computed by summing weight of individuals)
   Distance: FLOAT (computed by finding distance sum between individuals)
我们将生成的所有组存储在一个数据库中 被称为可生存组的列表

第4步:找到最佳组集

我们通过寻找不相交的集合来优化组/分区 分组,使总距离和最小化

此方法存在问题

到第3步,这种方法在计算上变得不可行,因为我们 通过枚举生成所有可能的组

更新:

第1步:“个人”的新定义

一开始,每个人都被视为一个单独的群体:

Group:
   members: [person1]
   time range: [0, 1, 2, 3, 4, 5]
   weight: 2
   location: -3
第二步:同上

步骤3:按人口对时间箱进行排序

时间存储单元按该存储单元中单个组的数量降序排列。排序后,单身组数量最多的时间仓位排名第一

步骤4:合并组,直到无法合并

从第一个时间点开始,构造一个图,使节点为组,边表示两个组之间的距离。只有当两组的重量总和不超过最大容量时,两组之间才存在一条边。例如,让权重阈值为4,并考虑以下单个组:

group1:
   members: [person1]
   time range: [0, 1, 2]
   weight: 1
   location: -3

group2:
   members: [person2]
   time range: [0, 1, 2, 3]
   weight: 2
   location: 0

group3:
   members: [person3]
   time range: [0, 1]
   weight: 3
   location: 1
请注意,在3条可能的边中,存在以下边:

group1 -- 3 -- group2
group1 -- 4 -- group3
这是因为group2-group3超过了权重阈值4

现在我们找到具有最小值的边并合并两个端点节点。合并两个节点后,我们根据新的可用节点集重新计算边,然后重复,直到不存在边为止

根据上述示例,我们将合并group1和group2以获得:

group12:
   members: [person1, person2] (union of members)
   time range: [0, 1, 2] (intersection of time ranges)
   weight: 3 (sum of weights)
   location: 1.5 (center between two locations)

group3:
   members: [person3]
   time range: [0, 1]
   weight: 3
   location: -3
现在,如果我们重新计算边,我们会看到没有边存在。这样,我们就完成了第一个时间段

接下来,我们删除所有具有和后续时间段中的成员重叠的成员的单例组。例如,在本例中,如果我们在后续步骤中找到group1、group2或group3,我们将删除这些组

我们重复我们在第一次存储箱上执行的合并过程

我们重复这个直到最后一次

到目前为止,这是我的方法,我意识到这不是最有效的方法。有人有改进的建议吗?如果解释的任何部分不清楚,请在评论中告诉我!
group12:
   members: [person1, person2] (union of members)
   time range: [0, 1, 2] (intersection of time ranges)
   weight: 3 (sum of weights)
   location: 1.5 (center between two locations)

group3:
   members: [person3]
   time range: [0, 1]
   weight: 3
   location: -3