人 我遇到了算法问题,它不是一个功课,而只是来自一个网站的问题。它描述如下:
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
};
目标:
从庞大的数据来看,公司安排按小时付薪的工人来接订单,所有工人的总工作时间越长算法越好。
假设:
我已经想过这个问题好几天了,但是我想不出最适合这个问题的传统算法。它可能与大数据处理算法有关,但我不确定。 有人能好好想到这个问题吗? 谢谢!
答案 0 :(得分:1)
编辑:在考虑之后我意识到这个问题可能会减少到Multiple Traveling Salesman Problem (specifically with time windows),因此没有多项式时间解决方案。但是,在这个问题上已经做了很多工作,我确信你可以找到一个合适的算法来定制你的需求。这是SO question that might help out with that
可以使用图论和Hamiltonian paths来解决它:
uv
之间有一条边,重量为u.time_len+travelTime(u,v)
关于最短哈密顿路径算法的注释:
weight/10
和weight%10
变量weight/10
增加1时,返回一步并重新设定所有边缘权重减少travelTime(u,v)
(表示转移给新工作人员)weight%10
评估为路径中的下一个节点时,确保u.start_time
大于或等于u
进行测试(确保工作人员仅在开始时间后到达)确切的开始时间
确切的开始时间(工作人员必须在start_time
完全没有,不早,不迟到)会出现更多问题。这可以通过以下几种方式解决(尽管解决方案现在可能是次优的):