python的scipy(匈牙利算法)解决教学任务指派问题.pdfVIP

  • 0
  • 0
  • 约5.38千字
  • 约 12页
  • 2024-01-12 发布于河南
  • 举报

python的scipy(匈牙利算法)解决教学任务指派问题.pdf

python的scipy(匈⽛利算法)解决教学任务指派问题

python的scipy(匈⽛利算法)解决教学任务指派问题

参考资料:

组合优化理论⾥的第六章_指派问题的课件

问题简介

在⽣活中经常遇到这样的问题,某单位需完成n项任务,恰好有n个⼈可承担这些任务。由于每⼈的专长不同,各⼈完成任务不同(或所费时

间),效率也不同。于是产⽣应指派哪个⼈去完成哪项任务,使完成n项任务的总效率最⾼(或所需总时间最⼩)。这类问题称为指派问题或分

派问题。

教学任务指派问题为指派问题中的⼀种,考虑教师对课程的擅长程度,教学任务饱满序列和学⽣对教师的满意度,通过匈⽛利算法求得最优

课程指派。

算法

指派问题⼀般模型:

匈⽛利算法:

教师与课程⼀样多

把求最⼤值变为求最⼩值问题:矩阵C=20-擅长矩阵。

再进⾏匈⽛利算法操作:

如果得不到解,则:

程序实现:

#教学任务指派问题

importnumpyasnp

fromscipy.optimizeimportlinear_sum_assignment

defprintf(row_ind,col_ind):#输出

print((最优教师课程指派:最优教师课程指派:)

foriinrange(len(row_ind)):

print((教师教师,row_ind[i],],课程课程,col_ind[i],end=;)

print()

#教师与课程⼀样多

#各个教师对各个课的擅长程度矩阵

goodAt=np.array([[18,5,7,16],[10,16,6,5],[11,6,4,7],[13,12,9,11]])

weakAt=20-goodAt

row_ind,col_ind=linear_sum_assignment(weakAt)

print(row_ind)#开销矩阵对应的⾏索引

print(col_ind)#对应⾏索引的最优指派的列索引

print(goodAt[row_ind,col_ind])#提取每个⾏索引的最优指派列索引所在的元素,形成数组

print(goodAt[row_ind,col_ind].sum())#数组求和

printf(row_ind,col_ind)

输出结果:

教师少与课程多

把求最⼤值变为求最⼩值问题:矩阵C=10-擅长矩阵。

设想每个教师都有个分⾝,问题变为8个教师完成6项教学任务,虚设两门课程,擅长程度都为最⼤值。

得到矩阵C为:

程序实现:

#当教师少课程多

#各个教师对各个课的擅长程度矩阵

goodAt=np.array([[7,3,7,4,5,5],[7,3,7,4,5,5],

[4,9,2,6,8,3],[4,9,2,6,8,3],

[8,3,5,7,6,4],[8,3,5,7,6,4],

[4,6,2,3,7,8],[4,6,2,3,7,8]])

weakAt=10-goodAt

row_ind,col_ind=linear_sum_assignment(weakAt)

print(row_ind)#开销矩阵对应的⾏索引

print(col_ind)#对应⾏索引的最优指派的列索引

print(goodAt[row_ind,col_ind])#提取每个⾏索引的最优指派列索引所在的元素,形成数组

print(goodAt[row_ind,col_ind].sum())#数组求和

printf(row_ind,col_ind)

输出结果:

结果表明:教师A教课程2;教师B教课程1和课程4;教师C教课程0和课程3;教师D教课程5.

教师少与课程多且⼀个教师最多教两门课,最少⼀门

把求最⼤值变为求最⼩值问题:矩阵C=10-擅长矩阵。

设想每个教师都有个分⾝,问题变为8个教师完成6项教学任务,虚设两门课程,擅长程度⼀个为最⼤值,另⼀个为最⼩值。

得到矩阵C为:

程序实现:

#教师少课程多且⼀个教师最多教两门课,最少⼀门

goodAt=np.array([[7,3,7,4,5,5,0,0],[7,3,7,4,5,5,100,100],

[4,9,2,6,8,3,0,0],[4,9,2,6,8,3,100,100],

[8,3,5,7

文档评论(0)

1亿VIP精品文档

相关文档