算例、benchmark、全排列、贪心算法-启发式算法备忘

1.问题的算例:就是问题参数的具体化。通俗来说,就是给参数赋值。

2.benchmark:就是求解问题算例的一个基准。比如获得的价值为7,这个最优解可以看成是该算例的一个Benchmark。

Benchmark概念的引出——只是为了方便我们对算法的效果进行一个对比。比如说小明同学选了第1个物品和第2个物品,获得的价值为1+4=5,那么小明就可以用他的解决方案和别人的benchmark进行对比。比如与最优的benchmark为7比较的话,显然小明的解质量是更差的,因为所获得的价值比较低。

以0-1背包问题为例,其实解就是0-1的全排列。

3.全排列函数

it.product(range(2), repeat=ins.N)——是生成N位的01全排列。

import itertools as it
s = list(it.product(range(2), repeat=5))
print(s)

# 输出结果
[(0, 0, 0, 0, 0), (0, 0, 0, 0, 1), (0, 0, 0, 1, 0), (0, 0, 0, 1, 1), (0, 0, 1, 0, 0), (0, 0, 1, 0, 1), (0, 0, 1, 1, 0), (0, 0, 1, 1, 1), (0, 1, 0, 0, 0), (0, 1, 0, 0, 1), (0, 1, 0, 1, 0), (0, 1, 0, 1, 1), (0, 1, 1, 0, 0), (0, 1, 1, 0, 1), (0, 1, 1, 1, 0), (0, 1, 1, 1, 1), (1, 0, 0, 0, 0), (1, 0, 0, 0, 1), (1, 0, 0, 1, 0), (1, 0, 0, 1, 1), (1, 0, 1, 0, 0), (1, 0, 1, 0, 1), (1, 0, 1, 1, 0), (1, 0, 1, 1, 1), (1, 1, 0, 0, 0), (1, 1, 0, 0, 1), (1, 1, 0, 1, 0), (1, 1, 0, 1, 1), (1, 1, 1, 0, 0), (1, 1, 1, 0, 1), (1, 1, 1, 1, 0), (1, 1, 1, 1, 1)]

4.贪心算法

贪心算法其实就是一个“构造”解的过程而已,相比较于枚举法而言,贪心是没有“搜索”这一过程的,他只是按照一定的方式,将解给构造起来而已。因此,贪心法大多数情况下,在取得还算“过得去”的结果的同时,也能保持较快求解速度。这是贪心算法的一大优点。

  综合起来:

  1. 贪心算法能取得“还可以”的解,有时候甚至能找到最优解。

  2. 贪心算法由于只是利用“构造”的方式生成解,因此速度相对而言会非常快,同时不会随着问题规模的增长而大幅度增加,是平缓的线性增长。

  如果想利用贪心取得较好的结果,那么就需要设计出优秀的贪心方式了。

如果——贪心过程中决策的每一步都互不影响时,最终的结果就是最优解。

其实真是这种情况的话,那么整个问题的各个步骤的决策都可以重新分解为一个单独的子问题了,那么由于各个子问题互不影响,贪心获得子问题的最优,组合起来最后肯定也是全局的最优。

5.枚举法与贪婪算法中间的折衷,时间和精确性折中后为启发式算法

启发式算法就是在一个合理的求解资源范围内(合理的时间,合理的内存开销等)求得一个较为满意的解。

启发式算法目前主要包括邻域搜索和群体仿生两大类。因为启发式算法强调的是一个应用,即你拿到问题能设计相应的算法并求解出来。概念只是辅助我们理解这个过程而已。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值