每天一个知识点:贪婪算法——一个简单的调度问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每天一个知识点:贪婪算法——一个简单的调度问题相关的知识,希望对你有一定的参考价值。

参考技术A 前提是使用非预占调度(nonpreemptive scheduling):即一旦开始一个作业,就必须把该作业运行完。

假设现在有四个作业:

该调度总的代价 C 为

即:

可以看到,第一个求和与作业的排序无关,因此只有第二个求和影响到总开销。设在一个排序中存在 x > y 使得 < 。此时,计算表明,交换 和 ,第二个和增加,从而降低了总的开销。因此,所用时间不是单调非减的任何的作业调度必然是次优的。剩下的只有那些其作业按照最小运行时间最先安排的调度是所有调度方案中最优的。

这个结果指出为什么操作系统调度程序一般把优先权赋予那些更短的作业。

非预占调度的前提不变,假设现在有九个作业:

解决多处理器情形的算法是按照顺序开始作业,处理器之间轮换分配作业。不难证明没有哪个其他的顺序能够做得更好,虽然处理器个数 P 能够整除作业数 N 时存在许多最优的顺序。

即使 P 不恰好整除 N,哪怕所有的作业时间是互异的,也还是有许多最优解。

将完成时间最小化,即整个序列的完成时间更早。

贪婪算法

贪婪算法:

这是一种近似算法(approximation algorithm)。在获得精确解需要的时间太长时,可使用近
似算法。判断近似算法优劣的标准如下:
? 速度有多快;
? 得到的近似解与最优解的接近程度。
贪婪算法是不错的选择,它们不仅简单,而且通常运行速度很快。在这个例子中,贪婪算法
的运行时间为O(n2),其中n为广播台数量。

 

问题:

每个广播电台,在固定几个州播放,现在向用最少的电台,将所有的州都覆盖

贪婪算法解决思路:在电台中找到一个最有解(未覆盖州中,电台指向最多的州),更新未覆盖的州,以此思路,知道所有的州都覆盖

states_needed = set(["mt", "wa", "or", "id", "nv", "ut","ca", "az"]) # 目标需要覆盖的州
stations =   # 每个电台所能覆盖的州
stations["kone"] = set(["id", "nv", "ut"])
stations["ktwo"] = set(["wa", "id", "mt"])
stations["kthree"] = set(["or", "nv", "ca"])
stations["kfour"] = set(["nv", "ut"])
stations["kfive"] = set(["ca", "az"])

‘‘‘使用最少的电台,将所有的州都覆盖住 
‘‘‘

# 使用贪婪算法,每次找到能覆盖最多(未覆盖)的电台

final_station = set()

def find_final_station():
    global states_needed
    global stations
    best_station = None
    states_covered = set()
    for station_key, station_value in stations.items():
        cover = states_needed & station_value
        if len(cover) > len(states_covered):
            best_station = station_key
            states_covered = station_value
    final_station.add(best_station)
    states_needed = states_needed - states_covered

while states_needed:
    find_final_station()

print(final_station)

 

以上是关于每天一个知识点:贪婪算法——一个简单的调度问题的主要内容,如果未能解决你的问题,请参考以下文章

每天一个算法知识---堆排序

太难了,每天刷一道编程题吧(二十)

十天玩转操作系统,做一个热爱学习的程序猿,重点讲解,每天进步一点点!

算法图解-贪婪算法

8贪婪算法

在 R 中每天同时运行任务调度程序