在这个阶段,先根据计算任务的要求,过滤出所有满足要求的计算节点。如果不存在这样的计算节点,并且指定了计算任务反亲和性要求,并且计算任务反亲和性要求是尽量满足的,
那么去掉计算任务反亲和性要求,再过滤一次。如果还不存在,就认为该计算任务的要求无法满足,该计算任务无法分配。
在这个阶段,将过滤后的计算节点按照这个方法排序:
选择此时运行计算任务数量最少的计算节点;
选择编号最小的计算节点。
n, m = map(int, input().split()) # 计算节点的数目 可用区的数目
l_i = list(map(int, input().split())) # 计算节点位于编号
dic_0 = {} # 存放每个区的可用节点编号
dic_1 = {} # 存放节点对应信息
list_p = [0 for i in range(n + 1)] # 节点利用次数
for i in range(1, m+1):
dic_0[i] = []
for i in range(1,n+1):
dic_1[i] = [] # 存放应用编号
dic_0[l_i[i-1]].append(i)
dic_0[0] = [i for i in range(1,n+1)]
def search_node(node_s, pai, paa_i):
if node_s.count(pai) != 0:
return 0
g = int(input()) # 任务的组数
g_1 = []
for i in range(g):
g_i = list(map(int, input().split()))
fi, ai, nai, pai, paa_i, paar_i = g_i # 任务数、应用编号、nai的可用区内1,与应用编号一起2、与应用编号不一起3,必须满足/
g_2 = []
for j in range(fi):
p1 = len(dic_0[nai]) # 符合条件1的节点数量
p2 = [] # 符合条件的节点
p3 = [] # 符合条件的节点 去除亲和性
if p1 > 0: # 该可用区有计算节点,且计算节点就是dic_0[nai]
for k in range(p1):
node_num = dic_0[nai][k] #节点编号 dic_1[node_num]是[]包含应用信息
if pai == 0:
if paa_i == 0:
p2.append([node_num, len(dic_1[node_num])])
elif dic_1[node_num].count(paa_i) == 0: # 必须满足亲和性要求
p2.append([node_num,len(dic_1[node_num])]) #添加节点编号及其任务数量
elif paar_i == 0 and dic_1[node_num].count(paa_i) != 0:
p3.append([node_num,len(dic_1[node_num])])
elif dic_1[node_num].count(pai) != 0: # 与应用编号一起2,满足亲和性
if paa_i == 0:
p2.append([node_num, len(dic_1[node_num])])
elif dic_1[node_num].count(paa_i) == 0: # 必须满足亲和性要求
p2.append([node_num, len(dic_1[node_num])]) # 添加节点编号及其任务数量
elif paar_i == 0 and dic_1[node_num].count(paa_i) != 0:
p3.append([node_num, len(dic_1[node_num])])
if len(p2) != 0:
p2.sort(key=lambda x : (x[1],x[0]))
g_2.append(p2[0][0])
list_p[p2[0][0]] += 1
dic_1[p2[0][0]].append(ai)
elif len(p3) != 0:
p3.sort(key=lambda x: (x[1], x[0]))
g_2.append(p3[0][0])
list_p[p3[0][0]] += 1
dic_1[p3[0][0]].append(ai)
else:
g_2.append(0)
g_1.append(g_2)
for i in range(g):
for j in g_1[i]:
print(j,end = ' ')
print()