将订单发送给按小时支付的工人的最佳解决方案?
Posted
技术标签:
【中文标题】将订单发送给按小时支付的工人的最佳解决方案?【英文标题】:Best solution to dispatch order to hourly-paid worker? 【发布时间】:2015-11-14 21:09:19 【问题描述】:伙计们 我遇到了一个算法问题,这不是作业,而只是来自网站的问题。描述如下:
- 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。最初,工人被安置在他们的第一间服务处。
我已经想了几天这个问题,但我想不出最适合这个问题的传统算法。它可能与大数据处理算法有关,但我不确定。 有人能好好想想这个问题吗? 谢谢!
【问题讨论】:
我不明白the total working time of all workers is larger the algorithm is better.
是什么意思
【参考方案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)
那么必须找到这张图的shortest Hamiltonian path,耗时O(n2*2n)
在此之后,您只需使用一个工人遍历列表,直到最大重量
请注意,您的初始权重将是第一个作业节点的时间成本
最短哈密顿路径算法注意事项:
您需要保留weight/10
和 weight%10
变量
当weight/10
增加 1 时,后退一步并重做所有边权重减少 travelTime(u,v)
(表示转移到新工人)
在将u
评估为路径中的下一个节点时进行测试以确保weight%10
大于或等于u.start_time
(确保工作人员仅在开始时间之后到达)
确切的开始时间
确切的开始时间(工人必须在 start_time
准确地在那里,不能更早,也不能更晚)提出了更多的问题。这可以通过以下几种方式解决(尽管该解决方案现在可能不是最佳的):
【讨论】:
以上是关于将订单发送给按小时支付的工人的最佳解决方案?的主要内容,如果未能解决你的问题,请参考以下文章