剪枝算法(算法优化)
一:剪枝策略的寻找的方法
1)微观方法:从问题本身出发,发现剪枝条件
2)宏观方法:从整体出发,发现剪枝条件。
3)注意提高效率,这是关键,最重要的。
总之,剪枝策略,属于算法优化范畴;通常应用在DFS 和 BFS 搜索算法中;剪枝策略就是寻找过滤条件,提前减少不必要的搜索路径。
二:剪枝算法(算法优化)
1、简介
在搜索算法中优化中,剪枝,就是通过某种判断,避免一些不必要的遍历过程,形象的说,就是剪去了搜索树中的某些“枝条”,故称剪枝。应用剪枝优化的核心问题是设计剪枝判断方法,即确定哪些枝条应当舍弃,哪些枝条应当保留的方法。
2、剪枝优化三原则: 正确、准确、高效.原则
搜索算法,绝大部分需要用到剪枝.然而,不是所有的枝条都可以剪掉,这就需要通过设计出合理的判断方法,以决定某一分支的取舍. 在设计判断方法的时候,需要遵循一定的原则.
剪枝的原则
1) 正确性
正如上文所述,枝条不是爱剪就能剪的. 如果随便剪枝,把带有最优解的那一分支也剪掉了的话,剪枝也就失去了意义. 所以,剪枝的前提是一定要保证不丢失正确的结果.
2)准确性
在保证了正确性的基础上,我们应该根据具体问题具体分析,采用合适的判断手段,使不包含最优解的枝条尽可能多的被剪去,以达到程序“最优化”的目的. 可以说,剪枝的准确性,是衡量一个优化算法好坏的标准.
3)高效性
设计优化程序的根本目的,是要减少搜索的次数,使程序运行的时间减少. 但为了使搜索次数尽可能的减少,我们又必须花工夫设计出一个准确性较高的优化算法,而当算法的准确性升高,其判断的次数必定增多,从而又导致耗时的增多,这便引出了矛盾. 因此,如何在优化与效率之间寻找一个平衡点,使得程序的时间复杂度尽可能降低,同样是非常重要的. 倘若一个剪枝的判断效果非常好,但是它却需要耗费大量的时间来判断、比较,结果整个程序运行起来也跟没有优化过的没什么区别,这样就太得不偿失了.
3、分类
剪枝算法按照其判断思路可大致分成两类:可行性剪枝及最优性剪枝.
3.1 可行性剪枝 —— 该方法判断继续搜索能否得出答案,如果不能直接回溯。
3.2 最优性剪枝
最优性剪枝,又称为上下界剪枝,是一种重要的搜索剪枝策略。它记录当前得到的最优值,如果当前结点已经无法产生比当前最优解更优的解时,可以提前回溯。
三:示例分析
题目来源于poj 3900 The Robbery (类似于背包问题,但是不能够用背包求解)
1 分析:W,C值很大,数组开不下(所以,不能用背包处理),但是发现N值很小,(1+15)*15/2=120,所以可以考虑dfs+剪枝。
首先利用贪心的思想我们对箱子进行排序,关键字为性价比(参考了poj里的discuss)。也就是单位重量的价值最高的排第一,搜索的时候枚举顺序注意一定要从满到空,这样才能最快的找到一个可行解然后利用它进行接下来的剪枝。
剪枝1. 之后所有的钻石价值+目前已经得到的价值<=ans 则剪枝。
剪枝2. 剩下的重量全部装目前最高性价比的钻石+目前已经得到的价值<=ans 则剪枝(非常重要的剪枝)。
2 程序代码
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define MY_MAX(a,b) (a)>(b)?(a):(b)
const int maxN = 20;
struct NOTE
{long long weight;long long value;int num;
}box[maxN];
int n;// 个数小于20
long long m,ans;// m 总重量,ans最优解
long long sum[maxN]; //保存一个后缀和
bool cmp(const struct NOTE &a, const struct NOTE &b)
{//按性价比排序,从大到小排列(注意若有取地址符号,则需有const)return a.value*1.0/a.weight > b.value*1.0/b.weight;
}
inline bool cut (int pos,long long now_value,long long last_weight)
{if(pos == n+1) return true;//边界返回条件if(now_value+sum[pos] < ans) return true;如果后面所有的钻石加起来都<=ans,剪掉double best = (box[pos].value*1.0/box[pos].weight);//当前最大的性价比if(now_value+(long long)ceil(best*last_weight) < ans) return true;//以这个性价比取剩下的所有重量,如果<=ans,剪掉return false;
}
void dfs(int pos,long long now_value,long long last_weight) //pos 当前数组的下标位置,now_value 目前的重量和,last_weight当前背包剩余容量
{ans = MY_MAX(ans,now_value);if(cut(pos,now_value,last_weight)) return;//剪枝函数for(int i=box[pos].num;i>=0;--i)//(暴力搜索)枚举顺序从满到空枚举,这样才能最快找到ans,然后利用ans剪枝{if(last_weight<box[pos].weight*i) continue;dfs(pos+1,now_value+box[pos].value*i,last_weight-box[pos].weight*i);}
}
int main()
{int cas;long long sumv,sumw;// 价值和重量的和;仅仅用到了一次(特殊情况才用到,能够一次全带走)scanf("%d",&cas);while(cas--){ans=0;sumv=sumw=0;scanf("%d%lld",&n,&m);for(int i=1;i<=n;i++){scanf("%lld",&box[i].weight);sumw+=box[i].weight*i;}for(int i=1;i<=n;i++){scanf("%lld",&box[i].value);box[i].num=i;sumv+=box[i].value*i;}// 以上是数据的输入,下面才是刚刚开始的// 如果sumv开始就比m总重量还小,直接输出if(sumw<=m){printf("%lld\n",sumv);continue;}sort(box+1,box+1+n,cmp);// 从1开始计数的sum[n+1]=0; // 倒着开始的for(int i=n;i>=1;i--){//计算后缀和sum[i]=sum[i+1]+box[i].value*box[i].num;}dfs(1,0,m);printf("%lld\n",ans);}return 0;
}
剪枝算法(算法优化)相关推荐
- 【深度学习】基于深度神经网络进行权重剪枝的算法(一)
[深度学习]基于深度神经网络进行权重剪枝的算法(一) 1 pruning 2 代码例子 3 tensorflow2 keras 权重剪裁(tensorflow-model-optimization)3 ...
- 动态规划算法的优化技巧
动态规划是信息学竞赛中一种常用的程序设计方法,本文着重讨论了运用动态规划思想解题时时间效率的优化.全文分为四个部分,首先讨论了动态规划时间效率优化的可行性和必要性,接着给出了动态规划时间复杂度的决定因 ...
- 十三、冒泡排序算法及其优化
一.基本介绍 **冒泡排序(Bubble Sorting)的基本思想是:**通过对待排序序列从前向后(从下标较小的元素开始),依次比较 相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部, ...
- 计算机算法对程序设计的作用,计算机编程中数学算法的优化策略
李钰 摘要:在计算机编程中,合理地运用数学算法所拥有的优势不但可以完好地针对所拥有的问题进行总结分类归纳,还可以将其归纳作为基础从而进行针对性的统一计算,并且能够将非常复杂的问题进行整体的简化并且将其 ...
- 用进化算法来优化SVM的参数C和Gamma——利用SCOOP库进行分布式加速计算
该案例展示了如何利用SCOOP库进行分布式加速计算Geatpy进化算法程序, 本案例和soea_demo6类似,同样是用进化算法来优化SVM的参数C和Gamma, 不同的是,本案例选用更庞大的数据集, ...
- Pytorch框架的深度学习优化算法集(优化中的挑战)
个人简介:CSDN百万访问量博主,普普通通男大学生,深度学习算法.医学图像处理专攻,偶尔也搞全栈开发,没事就写文章,you feel me? 博客地址:lixiang.blog.csdn.net Py ...
- 【深度学习】基于深度神经网络进行权重剪枝的算法(二)
[深度学习]基于深度神经网络进行权重剪枝的算法(二) 文章目录 1 摘要 2 介绍 3 OBD 4 一个例子 1 摘要 通过从网络中删除不重要的权重,可以有更好的泛化能力.需求更少的训练样本.更少的学 ...
- YUV图像实时去雾算法的优化与改进
YUV图像实时去雾算法的优化与改进 2016-03-02 21:04 摘要:针对已有的基于DSP的实时去雾算法出现的问题进行优化和改进.在降采样倍数过大时,去雾效果会出现一些副作用,包括纹理细节丢失. ...
- louvian算法 缺点 优化_机器学习中的优化算法(1)-优化算法重要性,SGD,Momentum(附Python示例)...
本系列文章已转至 机器学习的优化器zhuanlan.zhihu.com 优化算法在机器学习中扮演着至关重要的角色,了解常用的优化算法对于机器学习爱好者和从业者有着重要的意义. 这系列文章先讲述优化算 ...
- 白话Elasticsearch47-深入聚合数据分析之Cardinality Aggs-cardinality算法之优化内存开销以及HLL算法
文章目录 概述 官方说明 precision_threshold优化准确率和内存开销 HyperLogLog++ (HLL)算法性能优化 概述 继续跟中华石杉老师学习ES,第47篇 课程地址: htt ...
最新文章
- 如何保护你写的 Python 代码?
- Atitit. Async await 优缺点 异步编程的原理and实现 java c# php
- java中http解析url,java url 编码(解析http请求汉语言地址 )
- 《构建高可用Linux服务器》卓越网和互动网上架了
- 2018-2019 20165227《信息安全系统设计基础》第三周学习总结
- datatable数据类型方法
- notepad 配置python_Notepad++配置Python开发环境的图文详解
- 干货下载丨开源数据库安全管理
- Shell脚本学习-阶段九-数据库被攻击恢复
- pyclewn调试带参数程序
- 计算机一级a河北,2009年河北省计算机一级考试A卷
- 面试必问------索引详解
- php foreach 多出一个_PHP如何实现统计数据合并
- NI VISION视觉安装
- 泛型编程和元编程概念(先学泛型编程再学元编程)
- n维单位向量的生成公式
- 仙女姐姐@chuu chloe和@什么七七——python图片爬虫
- Word中将多个表格内容批量居中:通过“宏”操作
- 2023国自然已审核,预祝8月上榜
- 什么是哈希洪水攻击(Hash-Flooding Attack)?