将主题分配给没有重复的工作者

时间:2015-10-07 15:17:39

标签: javascript arrays node.js object

我正在使用Twitter API的网站上工作,专门用于跟踪各个关键字。我需要在多个worker之间分配这个负载,但为了最大化我可以进行的请求数量,我需要确保每次运行赋值函数时都会发生以下情况(大约每小时一次):

  • 每位工作人员的分配尽可能接近相等的份额
  • 以前分配了关键字的工作人员尽可能保留该关键字
  • 没有为多个工作人员分配关键字

我有两个定义关键字和工人的对象。请参阅下面的示例。出于错误测试的缘故,正如您所看到的那样,我有多个工作人员跟踪同一个广告系列,这种活动永远不应该发生,但即使有,也需要重新分配。

// Topics
[{
  topics: ['marathon', 'education', 'computing', 'schools'],
  campaign: 'Some random campaign 1'
},
{
  topics: ['education', 'sport', 'tourism', 'london'],
  campaign: 'Some random campaign 2'
},
{
  topics: ['ict', 'sport', 'fintech'],
  campaign: 'Some random campaign 3'
}]

// Workers
{
  "9779959f-2e99-4083-b578-eb9f31c60b46":{
    "worker":"9779959f-2e99-4083-b578-eb9f31c60b46",
    "topics":["marathon","digitaljersey","fintech", "sport", "education", "ict"]
  },
  "129a5e00-0d77-4156-98df-e1795ac2bccc":{
    "worker":"129a5e00-0d77-4156-98df-e1795ac2bccc",
    "topics":["education","sport","marathon"]
  },
  "3240f648-522a-4eb3-befb-b03f0181f329":{
    "worker":"3240f648-522a-4eb3-befb-b03f0181f329",
    "topics":["ict","computing","utilities"]
  }
}

如您所见,主题是一个对象数组,每个对象都有要跟踪的关键字。这些可以具有任意数字,并且可以在广告系列中重复关键字。

我有自己的工作人员对象,详细说明了他们当前分配的主题。这些都提供给我的功能。

我采用的方法是通过迭代主题来创建主题图。然后我迭代了工作者,检查它的主题是否出现在主题图中。如果不是,那么就不需要跟踪它。如果是,则我将主题图中的worker值设置为作业的worker值。在接下来的迭代中,它检查是否存在这种情况,如果它存在,那么它已被考虑,并被忽略。

然后我遍历主题图,找到没有任务的任何内容,并将它们添加到重新分配数组中。然后,我计算重新分配数组中的数字,并计算总数,并确定每个工作人员的数量。任何超过30%或更多的任何一个随机获取并推送到重新分配数组,直到它们在30%的边界内。

然后我为每个工作者分配一个,并继续直到数组为空。但是,它根本不起作用。我最终得到了重复,未分配的主题等等。

以下是上述输出:

9779959f-2e99-4083-b578-eb9f31c60b46
  -> fintech
  -> sport
  -> education
  -> ict

129a5e00-0d77-4156-98df-e1795ac2bccc
  -> sport
  -> computing
  -> marathon

3240f648-522a-4eb3-befb-b03f0181f329
  -> computing
  -> london
  -> fintech 

这是我的代码:https://jsfiddle.net/BenedictLewis/6q29m9y9/

有人可以帮我解决这个问题,还是建议一个更好的方法呢?

0 个答案:

没有答案