深度优先搜索(DFS)和广度优先搜索(BFS)

matlab练习程序(广度优先搜索BFS、深度优先搜索DFS) 如此经典的算法竟一直没有单独的实现过,真是遗憾啊。 广度优先搜索在过去实现的二值图像连通区域标记和prim最小生成树算法时已经无意识的用到了,深度优先搜索倒是没用过。 这次单独的将两个算法实现出来,因为算法本身和图像没什么关系,所以更纯粹些。 广度优先搜索是从某一节点开始,搜索与其线连接的所有节点,按照广度方向像外扩展,直到不重复遍历所有节点。 深度优先搜索是从某一节点开始,沿着其搜索到的... 阅读详情

DFS和BFS

基础算法合集:
https://blog.youkuaiyun.com/GD_ONE/article/details/104061907

摘要

本文主要介绍 深度优先搜索和广度优先搜索,下文皆称为DFS和BFS。

DFS和BFS是两种搜索树和图的基本策略,见名知其义, 深搜和广搜,一种往深处搜,一种往边上搜。 DFS常用于暴力搜索所有状态,BFS常用于搜索到达某一状态的最短路径。


状态

我们将DFS和BFS搜索的东西称为状态, 状态就是一个具体问题的一个解,而将问题的所有状态关联在一起, 就能得到一个状态图,DFS和BFS就是遍历状态图的两种方式。

下面以几个具体问题来加以解释:

  1. 输出123的全排列

    对于此题,将123数列的三个位置看作三个状态,当3个位置都填满数字时,就是其中一种排列,显然,答案就是所有当搜索完所有位置的所有状态。那么我们就可以使用DFS来找出所有状态。
    部分状态图:

在这里插入图片描述
以上状态图中, 蓝色箭头是DFS的搜索顺序,对以上状态图的解释:对于第一位,有3种状态,1 2 3, 先选1, 然后看第二位, 1已经选过了,只能选2,3,选择2, 然后第三位就只剩下了3, 得到123,然后再将第二位选择为3, 则第三位为2, 得到132.
可以看到,状态图是树形结构。一个状态总能从根节点(起始状态)转移得到。

  1. 用一个3*3的二维矩阵代表一个迷宫,由0,1组成,1代表可以通过,0代表不能通过。要求找出从入口(1,1)到出口(n,n)的最短路径

    对于此题,每个可以从入口到达的点,都是一个状态,那么从一层一层的搜,到达出口时的层数就是最短路径的长度了。

    部分状态图:

在这里插入图片描述
对于以上状态图, X代表当前位置, 1 2 3代表BFS搜索的层数, 当搜索完第 1 层,搜索第 2 层,第 2 层搜索完才会搜索第 3 层。


DFS

我们已经知道DFS是沿着当前路径一直搜索下去,直到无路可走,就会返回,这被称为 回溯
我们可以利用递归的方式来实现这一回溯效果。

public class Main{
	public  static int f(int n){
		if(n == 0){
			return n; 
		}
		
		System.out.print(n+"\n");
		f(n-1);
		System.out.print(n+"\n");
		
		return n;
	}
	public static void main(String[] args) throws IOException {
		f(3);
	}
	
}
输出:
3
2
1
1
2
3

函数执行顺序:

  1. main中调用f()函数
  2. n刚开始等于 3, 先输出3 然后调用f(n-1); // 第一层函数
  3. n等于2, 输出2, 然后调用f(n-1) ; // 第二层函数
  4. n等于1, 输出1, 然后调用f(n-1); //第三层函数
  5. n等于0, 返回到上一次函数, 即第三层函数。然后输出1
  6. 然后再返回到第二层, 输出2
  7. 最后返回第一次, 输出1.
  8. f()函数结束。

这就是回溯的实质了。

看一道例题:
Red and Black

在这里插入图片描述
题目大意就是从起始位置@开始走,只能走在 . (黑砖)上面, 不能走在#(红砖)上面,问从@开始最多可以走几块 .(黑砖)。

将每个可以到达的点当作一个状态,搜索所有的状态,就可以得到答案啦。
怎么搜索呢, 只要我们得到下个点的坐标就可以了, 可以朝四个方向走,
所以,当前坐标 + (0,1) 就是向右走, + (1,0)就是向下走, + (0,-1)就是向左走, +(-1, 0)就是向上走。

然后判断一下个点是否超出边界是红砖还是黑砖,如果是黑砖,就搜索下一点,也就是DFS下一个点。
本题也可BFS。

本题坑点: @点也算一个答案。
具体看代码
C++:

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int x,y,sum=1;
int n,m; // 行   列
int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};
char map[20][20];
int book[20][20];

void input(int n,int m){ // 读入数据,并记录@坐标
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			cin>>map[i][j];
			if(map[i][j]=='@')
				x=i,y=j;
		} 
	}
}

void dfs(int x,int y){
	for(int i=0;i<4;i++){
		int gx=x+next[i][0];
		int gy=y+next[i][1];
		if(gx>=0&&gx<m&&gy>=0&&gy<n&&book[gx][gy]!=1&&map[gx][gy]=='.'){
			sum++;
			book[gx][gy]=1; // 标记已经走过。则下次不再走这个点
			dfs(gx,gy);
		}
	}
	return;
}

int main()
{
	while(cin>>n>>m&&n||m)
	{
		memset(map,0,sizeof map);
		memset(book,0,sizeof book);
		input(n,m);
		dfs(x,y);
		cout<<sum<<endl;
		sum=1;
	}
	return 0;
}

JAVA:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;

public class Main{
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
	static char[][] map = new char[30][30];
	static int[][] vis = new int[30][30];
	static int[][] ne = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}};
	static int n, m, res = 0;
	public static void dfs(int x, int y){
		vis[x][y] = 1;
		for(int i = 0; i < 4; i++){ //四个方向
			int nx = x + ne[i][0];
			int ny = y + ne[i][1];
			if(nx < 0 || nx >= m || ny < 0 || ny >= n || map[nx][ny] == '#' || vis[nx][ny] == 1){
				continue;
			}
			res++;
			dfs(nx,ny);
		}
	}
	
	public static void main(String[] args) throws IOException{
		while(true){
			
			String s[] = in.readLine().split(" ");
			n = Integer.parseInt(s[0]);
			m = Integer.parseInt(s[1]);
			if(n==0||m==0) break;
			int x = 0, y = 0;
			res = 0;
			for(int i = 0; i < vis.length; i++)
				Arrays.fill(vis[i], 0);
			for(int i = 0; i < m; i++){
				String s1 = in.readLine();
				if(s1.indexOf('@') != -1){
					x = i;
					y = s1.indexOf('@');
				}
				map[i] = s1.toCharArray();
			}
			dfs(x, y);
			out.write((res+1)+"\n");
			out.flush();
		}
	}
	
}


BFS

BFS要先搜索当前状态可以直接到达的所有状态。因为一次只能处理一个状态,所以我们需要按照先后顺序,先将可以到达的所有状态点全部存起来,因为需要满足先后的顺序,所以正好可以利用队列先进先出的特性来存储。

以下是一般的BFS模板

 public static void bfs(int x, int y){
    	q.add(x, y);  //将起点入队
    	vis[x][y] = 1; // 标记已经走过
    	res[x][y] = 0; // 标记起点的步数
    	while(!q.isEmpty()){ // 当队列不空
    		x = q.peek().x; //取出队头元素
    		y = q.peek().y; 
    		q.poll(); //删除队头元素
    		if(x == n-1 && n == m-1) return; // 到达终点
    		for(int i = 0; i < 4; i++){ // 当前点可以到达的下四个方向
    			int nx = x + dx[i]; // 下个点的坐标
    			int ny = y + dy[i]; 
    			if(nx < 0 || nx >= n || ny < 0 || ny >= m || vis[nx][ny] == 1 ) continue; // 下个点不合法
    			else{
    			    res[nx][ny] = res[x][y] + 1; // 到达下一个点的步数为此父结点的步数加1
    			    q.add(new pair(nx,ny));	//下个点合法,入队存储
    			    vis[nx][ny] = 1; // 标记该点已经走过
    			}
    		}
    	}
    }

用走迷宫来解释, 就是先把一个点可以直接到达的所有点存到一个队列里,
然后从这些点里每次出队一个,进行上述操作,直到所有可到达的点都被搜索过。

例题:
走迷宫

在这里插入图片描述
JAVA代码:

import java.io.*;
import java.util.*;


class pair{
	public int x,y;
	pair(int a, int b){
		x = a;
		y = b;
	}
}

public class Main{
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
 
    static final int N = 1000;
    static String[][] arr = new String[N][N];
    static int[][] pren = new int[N][N];
    static int[][] vis = new int[N][N];
    static int[][] res = new int[N][N];
    static int[] dx = {-1, 0, 1, 0};
    static int[] dy = {0, 1, 0, -1};
    static int n, m = 0;
    static Queue<pair> q = new LinkedList<>();
    
    public static int Int(String s){ return Integer.parseInt(s);}
    
    
    public static void read() throws IOException{
    	for(int i = 0; i < n; i++){
    		arr[i] = in.readLine().split(" ");
    	}
    }
    public static void bfs(int x, int y)throws Exception{
    	q.add(new pair(x, y));
    	vis[x][y] = 1;
    	res[x][y] = 0;
    	while(!q.isEmpty()){
    		x = q.peek().x;
    		y = q.peek().y;
    		q.poll();
    		for(int i = 0; i < 4; i++){
    			int nx = x + dx[i];
    			int ny = y + dy[i];
    			if(nx < 0 || nx >= n || ny < 0 || ny >= m || vis[nx][ny] == 1 || arr[nx][ny].compareTo("1") == 0) continue;
    			else{
    			    res[nx][ny] = res[x][y] + 1;
    			    q.add(new pair(nx,ny));	
    			    vis[nx][ny] = 1;
    				if(nx == n-1 && ny == m-1) return;
    			}
    		}
    	}
    }
    public static void main(String[] args) throws Exception{
    	String s[] = in.readLine().split(" ");
    	n = Int(s[0]);
    	m = Int(s[1]);
    	read();
    	bfs(0,0);
    	out.write(res[n-1][m-1]+"\n");
    	out.flush();
    }
}

刷题题目集:
POJ 1321 棋盘问题
POJ 2251 Dungeon Master
POJ 3278 Catch That Cow
POJ 3279 Fliptile
POJ 1426 Find The Multiple
POJ 3126 Prime Path
POJ 3087 Shuffle’m Up
POJ 3414 Pots
FZU 2150 Fire Game
UVA 11624 Fire!
POJ 3984 迷宫问题
HDU 1241 Oil Deposits
HDU 1495 非常可乐
HDU 2612 Find a way
题目链接

题目集题解:https://blog.youkuaiyun.com/GD_ONE/article/details/100833175

开始刷题吧!

python实现BFS(广度优先搜索)& DFS(深度优先搜索) BFS(广度优先搜索): 图1 BFS 图2 BFS 图3 Queue of BFS 图一是BFS(广度优先搜索)在树的情况下的执行过程,从A出发,搜索A的第二层,发现有B,C,D(必须从左到右搜索),再搜索B的第二层,发现B的第二层没有元素,再搜索C的第二层,发现有E,F,放置于D后面,再搜索D的第二层,发现有G,放置于F后面,再往下搜索E,F,G,发现只有G有第二层H和I,所以最后得到: A B C D E F G H I 图二是BF.. 阅读详情

相关推荐

深度优先搜索(DFS)和广度优先搜索(BFS)——c#实现

两种算法在您的迷宫项目中可以配合使用:DFS生成随机迷宫,BFS寻找最优路径,这正是大多数迷宫算法的经典实现方式。沿着分支尽可能深入,直到到达叶子节点,然后回溯探索其他分支。内存敏感/深度优先特性 → 选DFS(如迷宫生成)层级关系分析 → 选BFS(如社交网络层级分析)类似走迷宫时优先选择一条路走到黑,碰壁再回退。存在性验证 → 两者均可(如节点是否可达)需要最短路径 → 选BFS(如迷宫求解):O(V+E)(顶点数+边数):栈(Stack)或递归实现。类似水波纹扩散的效果。:队列(Queue)

山水CAD 二次开发 1254

深度优先搜索(DFS)(算法笔记)

深度优先搜索是一种枚举所有完整路径以遍历所有情况的搜索方法,总是以“深度”作为前进的关键词。实现方式是有很多,最常见的是递归。深度优先搜索属于搜索问题的一种,当问题可以被描述为“路径搜索”时,就可以采用搜素问题的所有解的方式来进行解决,所以DFS本质还是暴力。深度搜索具有两个关键词,即“岔道口”和“死胡同”,这两个词来源于迷宫问题,这也是搜索问题最原始的表现。当碰到岔道口时,总是以“深度”作为前进的关键词,不碰到死胡同就不回头,因此被称为“深搜”。

Arabot_的博客 1万+

一文搞定深度优先搜索(DFS)与广度优先搜索(BFS)【含完整源码】

写在前面:博主是一位普普通通的19届二本大学生,平时最大的爱好就是听听歌,逛逛B站。博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事,做自己以后不会留有遗憾的事,做自己觉得有意义的事,不浪费这大好的青春年华。博主写博客目的是记录所学到的知识并方便自己复习,在记录知识的同时获得部分浏览量,得到更多人的认可,满足小小的成就感,同时在写博客的途中结交更多志同道合的朋友,让自己在技术的路上并不孤单。 目录: 1.深度优先搜索(DFS) 2. .

记录博主学到的点滴 3573

蓝桥杯——深搜DFS(看完绝对入门DFS)

一文详解DFS,看完绝对入门(附练习题和详解)

m0_47963315的博客 6358

【C语言 DFS(深度优先搜索)和BFS(广度优先搜索)】

DFS(深度优先搜索)和BFS(广度优先搜索)是两种常用的图或树遍历算法。其主要思想是从起始节点开始,沿着每一个分支尽可能深入地搜索,直到找到目标节点或没有更多节点可访问,然后回溯并继续搜索其他分支。其主要思想是从起始节点开始,首先访问所有邻接节点,然后再按层次访问每个邻接节点的邻接节点。DFS 遍历顺序可能是:A -> B -> D -> E -> C -> F。BFS 遍历顺序是:A -> B -> C -> D -> E -> F。BFS 是一种遍历或搜索树或图的算法。

m0_74889573的博客 1552

Python 算法基础篇:深度优先搜索( DFS )和广度优先搜索( BFS )

深度优先搜索( DFS )和广度优先搜索( BFS )是两种常用的图遍历算法,用于在图中搜索目标节点或遍历图的所有节点。本篇博客将介绍 DFS 和 BFS 算法的基本概念,并通过实例代码演示它们的应用。

小蓝枣的博客 1万+

深度优先算法 DFS总结(算法详解+模板+例题)

沿着树的深度遍历树的节点,尽可能深的搜索树的分支。共 m+1 行,第 1 行为 2 个数,n 和 m,分别表示一共有 n(n≤105) 篇文章(编号为 1 到 n)以及m(m≤106) 条参考文献引用关系。一个如下的 6×6 的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行、每列有且只有一个,每条对角线(包括两条主对角线的所有平行线)上至多有一个棋子。有一个 n \times mn×m 的棋盘,在某个点 (x, y)(x,y) 上有一个马,要求你计算出马到达棋盘上任意一个点最少要走几步。

Alex_Fufu的博客 1万+

DOSBOX 0.74模拟器安装Windows 95

DosBox本身带有5.0版的DOS系统,启动后虚拟一个Z盘存放有Dosbox特有的外部指令,如config.com、imgmount.com等,经测试,可以顺利安装各版本的windows 3.1系统,但是不能安装win95,需要用原版的dos镜像启动才能安装。1. 获取启动盘镜像文件 下载Win95启动软盘镜像文件,名为boot.img,放到DosBox 0.74的目录下。2. 制作硬盘镜像文件

xjnzhidao的博客 9310

深度优先搜索(DFS) 总结(算法+剪枝+优化总结)

深度优先搜索(DFS) 总结(算法+剪枝+优化总结) 本文中会引用部分实例、文献资料来自不同的作者之手,由于资料整理比较困难,转载地址不在文中列举。如有侵权请联系我更换或删除!对于提供题解思路的各位大佬和作者:非常感谢! 一、前导 定义上的深度优先搜索的思路与树的先序遍历非常相似,是针对图的搜索而提出的一种算法,下面是算法导论上的解释: 在深度优先搜索中,对于最新发现的顶点,如果它还有以此为顶点而未探测到的边,就沿此边继续探测下去,当顶点v的所有边都已被探寻过后,搜索将回溯到发现顶点v有起始点的那些边

HeartFireY的博客 9万+

MOSFET开关损耗全面讲解:从原理到优化策略

深入剖析MOSFET开关损耗的产生机制,结合实际应用场景,讲解如何通过驱动设计和电路优化降低损耗,提升系统效率。重点关注mosfet在高频开关下的表现与热管理。

weixin_29476595的博客 1058

伯德图详解:从传递函数到系统稳定性的频域分析

在自动控制与控制系统设计中,理解系统对不同频率输入信号的响应特性,是分析和设计稳定系统的核心基础。频率响应描述了系统对正弦输入的幅值增益与相位变化规律,而伯德图作为最直观的频域分析工具,通过对数坐标将宽频带特性压缩成一条清晰曲线,让工程师无需复杂计算即可快速评估系统性能。从典型环节的渐近线绘制,到相位裕度、幅值裕度的读取,伯德图贯穿了系统稳定性判断、控制器参数整定及噪声抑制等关键场景。本文结合实际调试经验,系统讲解伯德图的绘制原理与读图方法,帮助读者快速掌握从传递函数到工程应用的核心技能。

weixin_34535286的博客 338

DFS——深度优先搜索

深度优先搜索,是一种常用的图遍历算法,用于在图或树数据结构中遍历所有节点。

m0_74421524的博客 4687

《物联网技术》课程笔记——第二章 物联网技术架构

文章目录第二章:物联网技术架构1 物联网技术体系(C3SD)2 系统体系结构的基本概念3 物联网体系结构——信息传递视角3.1物联网感知层3.1.1 感知层要解决的问题3.1.2 感知层的形态3.1.3 节点的感知能力与控制能力3.1.4 感知层实例3.2 物联网网络层3.2.1 网络相关概念3.2.2 IPV6与IPV4相比互联网协议的升级3.2.3 计算机网络的逻辑层次3.2.4 传输网的拓扑结构3.2.4.1 举例:智能小区的三表采集系统3.2.4.2 接入层3.2.4.2 汇聚层3.2.4.2 核心

南京大学软件工程硕士在读 2503

深度优先搜索(DFS)和广度优先搜索(BFS)

DFS && BFS

weixin_43955293的博客 3万+

制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)

实现的功能: l APP控制月球灯 l 本地月球灯控制 l APP控制“大白”颜色,实现各种颜色变身 l 门状态传感器状态APP显示 l 网络状态指示灯,连接服务器长亮,断开后闪烁 l 配网按键 l 云端定时功能 l 云端报警提示功能 l 云端历史数据查看 l 远程升级介绍 视频演示:【开源】制作一个有趣的涂鸦物联网小项目(涂鸦模组SDK开发 CBU BK7231N WiFi+蓝牙模组 HSV彩色控制)_哔哩哔哩_bilibili 一、界面展示 ...

东小东博客 7115

XCP_Basic 移植步骤

XCP_Basic 移植步骤

ggzzc的博客 2316

深度优先搜索(DFS)和广度优先搜索(BFS)两种算法c++

本文介绍了BFS和DFS两种算法及其实现过程,以及通过这两种算法解决迷宫复杂问题和七段码问题的解题思路以及完整代码展示!

CRainink的博客 1万+

MinerU 系列教程 | 第二课:快速上手 -- 安装与第一次解析

本篇教程作为的第二课,将带你从零完成 MinerU 的环境搭建、模型下载,并成功运行第一次文档解析。上一课我们从宏观视角认识了 MinerU,本课开始正式动手实践。

weixin_43674738的博客 301

图的广度优先搜索(BFS)和深度优先搜索(DFS)算法解析

BFS/DFS算法解析【算法入门]2018/6/21.前言和树的遍历类似,图的遍历也是从图中某点出发,然后按照某种方法对图中所有顶点进行访问,且仅访问一次。但是图的遍历相对树而言要更为复杂。因为图中的任意顶点都可能与其他顶点相邻,所以在图的遍历中必须记录已被访问的顶点,避免重复访问。根据搜索路径的不同,我们可以将遍历图的方法分为两种:广度优先搜索和深度优先搜索。2.图的基本概念2.1.无向图和无向...

weixin_40953222的博客 17万+

openclaw-cn : 无法将“openclaw-cn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称 解决方案

本文主要介绍了openclaw-cn : 无法将“openclaw-cn”项识别为 cmdlet、函数、脚本文件或可运行程序的名称解决方案,希望能对使用openclaw-cn的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 10万+

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

图的邻接矩阵、邻接表存储和图的广度优先搜索(BFS)、深度优先搜索(DFS)

图的邻接矩阵和邻接表表示。广度优先搜索(BFS)、深度优先搜索(DFS)及 C++ 实现。

Dong_HFUT的博客 8300

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

深度优先搜索(DFS)和广度优先搜索(BFS)(学习总结)

深度优先搜索: ①定义:是一种枚举所有完整路径以遍历所有情况的搜索方法。 ②如何实现DFS: 使用栈较麻烦。 类比斐波那契数列,可以使用递归这种方式来实现DFS。使用递归系统会调用叫系统栈的东西存放递归中的每一层状态,本质还是栈实现。 ③例子 (1)全排列 求1 2 3或1 2 3 4全排列可以使用几个for循环解决,但当求1到n(n小于等于10)用for不能解决则利用递归。 #include <iostream> using namespace std; int n; int book[20]

xiaotutuyahttp_的博客 5457

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

深度学习工具包 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")

广度优先搜索(BFS)与深度优先搜索(DFS)的对比及优缺点

广度优先搜索(BFS)与深度优先搜索(DFS)的对比及优缺点 深搜,顾名思义,是深入其中、直取结果的一种搜索方法 如果深搜是一个人,那么他的性格一定倔得像头牛!他从一点出发去旅游,只朝着一个方向走,除非路断了,他绝不改变方向!除非四个方向全都不通或遇到终点,他绝不后退一步!因此,他的姐姐广搜总是嘲笑他,说他是个一根筋、不撞南墙不回头的家伙。 深搜很讨厌他姐姐的嘲笑,但又不想跟自己的亲姐姐闹矛盾,于...

身在边城 心在编程 2万+

C++ 图的深度优先搜索(DFS)和广度优先搜索(BFS)

一、图的深度优先搜索和广度优先搜索 1.图的深度优先搜索: 类似树的前序遍历 2.图的广度优先搜索: 类似树的层次遍历 二、实现程序: 1.Graphlnk.h #ifndef Graphlnk_h #define Graphlnk_h #include <iostream> #include <queu...

ChanJose的博客 1636
上一篇: 递归
下一篇: 最短路问题的五种算法
Androids_lost_Sheep
博客等级 码龄8年 1022粉丝 86原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值