一、基本思想
1、局部最优与全局最优:贪心算法在每一步选择当前状态下的最优解,希望这样的局部最优决策能导致全局最优解。
2、贪心选择性质:在算法的每一步都采取当前状态下的最优选择,不考虑子问题的解如何影响未来的状态。
3、可行解:每一步的贪心选择都必须保证解是可行的,即选择之后的状态仍然满足问题的要求。
二、技巧和方法
1、贪心选择条件:确定一个贪心选择函数,该函数能够在每一步选择中提供最优的决策。
2、最优子结构:确保问题具有最优子结构,即通过子问题的最优解可以构建原问题的最优解。
3、贪心策略:定义一个贪心策略,明确在每一步如何做出贪心选择。
4、剪枝:在搜索过程中,一旦发现某一部分不可能产生最优解,就剪去这部分,以减少计算量。
5、排序:对于某些问题,预先对输入数据进行排序可以简化贪心选择过程。
6、记忆化:存储已经计算过的结果,避免重复计算,特别是在动态规划中。
7、迭代与分治:将问题分解为更小的子问题,递归解决每个子问题,然后合并结果。
三、基本要素
贪心选择性:
贪心选择性是指在算法的每一步选择中,根据某个贪心标准(贪心选择函数)做出局部最优解的选择,从而希望这样的局部最优决策能够导致全局最优解。贪心算法的核心在于每一步都做出当前看起来最优的选择,而不考虑这个选择对未来选择的影响。
贪心选择性的关键在于:
1、贪心标准:定义一个标准或函数,用于评估每一步的最优性。
2、局部最优:每一步都基于贪心标准做出最优选择。
3、可行解:每次选择都必须保证解的可行性,即选择之后的状态仍然满足问题的所有约束。
最优子结构
最优子结构性质是指一个问题的最优解包含其子问题的最优解。换句话说,可以独立地解决子问题,并将这些子问题的最优解组合起来以形成原问题的最优解。
最优子结构性质的关键在于:
1、子问题:问题可以分解为更小的子问题。
2、最优解:子问题的最优解是可以确定的。
3、组合:原问题的最优解可以通过组合子问题的最优解来获得
四、算法实例
编程实现下述活动的最佳安排
joblist = [['a', 8, 10], ['b', 1, 5], ['c', 4, 8], ['d', 1, 3], ['e', 6, 9], ['f', 2, 4], ['g', 4, 7], ['h', 1, 5], ['i', 6, 12]]
def get_max_intervalschdeule(joblist):
job_schedule=[]
num_jobs=len(joblist)
joblist.sort(key=lambda x: x[2])#按照结束时间对所有的job排序
for n in range(num_jobs):
if not job_schedule:
job_schedule.append(joblist[n])
else:
if job_schedule[-1][2]<=joblist[n][1]:#当前遍历到的job与job_schedule中的最后一个job比较
job_schedule.append(joblist[n])
return job_schedule
# 给定的工作列表
joblist = [['a', 8, 10], ['b', 1, 5], ['c', 4, 8], ['d', 1, 3], ['e', 6, 9], ['f', 2, 4], ['g', 4, 7], ['h', 1, 5], ['i', 6, 12]]
# 调用函数并打印结果
best_schedule = get_max_intervalschdeule(joblist)
print("Best Schedule:", best_schedule)