向小时工工人发送订单的最佳解决方案?

时间:2015-08-21 02:42:00

标签: algorithm bigdata

人 我遇到了算法问题,它不是一个功课,而只是来自一个网站的问题。它描述如下:

    1。有一家家政中介公司,有两个巨大的资源:数百万小时工薪酬和家务订单。
    2。每小时工资的工人只有一个身份证。
    3。管家订单可以这样描述:
struct order_head {
    uint32_t id;  // order id
    double pos_x; // (pos_x, pos_y) indicate the house's position. pos_x is the house's x-coordinate
    double pos_y; // pos_y is the house's y-coordinate
    int8_t time_len; // The house cleaning time required the customer.
    int8_t has_start_time; // Does the customer designate the serving time interval.
    int32_t start_time; // If the customer designate the serving time, this indicate the start_time of the time interval. (start_time, start_time+time_len) indicate the serving time
};

目标:
从庞大的数据来看,公司安排按小时付薪的工人来接订单,所有工人的总工作时间越长算法越好。

假设:

    1。一天的工作时间是08:00~18:00,10小时。
    2。工人按小时工资说30美元/小时,但是从最终工作的房子到开始工作的房子必须浪费一些时间。两院之间的距离越远,浪费的时间越多。
    3。最初,工人被安置在他们的第一个服务中心。

我已经想过这个问题好几天了,但是我想不出最适合这个问题的传统算法。它可能与大数据处理算法有关,但我不确定。 有人能好好想到这个问题吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

编辑:在考虑之后我意识到这个问题可能会减少到Multiple Traveling Salesman Problem (specifically with time windows),因此没有多项式时间解决方案。但是,在这个问题上已经做了很多工作,我确信你可以找到一个合适的算法来定制你的需求。这是SO question that might help out with that

或者,这是我的家庭推算算法:

可以使用图论和Hamiltonian paths来解决它:

  • 首先从作业中创建directed graph,其中每个顶点都是作业,并且每对顶点uv之间有一条边,重量为u.time_len+travelTime(u,v) enter image description here
  • 然后必须找到该图的shortest Hamiltonian path,花费时间O(n 2 * 2n)
  • 在此之后,您只需使用工人遍历列表,直到最大重量<1。已经积累了10个,然后转移到下一个工人
  • 请注意,您的初始权重将是第一个作业节点的时间成本

关于最短哈密顿路径算法的注释:

  • 您需要保留weight/10weight%10变量
  • weight/10增加1时,返回一步并重新设定所有边缘权重减少travelTime(u,v)(表示转移给新工作人员)
  • 在将weight%10评估为路径中的下一个节点时,确保u.start_time大于或等于u进行测试(确保工作人员仅在开始时间后到达)

确切的开始时间

确切的开始时间(工作人员必须在start_time完全没有,不早,不迟到)会出现更多问题。这可以通过以下几种方式解决(尽管解决方案现在可能是次优的):

  • 简单地将工人的起始位置移到汉密尔顿路径上
  • 对于每个确切的起始节点,创建一个&lt; 10权重路径(如果方便的话,这可以包括其他精确的起始节点)。然后从图中删除所有这些节点及其相关边,假设一个工作程序用于每个路径,并在剩余图上继续使用原始算法