一個小程式:計算績效的方案
阿新 • • 發佈:2018-11-10
因為強制要求考核績效,為了大家雨露均沾,考慮制定平均的績效方案
比較挫的用了窮舉,跑起來很慢啊...
# -*- coding:utf-8 -*- ''' 用來計算指定季度,指定績效評分型別,平均績效方案 ''' class check_list: def __init__(self,season=4): self.get_list=set() self.season=season self.target=None self.count=0 def job(self,list_a,result=()): ''' 計算所有可能的績效排列方案,結果儲存在self.get_list中,去重 ''' if(len(list_a)==1): result += (list_a[0],) self.get_list.add(result) else: for i in range(len(list_a)): a_bak=list_a[:] del a_bak[i] self.job(a_bak,result+(list_a[i],)) def count_score(self,list_a): ''' 用來計算績效方案的方差值 計算方法: 分別計算每個人所有季度的績效分數總和,然後計算每個人總和的方差 ''' i_total=len(list_a) j_total=len(list_a[0]) person_score=[] for j in range(j_total): temp=0 for i in range(i_total): temp+=list_a[i][j] person_score.append(temp) avg=sum(person_score)/j_total sdsq=sum([(i-avg)**2 for i in person_score]) stdev=(sdsq/(j_total-1)**0.5) #print(stdev) return stdev def get_total_list(self,list_src,result_list=[]): ''' 窮舉所有的排列情形,找出方差最小的績效方案 ''' if(len(result_list)==self.season): self.count+=1 stdev=self.count_score(result_list) if(self.target==None): self.target=[] self.target.append(result_list) self.target.append(stdev) else: if(stdev<self.target[-1]): self.target=[] self.target.append(result_list) self.target.append(stdev) #print(self.target) else: for i in list_src: if(len(result_list)>0): # 不能連續兩個季度同一個人拿-1 if(i.index(-1)!=result_list[-1].index(-1)): temp=result_list[:] temp.append(i) self.get_total_list(list_src,temp) else: temp=result_list[:] temp.append(i) self.get_total_list(list_src,temp) # 績效型別 score=[2,2,1,1,1,-1] # 績效時長 season=4 c=check_list(season) c.job(score) c.get_total_list(c.get_list) print('共比較 %d 種情況' % c.count) print(c.target)