百技274期复盘:第4组 百四可乐
2018/08/31

团队假笑图:

队名:(标题上写着有,自己看)

队员介绍:

@码云(第一排左一,最帅的那个)

@初心(第一排左二)

@蓁浈(第一排右二)

@星桐(第一排右一)

@蜀堇(第二排左一)

@家麟(第二排左二)

@谦翮(第二排左三)

@匪子(第二排右二)

@索星(第二排右一)

@逐帆(第三排左一)

@尔瞻(第三排右一)

团队特点: 成熟稳重(含蓄,不善于表达)

 

 

造梦者

第一天,怀着旅游和度假心态的我,和小伙伴们齐聚美丽的西溪园~

(抱歉,这好像是西湖的图。。)

在天机山庄,第一堂课便是马爸爸的Dream Maker

(抱歉,图是盗的,也不会去水印。。)

相信大家都看过这个纪录片,很帅,我是憋着尿看完的!

接下来,@府笛 老师给我们带来了同样精彩的分享~

虽然没记笔记,但还是记下一些关键点,比如:

还有一点,就是:

“皮实”

在本次百技中,我们也是将 “皮” “实” 进行到底了。

 

开源实战

接下来上场的龟龟老师 @陆龟 ?,让我们明白了,百技,并不是度假。

Dubbo项目的工程和算法层面,?给了我们4个任务,让我们彻夜未眠。

还有幸看到了凌晨4点的西溪园~

没什么人~

最终,经过我们的团队努力,我们在Deadline前,搞定了这4个任务。

通宵,确实不舒服,以后一定多睡觉!

?龟龟老师最后给了我们此阶段第二名?的成绩。

还有其他组的同学找我们要代码,很高兴?

在此给其他组的小伙伴道个歉,@码云(雷诺)同学,只是开玩笑的。

陈杰同学早已经把代码给他们啦~

 

关于算法题,因为是我做的,就多说两句~

算法题的分数占比真的太少了!!!

这可是一道天池的算法题呀!!!

工作量很大的呀!!!

通宵做的呀!!!

最后,抛砖引玉,开源一下我们的解法:

from tqdm import tqdm

class instance:
    instance_id=0
    app_id=0
    cpu_time=[]
    mem_time=[]
    disk=0
    p=0
    m=0
    pm=0
    
    def __init__(self,instance_id,app_id,list_data):
        cpu_time,mem_time,disk,p,m,pm = list_data
        self.instance_id = instance_id
        self.app_id = app_id
        self.p = float(p)
        self.m = float(m)
        self.pm = float(pm)
        self.cpu_time = [float(item) for item in cpu_time]
        self.mem_time = [float(item) for item in mem_time]
        self.disk = float(disk)

class app_resp_dict:
    resp_dict = {}
    
    def __init__(self,file_path):
        with open(file_path) as f:
            for line in f:
                line = line.strip().split(',')
                # {[app_1+app_2] : k}
                if line[0]==line[1]:
                    self.resp_dict[line[0]+line[1]] = int(line[2])+1
                else:
                    self.resp_dict[line[0]+line[1]] = int(line[2]) 
    
    def check_app(self,count_app,inst):
        if inst.app_id in count_app:
            count_app[inst.app_id] += 1
        else:
            count_app[inst.app_id] = 1
        set_list = [item for item in count_app]
        len_list = len(count_app)
        for i in range(len_list):
            for j in range(len_list):
                str_check = set_list[i]+set_list[j]
                if str_check in self.resp_dict and self.resp_dict[str_check] < count_app[set_list[j]]:
                    return 0
        return 1

app_xz = app_resp_dict('../Data/app_interference.csv')

app_res_dict = {}

with open('../Data/app_resources.csv') as f:
    for line in f:
        line = line.strip().split(',')
        app_res_dict[line[0]] = [line[1].split('|'),line[2].split('|')]+line[3:]

def list_check(a,b): #a是机器的98个时间list,b是instance
    return all([item[0]>=item[1] for item in zip(a,b)])

def dev_list(a,b):
    return [item[0]-item[1] for item in zip(a,b)]
    
def add_list(a,b):
    return [item[0]+item[1] for item in zip(a,b)]

class Machine:
    m_id=0
    p=0
    m=0
    pm=0
    cpu=[]
    mem=[]
    disk=0
    
    def __init__(self, data_list):
        m_id,cpu,mem,disk,p,m,pm = data_list
        self.m_id = m_id
        self.p = float(p)
        self.m = float(m)
        self.pm = float(pm)
        self.cpu = 98*[float(cpu)]
        self.mem = 98*[float(mem)]
        self.disk = float(disk)
#         self.instance_list =[]
        self.count_app = {}
    
    def self_check(self,inst):
        tmp_count = {item:self.count_app[item] for item in self.count_app}
        if all([self.p>0,self.m>0,self.pm>0,self.disk>0]) and all([inst.p <= self.p,inst.m <= self.m,inst.pm<=self.pm,inst.disk<=self.disk,
list_check(self.cpu,inst.cpu_time),list_check(self.mem,inst.mem_time)]) and app_xz.check_app(tmp_count,inst):
            return 1
        else:
            return 0
    
    def ini_add(self,inst):
#         self.instance_list.append(inst)
        if inst.app_id in self.count_app:
            self.count_app[inst.app_id] += 1
        else:
            self.count_app[inst.app_id] = 1
            
        self.p -= inst.p
        self.m -= inst.m
        self.pm-=inst.pm
        self.disk-=inst.disk
        self.cpu=dev_list(self.cpu,inst.cpu_time)
        self.mem=dev_list(self.mem,inst.mem_time)
        
    def add(self,inst):
        if self.self_check(inst):
            self.ini_add(inst)
            return 1
        else:
            return 0
            
    def dev(self,inst):
#         self.instance_list.remove(inst)
        self.p   += inst.p
        self.m   += inst.m
        self.pm  += inst.pm
        self.disk+= inst.disk
        self.cpu =  add_list(self.cpu,inst.cpu_time)
        self.mem =  add_list(self.mem,inst.mem_time)
        

machine_dict = {}
machine_list = []
with open('../Data/machine_resources.csv') as f:
    for line in f:
        line = line.strip().split(',')
        machine_list.append(line[0])
        machine_dict[line[0]] = Machine(line)

inst_list = []
with open('../Data/instance_deploy.csv') as f,tqdm(total=68219) as pbar:
    for line in f:
        pbar.update(1)
        line = line.strip().split(',')
        tmp_instance = instance(line[0],line[1],app_res_dict[line[1]])

        if line[2]!='' and machine_dict[line[2]].add(tmp_instance):
            pass
        else:
            inst_list.append(tmp_instance)

inst_list = sorted(inst_list,key=lambda x:x.disk)[::-1]
machine_list = sorted(machine_list,key=lambda x:machine_dict[x].disk)[::-1]

remember_list = []
len_ins = len(inst_list)
tmp_list = machine_list[:]
for i in range(len(tmp_list)):
    if machine_dict[tmp_list[i]].disk < 30:
        machine_list.remove(tmp_list[i])
                
with tqdm(total=len_ins) as pbar:
    for item in inst_list:
        pbar.update(1)
        for mac in machine_list:
            if machine_dict[mac].add(item):
                remember_list.append((item.instance_id,mac))
                break

#         machine_list = sorted(machine_list,key=lambda x:machine_dict[x].disk)  这个应该很重要,但是时间不够就注释掉了

with open('submit_team_{$04}_hhmmss.csv','w') as f:
    for item in remember_list:
        f.write(item[0]+','+item[1]+'\n')

搜索 “ 调度算法 ” 这个关键词,应该就能搜到。

如果代码运行起来有问题,可千万别来找我哦!!

千万别来!!

 

技术创造新商业

最后,就是本次百技的高潮部分!

修管道!!!

呸!

修管道才不是重点呢!!

各位小伙伴真的别把重心放在修管道上面!!

 

我们的重点是:

预测买家是否会购买某一件商品,再提前把这件商品送到买家楼下!

比如我们的平台预测到,你家小区每个月初都会有10人买米。

就提前送10袋米到小区楼下的“零距仓”

这样买家下单后,10分钟内就能收到货了!!!

业务详情见PPT

很实用,很厉害有没有!!!

因为相信,所以看见!

然后就,结束啦?

 

对了,还有一个:

队员感想

@码云:我很帅,爱好是照镜子。

@初心:百技是紧张的实习工作中突然从天而降的惊喜。刚开始还因为要参加百技会浪费时间而感到抵制,而到结束的时候尽数变成愉悦。能和大家一起分工合作,完成作业,甚至一起脑洞大开,让人回到了久违的大学时代。团队合作会产生一种激动人心的力量,大家自发的凝聚起来,虽然每天都熬到深夜,但是大家都义无反顾的去做,并且做到最好!我很感谢百技这个机会,让我能在阿里认识这么多优秀的小伙伴,大家打打闹闹,也专注工作,让人记忆难忘。

@蓁浈:三天的时间过得很快,在我看来,这不仅是一次技术锻炼的机会,更是一次团队合作的机遇。和各个部门的小伙伴因为百技而相识,一起熬夜写代码,一起吃“大餐”,一起天马行空开脑洞!本来一开始大家秉承佛系百技,到后来熬夜解完第一天开源实战拿到第二名?,再到后来的创造新商业我们组被评为脑洞最大的组。很开心可以认识到大家,记得我们最后约的狼人杀,记得最后我们约的朋友圈云交流!希望毕业典礼不是结束而是一个新的开始,实现我们规划的人类未来五十年的宏图哈哈!

@星桐:在实习的结尾参加了为期三天的百技,很开心认识了一群优秀的小伙伴,大家一起熬夜完成各个任务,虽然有点累,但是值得。我们组的每个人都很棒,大家都很努力,希望还能有机会和你们一起奋斗!

@蜀堇:高大上的西溪园区、全能的小伙伴、独特的阿里文化、忙碌充实的百技课程。组内讨论思维火花迸射,组间PK金句频出,未来的CTOCEO就在这里。话不多说,感谢这三天,祝大家一切顺利!

@谦翮:百技的三天是无比珍贵的三天,让我认识了来自各个bu以及各个地方的小伙伴,与各位大佬相处甚是开心,也印证了和聪明人打交道就是不费劲。靠谱的组长和各位靠谱的队友,还差一局狼人杀。再说就感伤了,有缘再见。

@匪子:在三天的“百技”培训中,最大的收获就是拓宽了自己的知识领域。其次是和来自不同bu的小伙伴们在短暂的时间里结下了深厚的友谊,在三天里大家一起头脑风暴,一起攻克难题,一起熬夜,一起欢呼,这会成为一段很有意思的回忆,感谢他们。

@索星:此处略去1000+字。(他写了1000多字)

@逐帆:很荣幸能和各位大佬分在一组,在短短的三天内,一起技术实战,一起探讨业务模式,非常充实。感谢码云带给大家欢乐。搞了一个通宵的算法题仿佛让我回到了N年前本科的时候做数学建模比赛的时候,让我找回了年轻的感觉......

@尔瞻:在来到阿里的第五周,很高兴能有机会参加第274期百技培训,原以为与以往参与过的冗长的培训相比,阿里的百技培训显得有趣而又有活力。从开源实战紧张的算法设计与实现到技术创造新商业的时大家聚在一起开脑洞,都让我在付出心血的同时收获颇丰。现在回忆这三天的百技培训,与来自北京、上海、杭州不同地区部门的小伙伴同舟共济,合力完成百技培训中各项任务,是一段难得的珍贵经历。我们小组的各位同学实力都很强,也希望他们能够在今后的工作中取得更好的成绩,生活幸福。

@我:青山不改,绿水长流。

Scan QR code
关注Ali TechnologyWechat Account