- 博客(46)
- 收藏
- 关注
原创 分支限界法最大团问题
【分支限界法】最大团问题给定无向图G=(V, E),其中V是非空集合,称为顶点集;E是V中元素构成的无序二元组的集合,称为边集,无向图中的边均是顶点的无序对,无序对常用圆括号“( )”表示。如果U∈V,且对任意两个顶点u,v∈U有(u, v)∈E,则称U是G的完全子图(完全图G就是指图G的每个顶点之间都有连边)。G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点数最多的团。如果U∈V且对任意u,v∈U有(u, v)不属于E,则称U是G的空子图。G的空子图U是G的独立
2021-06-07 19:50:37
1435
原创 【分支限界法】最大团问题
【分支限界法】最大团问题给定无向图G=(V, E),其中V是非空集合,称为顶点集;E是V中元素构成的无序二元组的集合,称为边集,无向图中的边均是顶点的无序对,无序对常用圆括号“( )”表示。如果U∈V,且对任意两个顶点u,v∈U有(u, v)∈E,则称U是G的完全子图(完全图G就是指图G的每个顶点之间都有连边)。G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点数最多的团。如果U∈V且对任意u,v∈U有(u, v)不属于E,则称U是G的空子图。G的空子图U是G的独立
2021-06-07 19:44:39
3048
原创 【分支限界法】批处理作业调度问题
【分支限界法】批处理作业调度问题给定n个作业的集合{J1,J2,…,Jn}。每个作业必须先由机器1处理,然后由机器2处理。作业Ji需要机器j的处理时间为tji。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理的时间。所有作业在机器2上完成处理的时间和称为该作业调度的完成时间和。批处理作业调度问题要求对于给定的n个作业,制定最佳作业调度方案,使其完成时间和达到最小。例:设n=3,考虑以下实例:这3个作业的6种可能的调度方案是1,2,3;1,3,2;2,1,3;2,3,1;3,1,2;3,2
2021-06-07 19:39:39
5387
原创 分支限界法的旅行商问题
分支限界法的旅行商问题(TSP)旅行推销员问题( 英语:Travelling salesman problem, TSP)是这样一个问题:给定一系列城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。它是组合优化中的一个NP困难问题,在运筹学和理论计算机科学中非常重要。分支限界法在上一篇Blog中我有简单说明,并给出了基于分支界限法的Dijkstra ,这篇文章里介绍一下基于分支限界法的TSP算法。对于TSP,我们需要利用上界和下界来对BFS进行剪枝,通过不断更新上界和下界,尽可
2021-06-07 19:35:41
2086
原创 01背包问题
01背包问题一个旅行者有一个最多能装m公斤的背包,现在有n中物品,每件的重量分别是W1、W2、……、Wn,每件物品的价值分别为C1、C2、……、Cn, 需要将物品放入背包中,要怎么样放才能保证背包中物品的总价值最大?算法分析本次采用队列式分支限界法来解决01背包问题,拿到一个物品k存在两个节点:物品放入背包中或物品不放入背包中,根据约束条件舍去无效情况。当前物品k放入背包中时,获取当前最大总价值,下一个物品k+1也存在放入背包和不放入背包中两个节点。当物品k不放入背包时,上个节点的最总价值为当前节点的
2021-06-07 19:29:33
197
原创 布线问题 分支限界法
【分支限界法】布线问题印刷电路板将布线区域划分成n×m个方格如图a所示。精确的电路布线问题要求确定连接方格a的中点到方格b的中点的最短布线方案。在布线时,电路只能沿直线或直角布线,如图b所示。为了避免线路相交,已布了线的方格做了封锁标记,其它线路不允穿过被封锁的方格。一个布线的例子:图中包含障碍。起始点为a,目标点为b。解此问题的队列式分支限界法从起始位置a开始将它作为第一个扩展结点。与该扩展结点相邻并且可达的方格成为可行结点被加入到活结点队列中,并且将这些方格标记为1,即从起始方格a到这些方格的
2021-06-07 19:27:04
2181
原创 装载问题-分支限界法
装载问题-分支限界法(队列式分支限界法,优先队列式分支限界法)问题描述有n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且问题:是否有一个合理的装载方案,可将这n个集装箱装上这2艘轮船?如果有,找出一种装载方案。例如:当n=3, c1=c2=50(1)若w=[10, 40, 40]可将集装箱1和集装箱2装上第一艘轮船,而将集装箱3装上第二艘轮船;(2)如果w=[20, 40, 40]则无法将这3个集装箱都装上船;队列式分支限界法解装载问题的队列式分支限界法
2021-06-07 19:20:41
3600
原创 分支限界法-优先队列-单源最短路径
分支限界法-优先队列-单源最短路径算法思想:分支限界法常以广度优先或以最小耗费(最大效益)优先的方式搜索问题的解空间树。在分支限界法中,每一个活结点只有一次机会成为扩展结点。活结点一旦成为扩展结点,就一次性产生其所有儿子结点。在这些儿子结点中,导致不可行解或导致非最优解的儿子结点被舍弃,其余儿子结点被加入活结点表中。此后,从活结点表中取下一结点成为当前扩展结点,并重复上述结点扩展过程。这个过程一直持续到找到所需的解或活结点表为空时为止。给定一个带权有向图G=(V,E),其中每条边的权是非负数。给定V中
2021-06-07 19:08:52
3731
原创 最大团问题
最大团问题问题描述给定无向图G=(V, E),其中V是非空集合,称为顶点集;E是V中元素构成的无序二元组的集合,称为边集,无向图中的边均是顶点的无序对,无序对常用圆括号“( )”表示。如果U∈V,且对任意两个顶点u,v∈U有(u, v)∈E,则称U是G的完全子图(完全图G就是指图G的每个顶点之间都有连边)。G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点数最多的团。如果U∈V且对任意u,v∈U有(u, v)不属于E,则称U是G的空子图。G的空子图U是G的独立集当
2021-06-02 19:13:45
1029
原创 圆排列问题
圆排列问题问题描述:给定n个大小不等的圆 c1 c2 c3 c4 要将n个圆排进一个矩形框中,且要求底边相切。找出有最小长度的圆排列。例如:当n=3,且所给的3个圆半径分别为1,1,2时,这3个圆的最小长度的圆排列 最小长度为2+4根号2.// Circle.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>template<class Type>class Circle{ template
2021-06-02 19:09:21
302
原创 旅行商问题
旅行商问题问题描述某售货员要到若干城市去推销商品,已知各城市之间的路程(旅费),他要选定一条从驻地出发,经过每个城市一遍,最后回到驻地的路线,使总的路程(总旅费)最小。// Traveling.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>using namespace std;template<class Type>class Traveling{ friend void TSP(
2021-06-02 19:07:08
224
原创 图的m着色问题
图的m着色问题问题描述给定无向连通图G和m种不同的颜色。用这些颜色为图G的各顶点着色,每个顶点着一种颜色。是否有一种着色法使G中每条边的2个顶点着不同颜色。这个问题是图的m可着色判定问题。若一个图最少需要m种颜色才能使图中每条边连接的2个顶点着不同颜色,则称这个数m为该图的色数。求一个图的色数m的问题称为图的m可着色优化问题。四色猜想:四色问题是m图着色问题的一个特例,根据四色原理,证明平面或球面上的任何地图的所有区域都至多可用四种、颜色来着色,并使任何两个有一段公共边界的相邻区域没有相同的颜色。这个
2021-06-02 19:04:07
904
原创 最大团问题
最大团问题问题描述 给定无向图G=(V, E),其中V是非空集合,称为顶点集;E是V中元素构成的无序二元组的集合,称为边集,无向图中的边均是顶点的无序对,无序对常用圆括号“( )”表示。如果U∈V,且对任意两个顶点u,v∈U有(u, v)∈E,则称U是G的完全子图(完全图G就是指图G的每个顶点之间都有连边)。G的完全子图U是G的团当且仅当U不包含在G的更大的完全子图中。G的最大团是指G中所含顶点数最多的团。 如果U∈V且对任意u,v∈U有(u, v)不属于E,则称U是G的空子图。G的空子图U是G的独立
2021-06-02 19:00:25
320
原创 0-1背包问题
0-1背包问题问题描述:给定 n 个物品和一个容量为 C 的背包,请 给出物品装入背包的方案,使得背包中物品的总价值 M 最大,并 满足:• 每个物品 I 的重量为 w i ,价值为 v i 。• 每个物品不可拆分,要么完整装入背包,要么不在背包里。• 背包中物品的总重量不能超过容量 C 。// Pack.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>template<class Type>c
2021-06-02 18:57:48
109
原创 n皇后问题
n皇后问题问题描述:N皇后问题是一个经典的问题,在一个N*N的棋盘上放置N个皇后,每行一个并使其不能互相攻击(同一行、同一列、同一斜线上的皇后都会自动攻击)。输入皇后数n,输出解,并且打印出n个皇后的坐标。// Queen.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include <iostream>#include<stdlib.h>template<class Type>class Queen{public
2021-06-02 18:52:19
212
原创 批处理作业调度
批处理作业调度1、问题描述每一个作业Ji都有两项任务分别在2台机器上完成。每个作业必须先有机器1处理,然后再由机器2处理。作业Ji需要机器j的处理时间为tji。对于一个确定的作业调度,设Fji是作业i在机器j上完成处理时间。则所有作业在机器2上完成处理时间和f=F2i,称为该作业调度的完成时间和对于给定的n个作业,指定最佳作业调度方案,使其完成时间和达到最小。区别于流水线调度问题:批处理作业调度旨在求出使其完成时间和达到最小的最佳调度序列;// PermutationTree.cpp : 此文件包
2021-06-02 18:47:19
872
原创 装载问题子集树回溯
装载问题问题描述:有一批共n个集装箱要装上2艘载重量分别为c1和c2的轮船,其中集装箱i的重量为wi,且,装载问题要求确定是否有一个合理的装载方案可将这些集装箱装上这2艘轮船。如果有,找出一种装载方案。 例如:当n=3,c1=c2=50,且w=[10,40,40]时,则可以将集装箱1和2装到第一艘轮船上,而将集装箱3装到第二艘轮船上;如果w=[20,40,40],则无法将这3个集装箱都装上轮船。基本思路: 容易证明,如果一个给定装载问题有解,则采用下面的策略可得到最优装载方案。(1)首先将第一艘
2021-05-31 19:11:50
344
原创 非递归的子集树公式
非递归的子集树公式void IterativeBacktrack(void){ int t = 1; while (t > 0) { if (f(n, t) > g(n, t)) { for (i = f(n, t; i < g(n, t)) //这里需要个一个变量来保存需要的t //x[t]=i if (constrai
2021-05-31 19:06:43
111
原创 排列树的递归公式
递归排列树的递归公式void Bactrack(int t){ if (t > n) outPut(); else{ for (i = f(n, t); i < g(n, t); i++){ swap(x[t],i); //这里需要个一个变量来保存需要的t //x[t]=i if (constraint(t) && Bound(t))
2021-05-31 19:05:00
149
原创 子集树递归公式
子集树递归的基本公式void Bactrack(int t){ if (t > n) outPut(); else { for (i = f(n, t); i < g(n, t); i++) //这里需要个一个变量来保存需要的t //x[t]=i if (constraint(t) && Bound(t))//constrain是约束函数 Boun
2021-05-31 18:56:26
186
原创 bind and function c++ 11
关于bind和function的联和使用在前面我就把bind和function的使用都对大家都说了一遍,那他们怎么连起来使用了,function和bind连起来其实function就可以只是函数的引用,不需要在function里中去添加什么类的方法和类对象,这个类的方法和类对象就让bind来绑定就可以了,以下是对其用法的解释基本的类的构造class A{public: int print(int a) { cout << "print(int a)" << endl
2021-05-31 12:48:24
114
原创 bind c++11
bind函数的使用详解可以将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。bind其实是一个模板参数:template <class _Fx, class... _Types>_NODISCARD _CONSTEXPR20 _Binder<_Unforced, _Fx, _Types...> bind(_Fx&& _Func, _Types&&... _Args) {
2021-05-31 12:36:14
157
原创 function c++ 11
Cocos2d1.关于回调函数的绑定typedef std::function<bool(Touch*, Event*)> ccTouchBeganCallback;typedef std::function<void(Touch*, Event*)> ccTouchCallback; ccTouchBeganCallback onTouchBegan; ccTouchCallback onTouchMoved; ccTouchCallback onT
2021-05-30 19:31:50
177
原创 动态规划最大子矩阵和问题
最大子矩阵和问题(1)问题描述:给定一个m行n列的整数矩阵A,试求A的一个子矩阵,时期各元素之和为最大。(2)问题分析:用二维数组a[1:m][1:n]表示给定的m行n列的整数矩阵。子数组a[i1:i2][j1:j2]表示左上角和右下角行列坐标分别为(i1,j1)和(i2,j2)的子矩阵,其各元素之和记为:最大子矩阵问题的最优值为。如果用直接枚举的方法解最大子矩阵和问题,需要O(m2n2)时间。注意到,式中,,设,则容易看出,这正是一维情形的最大子段和问题。因此,借助最大子段和问题的动态
2021-05-29 20:02:06
1008
原创 动态规划一维数组
问题描述:给定一个数组,记录一串数字,可正可负,现要求出其中最大的连续子段和。用数组A[N]记录所要求的数组,用数组B[N]来记录连续子段和的状态通过分析,可以知道:当B[K]>0时,无论B[K]为何值,B[K]=B[K-1]+A[K]当B[K]<0时,也就是B[K]记录到一个A[J]是负的,可以把B[K]变成负的,那么B[J]记录的这一段应该截掉,应为无论后面的A[K]多大,加上个负数总不可能是最大的子段和,因此将B[K]=A[K],重新开始记录。故动态转移方程便可得出B[K]
2021-05-29 20:01:44
308
原创 贪心背包问题v/w
标题贪心算法的基本思想是:从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的求得更好的解。当达到算法中的某一步不能再继续前进时,算法停止。背包问题用贪心算法来解决,每次选择利润v/w最大的物品装进背包,这样就使得目标函数增加最快,当最后一种物品放不下时,选择一个适当的,使物品装满背包,使得总的价值最大。设计背包问题是一个有很多中答案的问题,可以用动态规划和贪心算法来求解。用贪心算法来解决问题是相当方便和快捷的。对于一些特定的问题,要找到最佳解,一般的思路是先列出所有解,然后找到最佳解。利用贪心算
2021-05-29 20:01:22
141
原创 单源最短路径贪心算法
单源最短路径算法贪心思想:单源最短路径即是寻找一个点到各各点的距离,首先需要去用一个数组dis去保持起始点到最近点的路劲(即权),由出发点去找最近点的最短路径,再由这个找到的最近点去找和他连的路径,如果这个点的到最近点的距离小于已经在dis数组中保持的,就去更改dis数组,下面是图演示:这是保存在e[][]这个二维数组里的值:#include"stdafx.h"#include <stdio.h>#include<iostream>using namespace s
2021-05-29 20:00:58
4783
1
原创 贪心Kruskal算法
贪心Kruskal算法此算法可以称为“加边法”,初始最小生成树边数为0,每迭代一次就选择一条满足条件的最小代价边,加入到最小生成树的边集合里。1. 把图中的所有边按代价从小到大排序;2. 把图中的n个顶点看成独立的n棵树组成的森林;3. 按权值从小到大选择边,所选的边连接的两个顶点ui,viui,vi,应属于两颗不同的树,则成为最小 生成树的一条边,并将这两颗树合并作为一颗树。4. 重复(3),直到所有顶点都在一颗树内或者有n-1条边为止。5. int findFather(int x)
2021-05-29 20:00:32
313
原创 贪心算法prim算法
普利姆算法(Prim):算法思想基于顶点选择,通过维护两个点集,已选点集S和未选点集T,每次选择从S集映射到T集的最小代价边,适用于稠密图。图解dis更新过程:最短路径求解时,dis更新的都是以北京为起点,prim算法起点始终是从S集合出发向T集合连线,也就是dis表中找到权值最小的那个点,放入S集合中。#include"stdafx.h"#include<iostream>#define INF 10000using namespace std;const int N =
2021-05-29 19:59:58
902
原创 循环赛日程表(分治)
问题描述设有 n = 2的k次方 个运动员要进行网球循环赛。现要设计一个满足以下要求的比赛日程表:(1)每个选手必须与其他n-1个选手各自赛一次。(2)每个选手一天只能赛一次。(3)循环赛一共进行n-1天。算法设计按分治策略,我们可以将所有的选手分为两半,n个选手的比赛日程表可以通过n/2个选手设计的比赛日程表来决定。递归地用这种一分为二的策略对选手进行分割,直到只剩下两个选手时,比赛日程表的制定就变得很简单。这时只要让这两个选手进行比赛就可以了。#include "stdafx.h"
2021-03-08 12:31:10
581
原创 动态规划最长公共子序列
最长公共子序列,英文为Longest Common Subsequence,缩写LCS。一个序列,如果是某两个或多个已知序列的最长子序列,则称为最长公共子序列。另外,要注意的是最长公共子序列与最长公共子串不一样,下面看一个例子就明白。有序列S1和S2,其中S1=hello,S2=hero。那么最长公共子序列为heo,而最长公共子串为he。可以看到区别就在于一个允许不连续,一个要求必须连续,而共同特点就是都要保持顺序性。标题动态规划。一般在能用动态规划解决的问题需要符合三个特征:最优子结构、重叠子问题
2021-02-18 21:26:49
154
原创 动态规划矩阵连乘备忘录
备忘录是动态规划算法的变形﹒备忘录方法也是用表格保存已解决子问题的答案﹒与动态规划算法不同的是,备忘录方法的递归方式是自顶向下的,而动态规划算法则是自底向上递归的.因此,备忘录方法的控制结构与直接递归方法的控制结构相同,而区别在于备忘录方法为每个解过的子问题建立了备忘录以备需要时查看,避免了相同子问题的重复求解.备忘录方法为每个子问题建立一个记录项,并初始化为一个特殊值表示该子问题尚未求解﹒在求解过程中,对每个待求的子问题,首先查看其相应的记录项,如若记录项仍为初始化时的特殊值,则表示该子问题尚未求解,
2021-02-18 21:23:06
431
原创 动态规划矩阵求和
一.矩阵链事例矩阵链问题主要涉及的时在多个矩阵相乘,如何通过相乘的顺序来减少程序运行。这次分析过程按照动态规划的三个基本条件来逐步解答:1、寻找最优子结构:假设我们已经找到父矩阵链最优解,当我们划分到最后一步时都是两个子矩阵链(分别被括号包围)相乘,如(A1A2A3A4)(A5A6A7),此时显然外括号为父矩阵的最优括号划分。继续往下划分,((A1A2A3)A4)(A5(A6A7)),则两个子矩阵链的划分括号必须也为他们本身的最优括号划分。因为如果子矩阵链的划分括号不是他们本身的最优括号划分时,两个
2021-02-12 16:29:03
347
原创 线性时间选择问题
线性时间选择问题:给定线性序集中n个元素和一个整数k,1≤k≤n,要求找出这n个元素中第k小的元素,(这里给定的线性集是无序的)。1、随机划分线性选择线性时间选择随机划分法可以模仿随机化快速排序算法设计。基本思想是对输入数组进行递归划分,与快速排序不同的是,它只对划分出的子数组之一进行递归处理。// test.cpp : 定义控制台应用程序的入口点。#include "stdafx.h"#include <iostream> #include <ctime>usin
2021-01-11 18:52:04
913
原创 二分法查找
加粗样式当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。实现过程假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2.1.开始令front=0(指向3
2021-01-11 16:11:10
175
原创 最近点对问题
分治——最近点对问题问题描述n个点在公共空间中,求出所有点对的欧几里得距离最小的点对。分治法求解分解对所有的点按照x坐标(或者y)从小到大排序(排序方法时间复杂度O ( n l o g n )。根据下标进行分割,使得点集分为两个集合。解决递归的寻找两个集合中的最近点对。取两个集合最近点对中的最小值m i n ( d i s l e f t , d i s r i g h t )。合并最近距离不一定存在于两个集合中,可能一个点在集合A,一个点在集合B,而这两点间距离小于dis。有已
2021-01-06 15:44:40
695
原创 推箱子
推箱子的思想推箱子其实就是一个二维数组,在二维数组中进行判断,当玩家和空地和箱子和成功点的不断变化,而你只需要对玩家能操作的进行编写,就可以推动,而返回就需要对推动的方向和是否推动箱子进行判断,这样你就可以用栈来保存。#include <iostream>#include <conio.h>#include<vector>#include<fstream>using namespace std;int Map[10][10];//记录玩家的坐标
2020-12-17 13:51:48
743
原创 快速排序
快速排序是采用了一种分治的策略,通常称其为分治法。该方法的基本思想是:1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。虽然快速排序称为分治法,但分治法这三个字显然无法很好的概括快速排序的全部步骤。因此我的对快速排序作了进一步的说明:挖坑填数+分治法:以一个数组作为示例,取区间第一个数为基准数。void Swap(int *n, int *m){ int temp; te
2020-12-15 16:06:16
845
原创 棋盘覆盖
分治法之棋盘覆盖问题在一个2k×2k 个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。当k>0时,将2k×2k棋盘分割为4个2k-1×2k-1 子棋盘(a)所示。特殊方格必位于4个较小子棋盘之一中,其余3个子棋盘中无特殊方格。为了将这3个无特殊方格的子棋盘转化为特殊棋盘,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,如 (b)
2020-12-11 18:36:44
191
原创 多态性(图形的面积)
多态性2(图形的面积) 定义一个形状类shape,将它作为基类派生出类:circle(圆)、triangle(三角形)和rectangle(长方形)。分别定义这些派生类并且定一个虚函数来计算各个形状的面积。#include #include<math.h>#includeusing namespace std;///基类Shap...
2019-11-03 21:22:22
852
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人