2021华为软挑再探——代码实现

前天的程序存在写问题,主要反映在程序运行时长高等

Python实现——2021华为软挑初探

2021华为软挑部分答疑——哪些你有错却总是找不到的地方,我来带你找啦(含标准输入代码)

今天做了下改进:

代码如下:

运行时长:69.91018056869507,测试为training-1

import sys
import os
import re
import random
import numpy as np
import copy
import time



class Sever_Machine:
    def __init__(self,Sever):
        self.Model=Sever[0]                    #型号
        self.CPU_cores=Sever[1]            #CPU核数
        self.Memory_Size=Sever[2]        #内存大小
        self.Hardware_cost=Sever[3]    #硬件成本
        self.Energy_cost=Sever[4]        #能耗成本
        self.No_=0
        self.Node_A=[]                      #当前A节点剩余核数内存情况
        self.Node_B=[]                      #当前B节点剩余核数内存情况
        self.Both=[]
        self.assigned=[]
        self.assigned_Node=[]
        self.rest_CPU_A=self.CPU_cores/2
        self.rest_Memory_A=self.Memory_Size/2
        self.rest_CPU_B = self.CPU_cores/2
        self.rest_Memory_B = self.Memory_Size/2

    def add_to_Node_A(self,V):
        self.Node_A.append(V)
        self.assigned.append(V[4])
        self.assigned_Node.append(1)
        self.rest_Memory_A -= V[2]
        self.rest_CPU_A -= V[1]

    def add_to_Node_B(self,V):
        self.Node_B.append(V)
        self.assigned.append(V[4])
        self.assigned_Node.append(2)
        self.rest_Memory_B -= V[2]
        self.rest_CPU_B -= V[1]

    def add_to_both(self,V):
        self.Both.append(V)
        self.assigned.append(V[4])
        self.assigned_Node.append(0)
        self.rest_CPU_A-=V[1]/2
        self.rest_Memory_A-=V[2]/2
        self.rest_CPU_B -= V[1]/ 2
        self.rest_Memory_B -= V[2] / 2

    def Judge_whether_to_insert(self,V):
        K=[]
        if V[3]==1:
            if self.rest_CPU_A>=V[1]/2 and self.rest_CPU_B>=V[1]/2 and\
                    self.rest_Memory_A>=V[2]/2 and self.rest_Memory_B>=V[2]/2:
                self.add_to_both(V)
                return True
            else:
                return False
        if V[3]==0:
            if self.rest_CPU_A>=V[1] and self.rest_Memory_A>=V[2] :
                K.append(1)
            if self.rest_CPU_B >= V[1] and self.rest_Memory_B >=V[2]:
                K.append(2)
            if len(K)==2:
                if random.choice(K)==1:
                    self.add_to_Node_A(V)
                else:
                    self.add_to_Node_B(V)
                return True
            elif len(K)==1:
                if K[0]==1:
                    self.add_to_Node_A(V)
                else:
                    self.add_to_Node_B(V)
                return True
            else:
                return False

    def del_Virtual(self,V):
        K=self.assigned.index(V[4])
        K_1=self.assigned_Node
        M=self.assigned_Node[K]
        if M==0:
            self.rest_CPU_A += V[1]
            self.rest_Memory_A += V[2]
        if M==1:
            self.rest_CPU_B += V[1]
            self.rest_Memory_B += V[2]
        if M==0:
            self.rest_CPU_A += V[1] / 2
            self.rest_Memory_A += V[2] / 2
            self.rest_CPU_B += V[1] / 2
            self.rest_Memory_B += V[2] / 2
        self.assigned.remove(V[4])
        del self.assigned_Node[K]
        O=self.assigned_Node

    def Node_Situation(self):
        Load_CPU_A=self.CPU_cores/2-self.rest_CPU_A
        Load_CPU_B=self.CPU_cores/2-self.rest_CPU_B
        Load_M_A=self.Memory_Size/2-self.rest_Memory_A
        Load_M_B=self.Memory_Size/2-self.rest_Memory_B
        return Load_CPU_A,Load_CPU_B,Load_M_A,Load_M_B

    def Use_situation(self):
        Load_CPU= self.CPU_cores  - self.rest_CPU_A-self.rest_CPU_A
        Load_M = self.Memory_Size - self.rest_Memory_A- self.rest_Memory_B
        return Load_CPU,Load_M

    def replace_machine(self,Sev):
        self.Model = Sev[0]  # 型号
        self.CPU_cores = Sev[1]  # CPU核数
        self.Memory_Size = Sev[2]  # 内存大小
        self.Hardware_cost = Sev[3]  # 硬件成本
        self.Energy_cost = Sev[4]  # 能耗成本


class daily_situation:
    def __init__(self,Sever,Virtual,use_Case):
        self.Sever=Sever
        self.Virtual=Virtual
        self.Virtual_name=list(np.array(Virtual)[:,0])
        self.use_Case=use_Case
        self.days=0.2*(len(use_Case))
        self.Sever_have=[]
        self.Configured=[]


    def Sever_Select(self,K):
        V=copy.copy(K)
        Selected_Sever = []
        Select = random.choice(self.Sever)
        Select_i = Sever_Machine(Select)
        while V != []:
            Select_V =random.choice(V)
            result = Select_i.Judge_whether_to_insert(Select_V)
            if result == True:  # 随机配置
                V.remove(Select_V)
                if V==[]:
                    Selected_Sever.append(Select_i)
                    break
            if result == False:
                for i in range(len(V)):
                    result = Select_i.Judge_whether_to_insert(V[i])
                    if result == True:
                        V.remove(V[i])
                        break
                if result == False and i >= len(V) - 1:
                    Selected_Sever.append(Select_i)
                    Select = random.choice(self.Sever)
                    Select_i = Sever_Machine(Select)
        return Selected_Sever

        return Selected_Sever

    def add_to_old(self,S,V):
        for i in range(len(S)):
            if V!=[]:
                random.shuffle(V)
                for V_i in V:
                    result=S[i].Judge_whether_to_insert(V_i)
                    if result==True:
                        V.remove(V_i)
        return S,V

    def transfer(self,Sever,V_total):
        Transferable_num = int(len(V_total) * 5 / 1000)
        if Transferable_num>0:
            # for i in range(len())
            pass
        else:
            pass
        return Sever

    def Virtual_use(self):
        User_total=[]
        V_Total=[]
        User_used_Sever=[]
        Coun=0
        Total_Host=[]
        for i in range(len(self.use_Case)):
            daily_used_Sever=[]
            Old_Sever_unfull_i = []
            daily_Buy_Host=[]
            V_T = []
            Host_buy = Sever_Machine(random.choice(self.Sever))
            daily_Buy_Host.append(Host_buy)
            for j in range(len(self.use_Case[i])):
                if self.use_Case[i][j][0] == 'add':
                    V_I = copy.copy(self.Virtual[self.Virtual_name.index(self.use_Case[i][j][1])])
                    V_I.append(self.use_Case[i][j][2])
                    V_Total.append(V_I)
                    V_T.append(V_I)
                    User_total.append(self.use_Case[i][j][2])
                    if Old_Sever_unfull_i!=[]:
                        for Old_i in Old_Sever_unfull_i:
                            result = Old_i.Judge_whether_to_insert(V_I)
                            if result==True:
                                User_used_Sever.append(Old_i)
                                daily_used_Sever.append(Old_i)
                                Old_Sever_unfull_i.remove(Old_i)
                                break
                        if result==False:
                            result = Host_buy.Judge_whether_to_insert(V_I)
                            if result == True:
                                User_used_Sever.append(Host_buy)
                                daily_used_Sever.append(Host_buy)
                            else:
                                Host_buy = Sever_Machine(random.choice(self.Sever))
                                daily_Buy_Host.append(Host_buy)
                                Host_buy.Judge_whether_to_insert(V_I)
                                daily_used_Sever.append(Host_buy)
                                User_used_Sever.append(Host_buy)
                    else:
                        result=Host_buy.Judge_whether_to_insert(V_I)
                        if result == True:
                            User_used_Sever.append(Host_buy)
                            daily_used_Sever.append(Host_buy)
                        else:
                            Host_buy=Sever_Machine(random.choice(self.Sever))
                            daily_Buy_Host.append(Host_buy)
                            Host_buy.Judge_whether_to_insert(V_I)
                            daily_used_Sever.append(Host_buy)
                            User_used_Sever.append(Host_buy)
                if self.use_Case[i][j][0] == 'del':
                    V_name=self.use_Case[i][j][0]
                    User_Site = User_total.index(self.use_Case[i][j][1])
                    Vm = V_Total[User_Site]
                    try:
                        Sever_use=User_used_Sever[User_Site]
                        Sever_use.del_Virtual(Vm)
                        Old_Sever_unfull_i.append(Sever_use)
                        User_total.remove(User_total[User_Site])
                        if V_Total[User_Site] in V_T:
                            V_site=V_T.index(V_Total[User_Site])
                            del daily_used_Sever[V_site]
                            V_T.remove(V_Total[User_Site])
                        del V_Total[User_Site]
                        del User_used_Sever[User_Site]
                    except:
                        for Vm_i in range(len(User_used_Sever)):
                            if self.use_Case[i][j][1] in User_used_Sever[Vm_i].assigned:
                                User_used_Sever[Vm_i].del_Virtual(Vm)
                                Old_Sever_unfull_i.append(User_used_Sever[Vm_i])
                                User_total.remove(User_total[Vm_i])
                                if Vm in V_T:
                                    V_site = V_T.index(Vm)
                                    del daily_used_Sever[V_site]
                                    V_T.remove(Vm)
                                V_Total.remove(Vm)
                                del User_used_Sever[Vm_i]



            Total_Host.extend(daily_Buy_Host)
            Q=[]
            for S_k in range(len(daily_Buy_Host)):
                Q.append(daily_Buy_Host[S_k].Model)
            Q_set = set(Q)
            Q_num = len(list(Q_set))
            print('(Purchase,', Q_num, ')')
            for Q_i in Q_set:
                print('(',Q_i,',', Q.count(Q_i), ')')
            print('(migration,', 0, ')')
            for Q_seti in Q_set:
                for day_i in daily_Buy_Host:
                    if day_i.Model==Q_seti:
                        day_i.No_=Coun
                        Coun+=1
            for V_k in range(len(V_T)):
                try:
                    if daily_used_Sever[V_k].assigned_Node[daily_used_Sever[V_k].assigned.index(V_T[V_k][4])] == 1:
                        print('(', daily_used_Sever[V_k].No_, ',', 'A', ')')
                    if daily_used_Sever[V_k].assigned_Node[daily_used_Sever[V_k].assigned.index(V_T[V_k][4])] == 2:
                        print('(', daily_used_Sever[V_k].No_, ',', 'B', ')')
                    if daily_used_Sever[V_k].assigned_Node[daily_used_Sever[V_k].assigned.index(V_T[V_k][4])] == 0:
                        print('(', daily_used_Sever[V_k].No_,  ')')
                except:
                    for day_j in range(len(daily_used_Sever)):
                        if V_T[V_k][4] in daily_used_Sever[day_j].assigned:
                            if daily_used_Sever[day_j].assigned_Node[
                                daily_used_Sever[day_j].assigned.index(V_T[day_j][4])] == 1:
                                print('(', daily_used_Sever[day_j].No_, ',', 'A', ')')
                            if daily_used_Sever[day_j].assigned_Node[
                                daily_used_Sever[day_j].assigned.index(V_T[day_j][4])] == 2:
                                print('(', daily_used_Sever[day_j].No_, ',', 'B', ')')
                            if daily_used_Sever[day_j].assigned_Node[
                                daily_used_Sever[day_j].assigned.index(V_T[day_j][4])] == 2:
                                print('(', daily_used_Sever[day_j].No_,  ')')



def Get_data(path):
    if os.path.exists(path):
        with open(path,'r') as data:
            Lis=data.readlines()
            Sever=[]
            Virtual=[]
            counter=0
            use_Case=[]
            while Lis:
                num=Lis[0].strip().split('\n')[0]
                if num.isdigit():
                    Lis=Lis[1:len(Lis)]
                    last_num=int(num)
                else:
                    add_sentence=Lis[0:last_num]
                    P=[]
                    for i in range(len(add_sentence)):
                        P_1=[]
                        sentence = add_sentence[i]
                        result=re.findall(r'[a-zA-Z0-9.]{1,}',sentence)
                        for r_i in result:
                            if r_i.isdigit():
                                P_1.append(int(r_i))
                            else:
                                P_1.append(r_i)
                        P.append(P_1)
                    if counter==0:
                        Sever=P
                    if counter==1:
                        Virtual=P
                    if counter>1:
                        use_Case.append(P)
                    counter+=1
                    Lis=Lis[last_num:len(Lis)]
    return Sever,use_Case,Virtual

def main():
    # to read standard
    S = time.time()
    A = Get_data('training-1.txt')
    # process
    d=daily_situation(A[0],A[2],A[1])
    d.Virtual_use()
    E = time.time()
    print(E - S)
    # to write standard output
    # sys.stdout.flush()

if __name__ == "__main__":
    main()

猜你喜欢

转载自blog.csdn.net/crazy_girl_me/article/details/115005087