Javascript 根据每个节点的权重进行聚类的算法/函数?

Javascript 根据每个节点的权重进行聚类的算法/函数?,javascript,python,algorithm,function,Javascript,Python,Algorithm,Function,假设我有以下几点: A 2 B 2 C 2 D 6 E 12 F 3 G 3 我想要一个函数,它接受所需组的#,并基于#/weight创建一个“集群”。例如,如果所需组的#是4,那么它可以返回类似于: (A, B, C), (D), (F, G), (E) A+B+C = 6 D = 6 F + G = 6 E = 12 有没有什么算法/函数可以让我得到这样的结果?有什么理想的方法吗 第一步,过滤掉任何大于6的值。但这里有个问题 由于要求将组中所有操作数相加的结果为6,因此不可能从操作数

假设我有以下几点:

A 2
B 2
C 2
D 6
E 12
F 3
G 3
我想要一个函数,它接受所需组的#,并基于#/weight创建一个“集群”。例如,如果所需组的#是4,那么它可以返回类似于:

(A, B, C), (D), (F, G),  (E)

A+B+C = 6
D = 6
F + G = 6
E = 12

有没有什么算法/函数可以让我得到这样的结果?有什么理想的方法吗

第一步,过滤掉任何大于6的值。但这里有个问题

由于要求将组中所有操作数相加的结果为6,因此不可能从操作数有限的小集合中获得任意数量的组。您可以在一个组中生成不同的操作数组合,但这需要将组中的所有操作数相加得到6。正如我在您的示例中看到的,对于大于或等于6的操作数,这些操作数形成了它们自己的组(例如,e和D)

就像你有两个2,一个3,只有一个1,通过在每个组中使用唯一的操作数,你能从这些数字的不同组合中得到多少个7

A = 2
B = 2 
C = 3 
D = 1 

上述操作数小于7

让我们排列这些操作数:

A + B      = 4 
A + C      = 3
A + D      = 3 
A + B + C  = 7
A + B + D  = 5 
A + C + D  = 6
B + C      = 5
B + D      = 3 
B + C + D  = 6
C + D      = 4
答案只有一组,当我们把它的所有操作数相加时,我们得到7。此组由三个操作数组成
A+B+C

这就是您所需算法的情况。尽管有时您可以获得任意数量的组,但即使您使用其他组中使用的操作数,也不能始终保证这一点,就像上面的示例一样,只有一个组在添加所有操作数时得到7

另外,加法是可交换的(A+B=B+A),所以我没有包括
B+A
C+B
D+C


因此,给定上述集合,您只能得到一个组,当我们将其所有操作数相加时,得到7。问题不仅在于组中操作数的唯一性;这也是我们拥有的有限值集的性质,它阻止我们获得任意数量的组。

这似乎是根据作业的权重将作业均匀分组,以分布在n个线程上

对于少量的作业,组合学可能是一种可行的方法,但是如果您有数千个作业要分组并分布在数百个线程上,那么组合学肯定是不可行的

因此,我的方法将是一个简单得多的两阶段解决方案。第一个阶段返回一个几乎完美的结果,第二个阶段尝试使其达到完美

由于时间有限,我现在只实施第一阶段,第二阶段留待以后几天。同时,请将其作为一项研究,并尝试自己实施。你自己

第一阶段的想法非常简单

  • 按降序排序作业(以便插入重作业 第一个和较轻的用于平衡)
  • 找到最轻的块
  • 将第一个作业插入到找到的块中
  • 找到最轻的块
  • 将下一个作业插入到找到的块中,然后继续执行步骤4
  • 这就是我如何实现的

    函数chunkJobs(js,cc){//jobs和chunk计数为参数
    var init=[…数组(cc)].map(=>({“作业”:[],“权重”:0}));
    返回js.sort((a,b)=>b.weight-a.weight)
    .减少(功能(cs,j){
    var c=cs.reduce((p,c)=>p.weightconsole.log(result)
    查看一下。不清楚您想要什么。是否要将具有相同权重的所有节点收集到单独的簇中?如果簇的数量与唯一权重的数量不同,该怎么办?还是希望簇的聚合权重相同?(那么在你的例子中E不是一个好的簇。)尽可能使簇的聚合权重相同。
    A + B      = 4 
    A + C      = 3
    A + D      = 3 
    A + B + C  = 7
    A + B + D  = 5 
    A + C + D  = 6
    B + C      = 5
    B + D      = 3 
    B + C + D  = 6
    C + D      = 4