202203-3 计算资源调度器

 

 

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:  # 满足反亲和性要求  应用里没有paai
                        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:  #有亲和要求 且满足了
                    
                    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#该结点 次数+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()

 

posted @ 2023-03-16 23:13  吃人不吐葡萄  阅读(50)  评论(0)    收藏  举报