本题为某大学某老师发给某学生的题目,在算法群中引发讨论,讨论结果愿与诸君分享。
题目:在理想情况下(无障碍物,不考虑碰撞),4个同样类型小车(a, b, c, d)从任意位置同时出发,要分别到达4个指定的位置的车库(A, B, C, D)(一个车库只能停一辆车),假设全部小车进库的时间是T,即最后一辆小车完成入库的时间。编程求出T的最小值,并给出一种最优方案,即车和车库的对应关系。小车入库的时间如下表所示。
第一个方法,很容易想到了,就是暴力法,但是暴力法只是思路比较简单,实际上空间复杂度和时间复杂度会比较高(因此肯定不是最佳算法),这个暴力法的思路就是二维数组排列组合,复杂度非常高,在数值较低时体现的不明显(4^4),当应用于实际问题时,缺陷比较大。但是容易实现;
第二种方法,可以采用贪心算法,相对来说复杂度和实现都会好一点,先找到小车入库时间表中A列最小的值,然后取B列最小的值,如果和上一次取到的最小值在同一行,就取该列次小值,对A、B、C、D进行上述操作。并且设置一个数组visited[],用来标记哪一行已经被选取过;
第三种方法(群友B提供,广搜剪枝)广搜剪枝有5种思路,分别是可行性剪枝、排除等效剪枝、最优性剪枝、记忆化、顺序剪枝,如果应用到这题,应该是顺序剪枝,广度优先搜索+顺序剪枝,先从根结点出发1-2-3-4,然后继续从这些结点出发2-3-4/1-3-4/1-2-4/1-2-3,不和上面重复;
第四种方法(群友T提供),弗洛伊德算法经常用于求最优解,可以去了解了解(遗传算法、模拟退火、爬山算法、粒子群算法、蚁群算法);
第五种方法(群友R、C提供),如果这个是个二分图的话,可以用二分图最大匹配,将车子和车库分别作为两列,为了寻找最大匹配,使用匈牙利算法进行寻找,不断寻找原有匹配的增广路径。但是问题在于二分图匹配是无权的,所以(应该)可以使用KM算法。
集思广益,得出此解,给各位做个参考,若有其他解法,也可在评论区提出。