1. 程式人生 > >一個小程式:計算績效的方案

一個小程式:計算績效的方案

因為強制要求考核績效,為了大家雨露均沾,考慮制定平均的績效方案

比較挫的用了窮舉,跑起來很慢啊...

# -*- 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)