Algorithm 基于时间间隔重叠、权重约束和距离最小化的组合分组优化问题
让每个元素都是单独的。考虑到一个个体被定义为每个个体都有一个时间范围、重量和位置。 目标是将时间范围重叠的个体分组,同时确保在组内个体的权重总和不超过某个阈值。同时,希望最小化组中个体之间的总距离。只要满足重量限制,就可以将尽可能多的个人放入一个组中。假设有N个个体(假设实际实现中最多有5000个个体) 目标是尽可能多的个体分组(即至少成对),同时最小化群体中个体之间的总距离。这个问题似乎是NP难的,所以我不是在寻找一个全局最小值,而是一个好的解决方案 例如,考虑离散时间情况下的一个例子,其中有十个时间间隔。[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]. 权重阈值为4,个体位置为一维整数线上的点。 假设我们有以下人员:Algorithm 基于时间间隔重叠、权重约束和距离最小化的组合分组优化问题,algorithm,optimization,grouping,nonlinear-optimization,Algorithm,Optimization,Grouping,Nonlinear Optimization,让每个元素都是单独的。考虑到一个个体被定义为每个个体都有一个时间范围、重量和位置。 目标是将时间范围重叠的个体分组,同时确保在组内个体的权重总和不超过某个阈值。同时,希望最小化组中个体之间的总距离。只要满足重量限制,就可以将尽可能多的个人放入一个组中。假设有N个个体(假设实际实现中最多有5000个个体) 目标是尽可能多的个体分组(即至少成对),同时最小化群体中个体之间的总距离。这个问题似乎是NP难的,所以我不是在寻找一个全局最小值,而是一个好的解决方案 例如,考虑离散时间情况下的一个例子,其中有
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。 有没有人推荐一种算法来解决这样的问题
[ [] , [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