【创想】【完全NP问题】多机调度问题,网络流基础上建立新算法

本文探讨了多机调度问题,指出简单的贪心算法并不总是最优解,并提出使用网络流建立检查方法。通过调整网络流算法,确保作业不被拆分,同时保留了网络流的退流优点。作者提出了一种名为‘01流’的新算法,并寻求同行的反馈和建议。

【本文原创,转载请注明出处<V字弦割丶>】

http://blog.csdn.net/vmurder/article/details/39555459


首先介绍一下多机调度问题。

就是某工厂有n个独立的作业,由m台相同的机器进行加工处理。作业i所需的加工时间为ti,任何作业在被处理时不能中断,也不能进行拆分处理。现厂长请你给他写一个程序:算出n个作业由m台机器加工处理的最短时间。

显然我们有一种贪心算法,就是先从大到小排个序,枚举作业,哪个机器有空就把作业往哪里塞,这是一个很“优秀”的贪心,可以水过很多分!但是显然它是错。如果你认为不显然,那么来看这组数据:

{7,3//8,9,10,11,12,14,16}

它的最优解是27:8+9+10=27;11+16=27;12+14=26;

然后我们可以牺牲代码复杂度来提高准确率,二分答案,然后往每个容器(此处为3个)里面塞,那么这组数据就可以调过了,但是它还是错的!因为这个问题不满足单调性!或者说贪心塞不满足check的性质!于是就有了下面这组数据:

{10,3//17,16,10,10,9,8,8,7,6,5}

32是它的解,而33却无法解决,或者说check后return 0;了。

然后网上还有说模拟退火遗传算法神马的,这些具有不稳定性的随机化算法就先不说了。


下面就是我要说的解法了。首先我依然寄希望于二分答案,只是我们需要一种快速而准确的check方法,贪心无法满足,而阶乘级别的搜索同样低劣,这时候我想到了网络流,可以如下建图。


然后跑一边最大流,但是这显然是不对的,因为每项作业被拆分了,不符合题目要求了。

这个时候我们回想网络流的流程,或者说dinic的流程,里面有一步“k=dinic(i,min(temp,map[x][i]));

我们为什么不可以判断temp>=map[x][i]决定是否继续递归呢?

这样就保证了完整性,即作业不被拆分。

但是那汇点层和作业层之间的边的流量却是inf,这该如何解决?或者说如何抵达汇点呢?特判。

这样既保证了作业的不被拆分,又保证了流的可行性,同时网络流的优点:退流,又被完美地保留了下来,因为进入作业层时的流量和退流时回到机器层的流量是完全相同的(因为是同一个作业层的点,建边流量相同)!

因为这种算法更注重“取”与“不取”,根据01背包取与不取的思想和网络流的基础,我暂且命名这种算法为“01流”。


现在我希望通过这种算法实现多机调度问题,不知道可不可以,暂籍本文记一下这种思想,并且向oiers,coders征求一下意见,可以是支持,可以是bug,可以是优化。

感激不尽。


评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值