[c++,algorithm] 基于非递归和递归的 01背包问题

栈:01背包问题(带价值) 栈解法/回溯算法 递归算法【C语言,数据结构】(内含源代码) 背包问题(Knappsack Problem). 分别设计背包问题的递归算法,和利用栈解决背包问题的非递归算法,分析比较两种算法的时间复杂度和空间复杂度。 需求分析: 1.用递归算法解决背包问题 2.用栈解决背包问题 3.输入两个数代表背包容量与物品个数。然后分两行输入物品重量和价值 例如:递归方法还有一种思路,用f[n]个数组来存储选择到第i件物品时的最优价值,这样虽然空间复杂度大了,但更利于人来理解递归是怎么工作的。在这里,我们选用的是机器效率最高的一种递归。 阅读详情

实验目的:

通过01背包问题理解动态规划,并根据题意描述写出自己的动态转移方程,并且练习将动态转移方程转换成程序进行实现。


实验环境:

win7,VS 2010


实验测试数据:



实验代码:

#include <cstdio>
#include <cstdlib>
#include <iostream>

using namespace std ;

/**
here we set there are 1...n objects
and the bag can contain the objects with the total 
weight no more than m

each object 's weight is stored in int w[1..n]

w[i] is the i-th object's weight ,(1<= i <= n)
symmertically ,p[i] (1<=i<=n)is used to store 
the price of the i-th object.

bool x[1..n] , this variable is used to store the final value 
in the pattern of the solution vector , 
which is usually used in liner algebra calculation .

for instance , when we choose the no. 1, 4, 7 objects into the knapsack ,
we can obtain the global maximum value under the condition 
w[1] + w[4]+ w[7] <= m (the total weight the knapsack can contain) 
then the value in x can be presented as 
x =           [ 1 , 0 , 0  , 1 , 0  , 0 , 1, 0,0 ,0...0 ]
object no.      1   2   3    4   5    6   7  ...

int optp[0...n][0...m] 
the 2-dimension to store the possible values 
we define the optp[i][j] ( 0<=i<=n && 0<= j <= m )is the maximum value ,
which we got from the 1...i-the objects', under the condition that :
total weight of the i objects is less than  m  that the maximum weight 
the bag can bear.

optp[n+1][m+1] is used to store the final maximum value ,

*/

#define n 5
#define m 100

void input (int w [], int p[])
{
	int i ;

	cout<<"input weight"<<endl ;

	for (  i = 1 ; i <= n ; i++ )
	{
		printf("w[%d] = \n", i ) ;
		scanf("%d"  , &w[i]) ;
	}

	cout<<"input price"<<endl ;
	for (  i = 1 ; i <= n; i++ )
	{
		printf("p[%d] = \n", (i));
		scanf("%d" ,&p[i]) ;
	}
}


int myKnapsack_DP ( int w[] , int p[] ,bool x[] )
{
	int (*optp)[m+1] = new int [n+1][m+1] ;
	int i , j ,  v = 0 ;
	/*
		first we initialize the values in optp [0][0..m]
		which means that maximum value we get from by puting
		0 objects into the 0..m weight-bearing knapsack is none .
	*/
	for ( i= 0 ; i <=m ; i++ )
		optp[0][i] = 0 ;
	/**
	this means that , if we put [0..n] objects into the 0 weight-bearing
	knapsack , we get the maximum value is still none . 
	and then we initialize the solution vectors x[0..n-1]
	which means we choose none object at the begining .
	*/

	for (  i = 0 ; i <= n ; i++ )
	{
		optp[i][0]  = 0 ;
		x[i] = false ;

	}

	for (  i = 1 ; i <= n ; i++ )
	{
		for ( j = 1 ; j <= m ; j++ )
		{
			optp[i][j] = optp[i-1][j] ;
	//		printf("current optp[%d][%d] = %d\n" , i , j , optp[i][j]) ;

			if ( j >= w[i] && (optp[i-1][j-w[i]]+p[i]) > optp[i-1][j] )
			{
//	printf("swaping \n current optp[%d][%d] = %d \n" , i , j , optp[i][j]) ;

//	printf("current optp[%d][%d] = %d \n", (i-1), (j-w[i]) , optp[i-1][j-w[i]]) ;
				optp[i][j] = optp[i-1][j-w[i]] +p[i]  ;
	
			}
		}
	}

	j = m ;
	for (  i = n ; i > 0 ; i-- )
	{
		if (optp[i][j] > optp[i-1][j])
		{
			x[i] = true ;
			j = j- w[i] ;
		}
	}

	v = optp[n][m] ;
	delete optp ;

	return v ;
}

int main ( int argc , char *argv [] )
{
	int w[n+1], p[n+1] ;
	bool x [n+1] ;

	input ( w, p) ;

	int result = myKnapsack_DP( w, p , x) ;

	cout<<"here is what we choose"<<endl ;
	for (int i = 1 ; i <=n ; i++ )
	{
		if (x[i])
		{
		cout<<"weight  "<<w[i];
		cout<<"  price"<<p[i]<<endl ;
		}
	}
    cout<<endl ;
	cout<<"maximum value is "<<result <<endl ;

	system("pause") ;
	return 0 ;
}


实验思想:

1.状态转移方程

   状态转移方程是动态规划方法的核心所在,而状态转移方程的编写往往和题目中的约束条件和目标函数二者是息息相关的。

   对于01背包问题,用数学建模的方法可以这样来理解:

   首先确定约束条件,我们希望从 n 个物品中选取其中的一个或是多个, 是指满足重量之和 <= 背包所能够承载的最大重量。

   其次是目标函数,在满足约束条件的前提下,使得背包中的物品的价值达到最大值。

   约束条件可以表示为如下的数学表达式:

   

  而与之相对应的,目标函数可以表示成如下的数学表达式:

  

2.通过动态规划求取到全局最优解之后,确定解向量的方法



而我们所需要做的就是找到一组解向量, X = {x1, x2, ... , xn } 来使得解向量满足上述的数学关系表达式。



 




首先,是初始化程序中的相关变量。

即,根据已知条件可知,向背包承重为0 的背包中装入 0...n 个物体所最终得到的最大价值为 0 。

同样,向背包承重为 0...m 的背包中装入 0 个物体所得到的最大价值也是 0 。

按照这种想法我们就有了上述的第一个等式。


然后,是状态转移,设当前带检测的物品是 i 物品,并同时设背包在装入前面的(i-1) 个物品之后载重量为 j 。

我们知道背包的载重量是随着物品的不断的加入而变小的,只是不同的选择对应不同的解向量 x ,同时对应着当前的背包的不同的载重量。


如果 i 物品的重量 w[i] > j , 则第i个物品是无法装入到背包中的,因为背包的载重量不足以容纳物品 i 了,所以在这个状态下,装入前 i-1 个物品

所得到的最大价值与装入 i 个物品所取得的最大价值是相同的。 

ps:在这里请注意的是,装入i-1 个物品也好装入 i 个物品也好,只是说明当前你的解向量所访问的维数,

我在这里说装入 i 个物品说明的是 |x| = i , 而第 i 个物品究竟是否是需要装入到背包中 即 xi = 0  还是  xi = 1 ,这个是由

物品的重量和当前背包可容纳的物品重量两个条件来共同决定的。 

基于这种想法,我们可以得到上述的状态转移方程表达式中的第一个。


接下来,需要分析的情况是 w[i] <= j , 的情况,这种情况对应的是当前背包的载重量是可以容纳第 i 个物品的,但是这并不是说,

可以容纳就一定要将第 i 个物品装入值背包中的,这个时候取决于目标函数所计算出的数值,

如果计算出把第 i 个物品放入背包中所得到的最终价值最大,那么就放入。  

如果计算出把第i 个物品不放入背包中,而选取其他的物品组合放入背包中所得到的最终价值最大,那么就不放入。


在这里应该知道的是,第 i 个物品选择放入与不选择放入这两种情况,所对应的前面的  i-1 个物品的选取情况也是不同的。


情况1 :选择放入第 i 个物品这种情况决定了,在前面的 i-1 个物品的选取是在背包承重量为 j- w[i]

 (即当前重量排除选择放入的第 i 个物品的重量) ; 这种情况下对应的最大价值。


情况2 :不放入第 i 个物品,这种情况决定了,在前面的 i-1 个物品中选取的是在背包承重量为 j (因为选择不放入 i ,

所以承重量不变)这种情况下所选取求取最大值的解向量。


而情况1 , 所对应的当前价值就是:在前i-1 个物品基于载重量为 j - w[i] 的情况下所选取的最大价值 + 第 i 个物品的价值 p[i]

而情况2 , 所对应的是,不选取 i 物品,这个与第一个式子所标示的含义是一样的

即 optp[i][j] = optp[i-1][j] , 即选取前 i-1 个物品所对应的最大价值 = 选取前 i 个物品的最大价值,

因为第 i 个物品没有选,状态没有变遇上一个状态对应的数值是一致的。


=======================================

以上的情况是状态转移方程用于求解全局最优解的描述,等到循环结束之后,我们所需要求解的最优解,

会被存放于optp[n][m] 中。


接下来将要介绍的是,如何在求取最优解之后,通过最优解的值来反推,得到这个最优解的解向量 x 是怎样的组合。

如果 optp[i][j] > optp[i-1][j] 这种情况对应的是, 在背包的载重量为 j 的情况下,

选取前 i 个物品所对应的最大价值 > 选取前 i-1 个物品所对应的物品的最大价值,则必定有物品 i 被选入背包中。


如果 optp[i][j] <= optp [i-1][j] 这种情况对应的是,在背包的载重量为 j 的情况下,

选取前面 i 个物品所对应的最大价值 <= 选取前 i -1 个物品所对应的最大价值,则物品 i 必定没有被选入到背包中。


上述的两个过程其实就是上述状态转移方程的递向推导的过程。

于是我们就有了下面的伪代码:


j <- m 

for i = n -> 1
	if (optp[i][j] > optp[i-1][j])
		x[i] <- true ;
		j <- j - w[i]
前提是,在一开始的时候,将 bool x [ 1..n ] 中的数值全部初始化为 false  
也就是说,在确定 i 被装入到背包中之后,不仅要将 x [i] 数值更新为 true ,

而且,还需要同步更新一下当前背包的载重量,使其相应减少物品 i 的重量 w[i] ,

然后在进行后续的判断。


实验注意事项:

在代码编写的时候,存放数据的数组下标是一件很考验人耐心的地方,

首先,optp[][] 二维数组中的下标访问范围分别是[0..n+1] [0..m+1] 

其中 optp[0][0..m] 中所存放的数据是将 0 个物体放入值承重为 [0..m+1] 的背包中,所获取的最大的价值。

而, optp[0..n][0] 中所存放的数据是将 0..n+1 个物体放入值承重为 0 的背包中,所获取的最大的价值。

当然这两种情况所获取的最大价值都是 0 。

optp[n][m] 在最终循环结束的时候,存放的是背包问题所求解的全局最大值,也就是全局最优解。

为了配合 optp[0..n][0..m] 的访问区间,必须要将 p (用于存放物品价值的数组) 和 w (用于存放物品重量的一位数组)

还有存放解向量的 x 一位数组。

的相应访问区间从 [0..n-1] , => 存放 n 个元素 ,修改成 [1..n] => 同样也是存放 n 个元素。


实验改进:

可以将 w,p 写入到一个struct 中,这样操作起来也会变得很方便。

对于最后逆向推导的地方,是可以使用递归方法来对它进行改写的,这个地方的处理很符合递归的思想。





掌握C语言经典算法:从数据结构到性能优化的系统学习指南 数据结构与算法是计算机科学的核心基础,它们定义了数据的组织方式和高效处理问题的通用模式。从数组、链表、栈、队列等基础结构,到排序、查找、图论等经典算法,其原理在于通过特定的逻辑与数学规则,在时间与空间复杂度之间寻求最优平衡。深入理解这些原理的技术价值在于,它能从根本上提升开发者的计算思维、问题抽象与性能优化能力,是突破编程瓶颈、编写高效稳定代码的关键。在实际应用场景中,无论是操作系统内核开发、嵌入式系统编程,还是高性能计算、数据库引擎优化,扎实的算法功底都不可或缺。本文以C语言实现为切入点,系统解析了包括指 阅读详情

相关推荐

0-1背包问题的递归实现与非递归实现

题目有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使价值总和最大。基本思路这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:   这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必

2万+

01背包问题(C++版)

01背包问题是最经典的动态规划类问题。 已知:有一个容量为V的背包和N件物品,第i件物品的重量是weight[i],收益是cost[i]。 限制:每种物品只有一件,可以选择放或者不放 问题:在不超过背包容量的情况下,最多能获得多少价值或收益 //01背包问题递归求法 #include using namespace std; int c[100]; int v[100

3s 2398

【信息科学与工程学】计算机科学与技术——第七十七篇 系统架构设计02

编号类型模型配方企业资本运作的方法/规则/条件/依据及所有的步骤(​风险处理/异常处理/危机应对关联知识法律法规和裁决依据​​由发起人(通常是知名投资人、投行或产业资本)先设立一个只有现金、无实际业务的特殊目的收购公司(SPAC),通过IPO募集资金并在交易所上市。然后在规定时间内(通常24个月)寻找一家非上市公司进行合并(De-SPAC),使目标公司迅速实现上市,规避传统IPO的复杂流程和不确定性。1.:在开曼或特拉华注册空壳公司,注入少量种子资金。2.

weixin_49199313的博客 312

255-C++ 动态规划 01背包问题

1.递归写法 //递归方法 int Knapsack(vector<int> w, vector<int> v, int i, int j, int n) { if (i == n) //只有一个物品 { return j >= w[i] ? v[i] : 0; } else { if (j < w[i]) //不装 return Knapsack(w, v, i + 1, j, n); else //装 { int maxv1 =

weixin_45964837的博客 1245

01背包问题C++递归关系 动态规划

01背包问题 课程作业 文件读入 文件输出 直接可用

背包问题递归算法及非递归算法的C++实现

背包问题递归算法及非递归算法的C++实现,问题描述:一个背包能盛放的物品总重量为S,设有n件物品,其重量分别为w1,…,wn,从n件物品中选择若干,使得重量恰好为S

算法(c++)——0-1背包问题

算法(c++)——0-1背包问题:0-1背包问题。现有n件物品和个容量为c的背包。第i件物品的重量是重量为w[i],价值v[i]。已知对于一件物品必须选择取(用1表示)或者不取(用0表示),且每件物品只能被取一次(这就是“0-1"的含义)。求放置哪些物品进背包,可使这些物品的重量总和不超过背包容量,且价值总和最大。运用动态规划法实现背包最大价值最优装载方式。

高冷男孩不吃苹果的博客 4696

背包问题 动态规划递归算法)

非常有用的背包问题动态规划递归算法,计算机老师强烈推荐

0-1背包问题的递归非递归两种解决方法

何为0-1背包问题? 举个例子,比如我们有物件物品,五件物品分别对应有着自己的重量和价值,此时我们有一个背包,让你去选择随意的装这五件商品,那么我们肯定要选择能最大化利益的一种方法,也就是有限的背包容量,装取最大价值的商品,这也就是0-1背包算法的核心思想。 那么如何去选择这个最优的解? 如图,weight表示物品的重量,value表示物品的价值。 此时的i表示背包的容积,j表示背包所能装下的物体数量。 当i=0时,表示背包所能装的物体为0个,当j等于0时,表示此时背包的容积为0,装不下了。 .

qq_44696297的博客 1030

zblog mysql数据库无法连接_ZBlog博客网站错误:MySQL数据库无法连接

前言前天搭建的博客网站,睡醒一觉起来网站挂逼了,其间无任何操作。主页都进不去,提示“MySQL数据库无法连接”,无论怎么刷新重启服务器都没用。最终从中午1点搞到凌晨2点,皇天不负有心人终于解决了。其实问题很简单,只是没这方面的经验,走了很多弯路。我本人并不是搞WEB的,搞这个博客纯碎就是玩玩罢了。处理这个问题的时候查了很久的资料,都是一些没太大意义的,无非就是让你改zb_user/c_option...

weixin_34691461的博客 2205

从零到一:Qt与PCL的跨平台开发环境搭建全攻略

本文详细介绍了从零开始搭建Qt与PCL跨平台开发环境的完整流程,涵盖Windows、Linux和macOS三大平台。重点解析了Qt5与Qt6版本选择、PCL库安装配置、VTK集成等关键技术要点,并提供跨平台CMake项目模板和常见问题解决方案,助力开发者快速构建三维点云处理应用。

weixin_29280657的博客 384

C++实现0-1背包问题 动态规划 非递归

前两天在华为笔试题的时候遇到了这个问题,做完之后发现自己有欠缺,回来赶紧复习一下本文链接https://blog.youkuaiyun.com/qq_34175893/article/details/79832210不说太多了,直接把代码贴出来,任何繁琐的理论都不如代码看着直接,我在代码中进行了详细的注释,保证只要看懂并理解了关键的几句代码及注释,0-1背包问题就变得很简单,原理什么的网上的博客很多,给大家分...

qq_34175893的博客 1653

C# ArcGIS Engine二次开发——实现“加载shp文件”

private void AddShpDataToolStripMenuItem_Click(object sender, EventArgs e) { OpenFileDialog OpFileDialog=new OpenFileDialog();//OpenFileDialog:打开文件对话框 OpFileDialog.Title="添加矢量数据"; OpFileDialog.Filter="(*.shp)|*.shp";//filter:过滤器;"(*.shp)|*.shp"

weixin_42191203的博客 5254

0-1背包问题递归与非递归实现

0-1背包问题有很多介绍,现在先不做说明,有时间补上。以下是递归的实现: package test; public class Package01 { /** * 01背包问题,求最大价值 * @param n 元素个数 * @param V 背包容量 * @param w 元素的体积 * @param v 元素的价值 * @param y 记录哪些元素被取出

Amazingjadewu 5101

如何使用 Conda 安装 Qiskit(详细教程)

本文介绍了使用conda安装Qiskit量子计算工具包的完整流程。首先创建Python 3.10的conda虚拟环境(qiskit_env),然后安装Qiskit核心包及可视化组件(注意Mac用户的安装命令差异)。接着注册IPython内核并测试环境,通过量子电路创建与可视化演示验证安装成功。该教程为量子计算开发提供了简洁的环境配置指南,适合研究者和开发者快速搭建Qiskit开发环境。

猿小白的博客 565

python实现MACD策略背离点的判断 (附完整源码)

python实现MACD策略背离点的判断 (附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 665

01背包问题,完全背包问题(递归求解)

01背包在选第i个物品时,容积够用情况下,只有2种状态可选,放还是不放,找出最大价值的选择 而完全背包在选第i种物品时,容积够用情况下,可能有2种以上状态可选,放1个,或者2个,3个,或者不放。找出最大价值的选择 01背包问题问题   input: 5 8         //五件物品 背包容量为8 4 5 2 1 3  //物品价值 3 5 1 2 2  //物品数量 outpu...

kkkkkkkk的博客 9894

如何对正射影像DOM(卫星影像、无人机航拍影像)进行拼接、合并以及去黑边(附 Global Mapper Pro 24.0 安装包(中文注册版))

为什么要对正射影像DOM进行拼接?影像去黑边、影像拼接的操作和步骤。

从地图看世界的专栏 4300

01背包问题(递归)

1. 问题描述: 有n个重量和价值分别为wi,vi的物品,从这些物品中挑选出总重量不超过W的物品,求所有挑选方案中价值总和的最大值。 1≤n≤100 1≤wi,vi≤100 1≤W≤10000 输入: n=4 (w,v)={(2,3),(1,2),(3,4),(2,2)} W=5 输出: 7(选择第0,1,3号物品) (因为对每个物品只有选和不选两种情况,所以这个问题称为01背包) ...

二哈 6394

【面试系列】数据工程师高频面试题及详细解答

本文针对数据工程师岗位,提供了详尽的面试题库和解答,分为初级、中级和高级三个层次。初级面试题主要涉及基本的数据处理和ETL工具的使用,如SQL查询、数据清洗和基本的数据建模。中级面试题重点考察数据管道设计、数据库优化和大数据平台的应用。高级面试题则深入探讨高级数据处理技术、分布式系统架构和数据湖的实现。通过这些问题和解答,候选人可以全面了解数据工程师岗位所需的技能,帮助其更好地准备面试。常考知识点总结部分则系统归纳了数据工程师岗位的关键技能领域。

在路上的专栏 2375

华为OD机试真题 2026-9-2【查找幸运数】

华为OD机试真题 新系统【查找幸运数】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【查找幸运数】多语言题解。

qq_45776114的博客 499

动态规划之0-1背包问题

首先介绍一下动态规划... 设计一个动态规划算法,通常可按照以下几个步骤进行: (1) 找出最优解的性质,并刻画其结构特征。 (2) 递归地定义最优解的值 (3) 以自底而上的方式计算出最优值 (4) 根据计算最优值时得到的信息,构造一个最优解。 对于一个给定的问题,若具有以下两个性质,则可以考虑用动态规划法来求解。 (1) 最优子结构。如果一个问题的最优解中包含了其子问题的最优解,

码农也有梦 4万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

01背包问题使用递归和非递归

标题:01背包问题使用递归和非递归 见视频:添加链接描述 F(k,w),k:前几件物品可以偷,w,当前背包容量 package com.suanfa; import javafx.beans.WeakInvalidationListener; import java.util.Arrays; /** 01背包问题 01背包问题:https://www.bilibili.com/video/BV1g7411B7SP?spm_id_from=333.999.0.0 **/ public class

weixin_45986454的博客 416

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Java-01背包问题-动态规划-递归和非递归实现

国际惯例,先上代码,粗略分析: package com.bag; /** * Author: lihao * Date:2017/8/31 * Description: */ public class Main { static int totalweight= 150; static int N= 5; static int values[] = {60, 2

leehoward 3271

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

回溯法-01背包问题之一:递归模式

一、回溯法 回溯法是一个既带有系统性又带有跳跃性的搜索算法。它在包含问题的所有解的解空间树中按照深度优先的策略,从根节点出发搜索解空间树。算法搜索至解空间树的任一节点时,总是先判断该节点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该节点为根的子树的系统搜索,逐层向其原先节点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。 运用回溯法解题通常包含以下三个步骤: · 针对所给问题

郗富琦的专栏 1万+
上一篇: [linux,c++] 基于mutex 的互斥访问队列实现
下一篇: [c++] 函数指针和函数指针数组的使用方法
Aimer1027
博客等级 码龄16年 23粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值