Python 算法-最大化最小平均组值的组/排序列表

Python 算法-最大化最小平均组值的组/排序列表,python,algorithm,sorting,optimization,Python,Algorithm,Sorting,Optimization,我正在寻找用Python编写算法的帮助,该算法可以实现以下功能: 给定一个实数列表,将列表排序/分组为n个较小的列表,以使平均最小组值最大化 例如,考虑将下面的列表分成两个列表——A和B,每个都有两个元素。 lis = [1,1,2,2] 在下面的第一个场景中,每个列表的最小值为1,因此平均最小值为1 # Scenario 1 A = [1,2] B = [1,2] # Scenario 2 A = [1,1] B = [2,2] 在第二种情况下,A的最小值为1,B的最小值为2,因此平均最

我正在寻找用Python编写算法的帮助,该算法可以实现以下功能:

给定一个实数列表,将列表排序/分组为n个较小的列表,以使平均最小组值最大化

例如,考虑将下面的列表分成两个列表——A和B,每个都有两个元素。

lis = [1,1,2,2]
在下面的第一个场景中,每个列表的最小值为1,因此平均最小值为1

# Scenario 1
A = [1,2]
B = [1,2]

# Scenario 2
A = [1,1]
B = [2,2]
在第二种情况下,A的最小值为1,B的最小值为2,因此平均最小值为1.5。这种安排是最佳的

很明显,最好将“相似”的值分组。我可以用(或一维k-means聚类)来实现这一点。然而,我不确定我的目标和Jenks优化的目标(数学上)是否等价

如有任何帮助或意见,将不胜感激


编辑:较小的列表必须具有相同的大小(假设给定的列表总是划分为较小的组,没有余数)。

似乎最简单的方法是对列表进行初始排序,以便始终将最低值分组在一起,例如:

# Define the list of values to group
values = [1, 2, 3, 10, 11, 12]

# Sort the values
values.sort()

# Split the values down into an even number of `n` groups
no_groups = 3
group_size = len(values) / no_groups
groups = []

for i in range(0, no_groups):
    groups.append(values[0:(group_size)])
    values = values[group_size:]

# Calculate the average minimum value of the groups
average_min = float(sum([g[0] for g in groups])) / no_groups

print(average_min)

但是考虑到你提到的Jenks和K-means聚类,我担心这太简单了,我遗漏了什么?

解决这一问题的最佳方法是将数字从最小到最大排序,然后将排序后的列表拆分为
n
组,而无需进一步重新排列。任何对该分组进行改进的尝试都会降低其中一个分组的最小值,从而降低最小值的平均值

举例说明原因。

给出一个包含12个数字的列表:

[94, 82, 61, 2, 96, 34, 87, 13, 82, 91, 61, 39]
已排序的列表是:

[2, 13, 34, 39, 61, 61, 82, 82, 87, 91, 94, 96]
如果我们想要
n=3
组,那么这些组是:

[[2, 13, 34, 39], [61, 61, 82, 82], [87, 91, 94, 96]]
因此,最小值的平均值为
avg(2,61,87)=50

你能做得更好吗?答案是否定的。

将任何数字从一组A移动到另一组B将减少A的最小值,而不会相应增加B的最小值

例如,您可能会认为将61移动到其他组会有所帮助

一种可能的重新安排是:

[[2, 13, 34, 61], [39, 61, 82, 82], [87, 91, 94, 96]]
[[2, 13, 34, 39], [87, 61, 82, 82], [61, 91, 94, 96]]
此重新排列的值为
avg(2,39,87)=42

另一种可能的重新安排是:

[[2, 13, 34, 61], [39, 61, 82, 82], [87, 91, 94, 96]]
[[2, 13, 34, 39], [87, 61, 82, 82], [61, 91, 94, 96]]
此重新排列的值为
avg(2,61,61)=41


所以你看,我们不能通过移动61做得更好。同样,我们也不能通过移动任何数字来做得更好。

较小的列表是否都必须具有相同的大小?是的,它们必须具有相同的大小。对不起,我应该说的。把这些东西分类。根据需要切片。这会产生最佳的解决方案,但您可能问错了问题。是的,您只需要对列表进行排序,然后将其切分。把它分成n个子列表,每个子列表包含m个元素,把最小的m放在一个子列表中,下一个最小的m放在另一个子列表中,等等。我认为你是对的,这个问题没有多大意义,因为它归结为排序。