天天看点

#CCF-计算资源调度器-202203-3

#CCF-计算资源调度器-202203-3
#CCF-计算资源调度器-202203-3

得分只有80分,保存后续继续改进。

过滤阶段

在这个阶段,先根据计算任务的要求,过滤出所有满足要求的计算节点。如果不存在这样的计算节点,并且指定了计算任务反亲和性要求,并且计算任务反亲和性要求是尽量满足的,

那么去掉计算任务反亲和性要求,再过滤一次。如果还不存在,就认为该计算任务的要求无法满足,该计算任务无法分配。

排序阶段

在这个阶段,将过滤后的计算节点按照这个方法排序:

选择此时运行计算任务数量最少的计算节点;

选择编号最小的计算节点。

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()