2.5.1题目描述
分配问题要求将n个任务分配给n给人,每个人完成任务的代价不同,要求分配的结果最优,此题可以使用回溯求解。
2.5.2程序使用说明
Java环境1.8.0_111
IDE:eclipse
需要两个文件Node.java,Assignment.java直接编译两个文件,然后直接运行Assignment.java文件,在控制台查看结果。
2.5.3简要分析和设计
假设存在四个人a,b,c,d,任务1,任务2,任务3,任务4,和对应的代价矩阵如下
图二 矩阵(来源于算法设计与分析基础第三版)
采用分支界限法,需要计算最优边界Lb,Lb=已分配任务的代价+剩余未分配任务中最小的代价,然后构造状态空间树,上面例子的状态空间树如下:
图三 空间树(来源于算法设计与分析基础第三版)
开始节点表示还未给任何人分配任务,然后在开始节点的基础上寻找可扩展节点,由于此时a有四种选择,则有四个扩展节点,然后分别计算可扩展节点的lb,如果lb小于cost,则将其加入优先队列,然后从优先队列中选择一个最优的,作为新的扩展节点,然后在当前节点的基础上为继续进行上述步骤,当有一个节点的状态表示为已将四个节点分配完成,且花费的代价小于已有cost,则更新cost值,然后继续从优先队列里增加值和取值,直到优先队列为空,则最小花费即为最优选择。
2.5.4测试用例
{ {9, 2, 7, 8},
{6, 4, 3, 7},
{5, 8, 1, 8},
{7, 6, 9, 4}}
结果:
人员以此选择工作为:2 1 3 4
最小花费:13
2.5.5源代码
目录结构:
package three.one;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.PriorityQueue;