影刀2023终竞赛-操作题一:约束条件下的任务分配问题
评论
收藏

影刀2023终竞赛-操作题一:约束条件下的任务分配问题

经验分享
千
千里
2024-02-10 09:51·浏览量:408
千
千里
影刀见习开发者
发布于 2024-02-10 09:51408浏览

演示地址

公众号原文地址

为了能够展现,我实际上延迟了30秒。

代码主要还是用python实现。

获取配置文件这部分,和第四题一个逻辑,就不细说了。

重点讲讲处理数据的部分。

   a=pd.read_excel(glv['d'].file,sheet_name=None)

   for j in a.items():

       j1=j[1].fillna(0)

       j1.iloc[:, [4, 5]] = j1.iloc[:, [4, 5]].astype(int)  

       print(j1)

读取excel的全部sheet然后循环。

给空的位置补0,然后转整形。

k=0

       while 1:

           b=0

           c=len(j1.index)

建一个无限循环,然后设置b和c两个变量

b是为了控制每一轮结束

c是设计师总数

k就是当前已经执行的任务数

           for l in j1.index:

               if j1.iloc[l,5]>=j1.iloc[l,1]:

                   if l==c-1:

                       b=1

                   continue

               if j1.iloc[l,4]>=j1.iloc[l,3]:

                   if l==c-1:

                       b=1

                   continue

               k+=1      

               j1.iloc[l,4]+=1          

               j1.iloc[l,5]+=1

               break

每一次循环的时候,就对每一行循环,就是每一个设计师进行循环。

进行两个判断,一个是总数不能超过总数上限,一个是本轮数不能超过本轮数上限。

如果任何一个超过上限,就匹配下一个设计师。

如果是最后一个设计师,那么就打上标记b=1

如果没有超过上限,那么就给本轮数和总数分别+1。

并且给k+1,表示已经分配的任务数多一个。

           print(j1)

这个就是把每一次分配后的情况写入日志,等执行完,导出日志,就可以看见每一次分配的明细。

           if sum(j1.iloc[:,5])==sum(j1.iloc[:,1]):

               break

如果总数和总数上限相等,说明设计师已经满负载了,循环直接结束。

           if b:

               j1.iloc[:,4]=[0]*c            

如果b=1,说明这一轮分配已经结束了,需要进行下一轮,我们就把本轮数清空。

           if k>=100:

               break      

如果k>=100,说明总的任务数已经到达了,不需要继续分配了。


OK,如上就是我的整个思路逻辑。欢迎讨论交流

收藏
全部评论(1)
最新
发布评论
评论