我参加过我国的本地编程竞赛。比赛名称为“ACM-ICPC Indonesia National Contest 2013”
比赛于2013-10-13 15:00:00(GMT +7)结束,我仍然对其中一个问题感到好奇。
您可以找到问题的原始版本here。
简要问题说明:
应该在几个“服务器”(计算机)上执行一组“作业”(任务)
每个作业应严格执行从开始时间S i 到结束时间E i
每台服务器一次只能执行一项任务
(这里很复杂)服务器从一个作业切换到另一个作业需要一些时间
如果服务器完成作业J x ,那么要启动作业J y ,它将需要在作业J x,y > x 完成。这是服务器清理作业J x 和加载作业J y 所需的时间。
换句话说,作业J y 可以在作业J x 之后运行当且仅当E x + T x,y < / sub>≤S y 。
问题是计算完成所有工作所需的最小服务器数量。
示例:
例如,让3个工作
S(1) = 3 and E(1) = 6
S(2) = 10 and E(2) = 15
S(3) = 16 and E(3) = 20
T(1,2) = 2, T(1,3) = 5
T(2,1) = 0, T(2,3) = 3
T(3,1) = 0, T(3,2) = 0
在此示例中,我们需要2台服务器:
Server 1: J(1), J(2)
Server 2: J(3)
示例输入:
简短说明:第一个3
是测试用例的数量,后跟作业数量(第二个3
表示案例1有3个作业),然后是通过E i 和S i ,然后是T矩阵(大小与作业数量相等)。
3 3 3 6 10 15 16 20 0 2 5 0 0 3 0 0 0 4 8 10 4 7 12 15 1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 8 10 4 7 12 15 1 4 0 50 50 50 50 0 50 50 50 50 0 50 50 50 50 0
示例输出:
Case #1: 2 Case #2: 1 Case #3: 4
个人评论:
所需时间可以表示为图表矩阵,因此我将其假设为有向无环图问题。
我到目前为止尝试的方法是蛮力和贪婪,但得到了错误的答案。 (不幸的是我不再有我的代码了)
也许可以通过动态编程来解决,但我不确定
我真的不清楚如何解决这个问题
因此,一个简单的提示或见解将对我非常有帮助。
答案 0 :(得分:3)
您可以通过计算maximum matching in a bipartite graph来解决此问题。
您的想法是尝试将工作结束时间与工作开始时间相匹配。
匹配的结束时间x和开始时间y表示同一服务器将执行作业x和作业y。
您需要的服务器数量将与不匹配的启动时间相对应(因为每个作业都需要一台新服务器)。
使用NetworkX的示例Python代码:
import networkx as nx
G=nx.DiGraph()
S=[3,10,16] # start times
E=[6,15,20] # end times
T = [ [0, 2, 5],
[0, 0, 3],
[0, 0, 0] ] # T[x][y]
N=len(S)
for jobx in range(N):
G.add_edge('start','end'+str(jobx),capacity=1)
G.add_edge('start'+str(jobx),'end',capacity=1)
for joby in range(N):
if E[jobx]+T[jobx][joby] <= S[joby]:
G.add_edge('end'+str(jobx),'start'+str(joby),capacity=1)
print N-nx.max_flow(G,'start','end')