精华内容
下载资源
问答
  • 场景中有地形图层,通过鼠标绘制一个区域,计算该区域内地形的极大值极小值
  • 该程序将计算一个变量的函数的最大和最小值点。
  • 极小值极大值井字棋

    2017-11-26 00:02:21
    //评估函数 int evaluteMap() { ... //计算每一行中有多少行的棋子连成3个的 for (i = 0; i ; i++) count += (tempBoard[i][0] + tempBoard[i][1] + tempBoard[i][2]) / 3; for (i = 0; i ; i++)
  • 目的提出一种基于波模极大值和自适应阈值的火灾图像边缘检测方法。方法计算火灾图像小波变换后的梯度模极大值,采用自适应阈值法去除伪边缘,从而实现火灾图像的边缘检测。结果实验结果表明,笔者算法可以从带有噪声...
  • 极小值-源码

    2021-02-28 03:43:27
    极小极大 使用minimax算法计算4,请参见
  • 分析信号和噪声的奇异指数, 根据函数不同的奇异指数小波变换的局部模极大值具有不同的传播特性的理论, 在相邻模极小构成的待选通域中对分析出的噪声局部模极大值所在的选通域进行平滑处理, 反变换重建出去噪信号....
  • 基本思想就是假设博弈的双方都足够聪明,一方总是能选择最有利于自己的方案,使得自己胜率值极大,而另一方总会选择最不利对手的方案,使得对手的胜率值极小。 对于计算机下棋,一个最重要的因素看来是程序能够向前...

    博弈树:在进行游戏时,双方轮流选择,每次执行一个步骤。所有可能的步骤就构成了一棵博弈树。

    终端位置:通过考察盘面能够确定这局棋输赢的位置。如果一个位置不是终端位置那么该位置的值通过递归地假设双方最优棋步而确定的。

    极小极大策略:极小极大策略常用于二人博弈游戏,目的是寻找最优的方案使得自己能够利益最大化。
    基本思想就是假设博弈的双方都足够聪明,一方总是能选择最有利于自己的方案,使得自己胜率值极大,而另一方总会选择最不利对手的方案,使得对手的胜率值极小。

    对于计算机下棋,一个最重要的因素看来是程序能够向前看的棋步的数目。称之为层(ply),也就是递归的深度。

    计算机和人进行博弈:计算机先手,则在博弈树中,计算机总会选择最大的值(称为MAX层),人总会选择最不利于计算机的方案,使计算机的值极小(称为MIN层)。

    例:在图中MIN层从MAX层选择最小的值,在MAX层从MIN层中选择最大的值。这是一个博弈的过程。
    在这里插入图片描述

    ɑ-β剪枝:AlphaBeta剪枝算法是一个搜索算法旨在减少在其搜索树中,被极大极小算法评估的节点数。这是一个常用人机游戏对抗的搜索算法。它的基本思想是根据上一层已经得到的当前最优结果,决定目前的搜索是否要继续下去。

    Alpha代表MAX层的取值,Beta代表MIN层的取值。

    Alpha剪枝:Alpha的值位于MAX层,Alpha是下一层MIN层中取值的最大值,当MIN层的一边已经得出数据,则另一边的左右子树要都比另一侧数据大,才有计算的价值,当其中一个比另一侧数据小,另一侧就没有计算的价值,进行剪枝操作。

    如图所示:
    在这里插入图片描述
    Beta剪枝:Beta的值位于MIN层,Beta是下一层MAX层中取值的最小值,当MAX层的一边已经得出数据,则另一边的左右子树要都比另一侧数据小,才有计算的价值,当其中一个比另一侧数据大,另一侧就没有计算的价值,进行剪枝操作。

    如图所示:
    在这里插入图片描述

    三连游戏棋:两人轮流在印有九格方盘上划“+”或“O”字, 谁先把三个同一记号排成横线、直线、斜线, 即是胜者。

    核心代码

    void FindComMove(BoardType Board, int *BestMove, int *Value, int Alpha, int Beta)
    {
    	int Dc, i, Response;
    	if (FullBoard(Board))				//判断棋盘是否下满,若下满,则平局
    		*Value = Draw;
    	else if (ImmediateHumanWin(Board))	//判断人类是否赢
    		*Value = ComLoss;
    	else
    	{
    		*Value = Alpha;
    		//Alpha剪枝,Beta的值必须大于Alpha的值,否则剪枝
    		for (i = 0; i < 9 && *Value < Beta; i++)
    		{
    			if (IsEmpty(Board, i / 3, i % 3))
    			{
    				Place(Board, i / 3, i % 3, 'C');	//下棋
    				FindHumanMove(Board, &Dc, &Response, *Value, Beta);	
    				//模拟人类下棋,构建博弈树
    				Unplace(Board, i / 3, i % 3);		//撤销下棋
    				if (Response > *Value)				//若位置更好,则更新位置
    				{
    					*Value = Response;
    					*BestMove = i;
    				}
    			}
    		}
    	}
    }
    
    void FindHumanMove(BoardType Board, int *BestMove, int *Value, int Alpha, int Beta)
    {
    	int Dc, i, Response;
    	if (FullBoard(Board))			//判断棋盘是否已满,若是则平局
    		*Value = Draw;
    	else if (ImmediateComWin(Board))	//判断计算机是否赢
    		*Value = ComWin;					
    	else
    	{
    		*Value = Beta;
    		//Beta剪枝,若Alpha的值大于Beta,则进行剪枝
    		for (i = 0; i<9 && *Value > Alpha; i++)
    		{
    			if (IsEmpty(Board, i / 3, i % 3))			
    			{
    				Place(Board, i / 3, i % 3, 'H');	 //下棋 
    				FindComMove(Board, &Dc, &Response, Alpha, *Value);
    				//模拟计算机下棋,构建博弈树
    				Unplace(Board, i / 3, i % 3);		//撤销下棋
    				if (Response < *Value)
    				{
    					//若有更好的位置,则更新
    					*Value = Response;
    					*BestMove = i;
    				}
    			}
    		}
    	}
    }
    

    参考:数据结构于算法分析回溯算法

    展开全文
  • 可在O(nlogn)时间内计算出1个数组任意子序列的最值(感觉和树状数组差不多)用F(i,j)表示从第i个数起连续2^j个数的最大 易得 F(i,0)=A[i]又可得状态转移方程 F(i,j)=max(F(i,j-1),F(i+2^(j-1),j-1))(分成两个相同...

    可在O(nlogn)时间内计算出1个数组任意子序列的最值(感觉和树状数组差不多)用F(i,j)表示从第i个数起连续2^j个数的最大值
    易得 F(i,0)=A[i]

    又可得状态转移方程 F(i,j)=max(F(i,j-1),F(i+2^(j-1),j-1))(分成两个相同长度的子序列,取其中最大的值,好理解吧~)

    所以代码如下:

    #include<iostream>
    using namespace std;
    void RMQ(int num)
    {
        for(int j=1;j<20;j++)
            for(int i=1;i<=num;i++)//  注意i,j的顺序  先求小序列,再通过小序列求大序列.
            if(i+(1<<j)-1<=num)
        {
            maxsum[i][j]=max(maxsum[i][j-1],maxsum[i+(1<<(j-1))][j-1]);
            minsum[i][j]=min(minsum[i][j-1],minsum[i+(1<<(j-1))][j-1]);
    
        }
    }
    
    int qmax(int i,int j)//查询
    {
        int k=log2(j-i+1);
        return max(maxsum[i][k],maxsum[j-(1<<k)+1][k]);
    }
    
    展开全文
  • 极大值法保留幅度随尺度增加而增大的点 (对应于有用信号的极值点 )来达到去噪的目的 ,但将非极值处变换系数置零 ,造成信号损失。提出了一种变化模极大值与阈值决策相融合的去噪方法 ,有效地结合了两者的优点。经...
  • 极大极小值算法( Minimax algorithm) 在上文的博弈树中,如果我们令甲胜的局面值为1,乙胜的局面值为-1,而和局的值为0。当轮到甲走时,甲定会选择子节点值最大的走法:而轮到乙时,乙则会选择子节点值最小的...

    极大极小值算法( Minimax algorithm)

     

            在上文的博弈树中,如果我们令甲胜的局面值为1,乙胜的局面值为-1,而和局的值为0。当轮到甲走时,甲定会选择子节点值最大的走法:而轮到乙时,乙则会选择子节点值最小的走法。所以,对于中间节点的值可以有如下计算方法:如果该节点所对应的局面轮到甲走棋,则该节点的值是其所有子节点中值最大的一个的值。而如果该节点所对应的局面轮到乙走棋,则该节点的值是其所有子节点中值最小的一个的值。

            对博弈树的这个变化仅仅是形式上的,本质上丝毫未变,但是这个形式更容易推广以运用到一般实际的情形。
    既然建立整棵的搜索树不可能,那么,为当前所面临的局面找出一步好棋如何?也就是通过少量的搜索,为当前局面选择一步较好的走法。

    在通常的棋局当中,一个局面的评估往往并不像输、赢、平3种状态这么简单,在分不出输赢的局面中棋局也有优劣之分。也就是说,要用更细致的方法来刻画局面的优劣,而不是仅仅使用1、-1、0三个数字刻画3种终了局面。假定我们有一个函数可以为每一局面的优劣评分。例如甲胜为+∞:乙胜为-∞:和局为0:其他的情形依据双方剩余棋子的数量及位置评定-∞~+∞之间的具体分数。这样我们可以建立一棵固定深度的搜索树,其叶子节点不必是终了状态,而只是固定深度的最深一层的节点,其值由上述函数评出:对于中间节点,如同前面提到的那样,甲方取子节点的最大值,乙方取子节点的最小值。这个评分的函数称作静态估值函数( Static Evaluation function)。用以取代超出固定深度的搜索。显然,我们无法拥有绝对精确的静态估值函数。否则,只要这个静态估值函数就可以解决所有的棋局了。估值函数给出的只是一个较粗略的评分,在此基础上进行的少量搜索的可靠性,理论上是不如前述的WTN,LOST,DRAW三种状态的博弈树的,但这个方法却是可实现的。利用具体的知识构成评估函数的搜索叫做启发式搜索( Heuristic search)。估值函数在有些文献中也称为启发函数(Heuristic Function)

            在博弈树搜索的文献当中,极大极小方法往往指的是基于静态估值函数的有限深度的极大极小搜索。在将来使用极大极小方法时如无特别说明也是指这种形式

    深度优先搜索( Depth First Search)

    在生成极大极小树并对其进行搜索的方法上,我们面临着多种选则

    1. 是先在内存中生成整棵树然后进行搜索,还是在搜索的过程中仅仅产生将要搜索的节
    2. 对于树的搜索以什么顺序进行,是广度优先( Breadth First Search)深度优先,还是其他顺序?
    3. 有必要生成整棵树吗?在搜索过程中将搜索过的节点删去行吗?

    几乎所有的人在使用基本的极大极小算法时都选择了深度优先搜索方法。这样可以在搜索过程中的任何时候仅仅生成整棵树的一小部分,搜索过的部分被立即删去。显然,这个算法对内存的要求极低,往往在内存只有几千字节的机器上也可以实现。并且同其他的选择相比速度上也并不逊色。

     

    深度优先搜索极大极小树的过程,可以表示为一个递归的形式。

    如图所示的一棵树,共有3层。根节点为A,其子节点有B、C、D三个,而B、C、D也各有子节点若干。以深度优先算法搜索此树时,先进入根节点A,生成其第1个子节点B:然后遍历B,生成B的第1个子节点E;E将其估值返回给父节点B,删掉E,B生成第2个子节点F:F将其估值返回给父节点B,删掉F,B生成第3个子节点G;G将其估值返回给父节点B,删掉G,B在3个叶节点的返回值中取极小值并将此值返回给A, A生成其第2个子节点C:同样遍历C及其子节点,得到C的返回值后再生成D并向下遍历之;最后,A在B、C、D的返回值中取极大值,拥有该极大值的子节点就是下一步要走的方向。

                                                                            

                                                                                       深度优先算法实例

    从上述过程可以看出,深度优先搜索极大极小树的过程中,任何时候只要保存与其层数相同个数的节点。在上例中,任何时刻仅需保存3个节点。仅生成将要搜索的节点,搜索完成的节点可以立即删去以节省空间。
    用伪代码将深度优先搜索集大极小树算法描述如下:(伪代码仅仅是为说明算法,其内容是简略的)。

    代码假定是用于中国象棋

    int MiniMax(position p,int d)
    {
    	int bestvalue,value;
    	if(Game Over)                     //检测棋局是否结束
    		return evaluation(p);         //棋局结束返回估值
    	if(depth <= 0)                   //是否叶子节点
    		return evalueation(p);      //叶子节点,返回估值
    	if(p.color == RED)              //是否轮到红方走棋
    		bestvalue = -INFINITY;     //是,领初始最大值为极小
    	else
    		bestvalue = INFINITY;     //否,令初始最小值为极大
    	for(each possibly move m)    //对每一个可能的走法m
    	{
    		MakeMove(m);                //产生第i个局面(子节点)
    		value = MiniMax(p,d-1);    //递归调用MiniMax向下搜索子节点
    		UnMakeMove(m);        //恢复当前局面
    		if(p.color == RED)
    			bestvalue = max(value,bestvalue);  //取最大值
    		else
    			bestvalue = min(value,bestvalue);  //取最小值
    	}
    		return bestvalue; //返回最大/最小值
    }

     

    负极大值算法( Negamax Algorithm)

    普通的极大极小值算法看起来有一点笨,既然一方试图取极大值而另一方试图取极小值——也就是说——我们总要检査哪一方要取极大值而哪一方又要取极小值,以执行不同的动作。Knth和More在1975年提出了负极大值( Negamax)方法①,消除了两方的差别,而且简洁优雅。使用负极大值方法,博弈双方都取极大值。
                算法如下面的伪代码所示:
               //类C伪代码,负极大值算法

    int NegaMax(position p,int depth)
    {
    	int n,value,bestvalue = -INFINITY; //最大值初始为负无穷
    	if(Game Over(p))
    		return evaluation(p);    //胜负已分,返回估值
    	if(depth == 0)  //叶子节点
    		return evaluation(p);    //调用估值函数,返回估值
    	for(each possibly move m)  //对每一个可能的走法
    	{
    		MakeMove(m);   //产生新节点
    		value = -NegaMax(p,d-1);  //递归搜索子节点
    		unMakemove(m);   //撤销新节点
    		if(value >= bestvalue)
    			bestvalue = value; // 取最大值
    	}
    	return bestvalue;   //返回最大值
    }

     

    可以看出,负极大值算法比极大极小值算法短小并且简单。关键的不同在于

                            value=   -NegaMax( p, d-1)

    注意其中的负号。负极大值算法的核心在于:父节点的值是各子节点的值的负数的极大值。如要这个算法正确运作,还要注意一点额外的东西。例如象棋,估值函数必须对谁走棋敏感,也就是说对于一个该红方走棋的局面返回正的估值的话,则对于一个该黑方走棋的局面返回负的估值

    初看上去,负极大值算法比极大极小值算法稍难理解,但事实上负极大值算法更容易被使用。在算法的原理上,这两种算法完全等效。负极大值算法仅仅是一种更好的表达形式。今天的博弈程序大多采用的也都是基于负极大值形式的搜索算法。本书的例子也不例外。

     

     

    内容来源于:陈其的《PC游戏编程》(人机博弈)

     

     

     

     

     

     

    展开全文
  • 直接贴模板,理解很容易,网上的题解一搜便是。 唉,贴一个大佬吧:... 模板: const double eps = 1e-6; double Calc(double k) { return ...(计算表达式); } double SanFen(double l, double r) {

    直接贴模板,理解很容易,网上的题解一搜便是。

    唉,贴一个大佬吧:http://blog.csdn.net/pi9nc/article/details/9666627


    模板(上凸函数模板):

    const double eps = 1e-6;
    double Calc(double k)
    {
    	return ...(计算表达式);
    }
    double SanFen(double l, double r)
    {
    	double mid, mmid;
    	while(r-l > eps)
    	{
    		mid = (r+l)/2.0;
    		mmid = (mid+r)/2.0;
    		if(Calc(mid) > Calc(mmid)) r = mmid;
    		else l = mid;
    	}
    	return r;
    }


    再给一个模板例题ZOJ-3203

    #include <algorithm>
    #include <iostream>
    #include <string.h>
    #include <cstdio>
    using namespace std;
    const double eps = 1e-6;
    double H, h, D;
    double Calc(double x){
    	double ans = h*x/(H-h);
    	if(ans+x > D){
    		double g = ans+x-D;
    		ans = ans - g + g*(H-h)/x;
    	}
    	return ans;
    }
    double SanFen(double l, double r)
    {
    	double mid, mmid;
    	while(r-l < eps)
    	{
    		mid = (r+l)/2.0;
    		mmid = (mid+r)/2.0;
    		if(Calc(mid) > Calc(mmid)) r = mmid;
    		else l = mid;
    	}
    	return r;
    }
    int main(){
    	int t;
    	cin >> t;
    	while(t--){
    		scanf("%lf %lf %lf", &H, &h, &D);
    		double id = SanFen(0, D);
    		printf("%.3f\n", Calc(id));
    	}
    	return 0;
    }

    继续加油~

    展开全文
  • 极小极大值算法解决比较直观,但是效率太低,即使使用了α-β剪枝,效率仍然很低,勉强ACCEPT, 因为这种方法本质上是深度搜索,会有大量的重复计算,如果像DP那样将计算过的状态记录下来,则还有进一步...
  • NMS——非极大值抑制

    2019-12-22 00:03:01
    极大值抑制(NMS):去除掉与得分最高的目标框IOU值>thresh的目标框,保留与得分最高的目标框IOU值<thresh的目标框; 算法: 输入:dets[x1,y1,x2,y2,score]为框列表 ,thresh为IOU值 1.将所有框按score值...
  • 题意 在一场滑雪比赛中要通过n个门,给出每个门的坐标(xi,yi)(xi,yi)。数据给出w(每个门的宽度),v(水平方向上的最大速度),以及n。...判断只需要更具前后两个旗门的高度差来计算时间,由上一个可达区间推出下
  • NMS非极大值抑制

    2019-04-07 07:17:39
    在计算机视觉中,进行目标检测后得到多个得分高于阈值的目标区域,非极大抑制的作用对这些目标区域去冗余。 在多个目标框中,先按照一定标准进行排序,例如,可以按照目标框的得分从大到排序,同个颜色代表同个...
  • 接着,计算极大值的局部区域强度,动态地实现不同尺度子图像的波分解系数之间的权重分配;最后,将处理后的子图像重建得到融合后的图像.对计算机断层图像和正电子发射断层图像的融合实验证明,所提出的算法既...
  • 极大值抑制-NMS

    2018-07-05 11:33:37
    极大值抑制的方法是:在进行目标检测时会产生很多候选区域1~5号框,而这些候选区域一般会有好多重叠的部分,如图所示,一般先对这些框的概率从大到进行排序,从大到遍历所有框: (1)从最大概率1号矩形框开始,...
  • NMS(non maximum suppression),中文名非极大值抑制,在很多计算机视觉任务中都有广泛应用,如:边缘检测、目标检测等。 非极大值抑制顾名思义就是抑制不是极大值的元素,搜索局部的极大值。这个局部代表的是一...
  • 首先利用二进波分解后高频系数的局部模极大值得到各尺度的图像边缘,然后利用波系数的模极大值抑制噪声,结合子带关联和尺度相关的融合准则对去噪后的边缘进行融合,最后基于边缘重构图像。算法在抑制噪声的同时...
  • 本篇将会看到,我们学习到的计算导数的用武之地。我们第一个应用是导数作为曲线切线斜率的解释。通过这个应用,我们可以快速发现函数最重要的特征并描绘出它的图像。在物理科学中画图是最基本的要求。在经济、生物和...
  • 极大值 抑制,即抑制不是极大值的元素,搜索出局部极大值; 进行目标检测定位一个物体时,可能最终会从一张图片中找出很多个可能是物体的矩形框(假设有6个),这时需要对每个矩形框计算类别分类概率; 我们要...
  • 无约束非线性极小极大问题是最优化数值...得到了计算极大值函数的ε次梯度的数值方法,从而构造出了一种求解极小极大问题的ε-算法,并且证明了算法的收敛性,初步的数值例子表明算法是有效的,且具有大范围收敛的特点。
  • 上图中NMS的计算流程:右上角列出了预测框和每个预测框的分数(boxes和scores)。就是定义一个列表keep存放每次选出的分数最大且阈值(阈值代表两个预测框没重合,也就是框的不是一个对象)的框。step3中选择...
  • 极大值抑制(NMS) 同种类别情况下,对每个候选区域的得分进行从大到排序,取出其中得分最高的。与其他剩余的所有感兴趣区域计算 IoU。将与当前感兴趣区域边框 IoU的值大于设定 IoU 阈值的感兴趣区域边框去除。...
  • 极大极小搜索

    2017-01-12 12:12:14
    然后自下而上地进行搜索计算,奇数层节点取其子节点估值的极小值,偶数层节点取其子节点估值的极大值,一直反推算到根节点。在反推的过程中始终要记住算出该值的子节点是谁,这样就可以得到一个从根节点到叶子节点的...
  • 在管理信息系统(MIS)开发过程中,对MIS软件进行截尾寿命测试,收集其故障数据...应用可靠性统计方法,对寿命服从极小值分布的MIS软件,建立最大似然方程的参数迭代法。给出了各种可靠性指标公式,并用实例计算验证。
  • 无约束非线性极小极大问题是最优化数值计算领域中十分活跃的研究课题...得到了计算极大值函数的ε次梯度的数值方法,从而构造出了一种求解极小极大问题的ε-算法,并且证明了算法的收敛性,初步的数值例子表明算法是有
  • 看例题: ... 蒜头君有nn个玩具要分给n个...现在蒜头君希望将玩具都分下去,但是希望朋友们的喜爱和可以最大,请你帮他计算一下,如何分配可以使得喜爱之和达到最大? 输入格式 输入第一行包含一个正整数n...
  • 目标检测中的一个算法: Non-Maximum Suppression就是需要根据score矩阵和region的坐标信息,从中找到置信度...(2)计算其余bounding box与当前最大score与box的IoU,去除IoU大于设定的阈值的bounding box,保留
  • 从能量的观点出发,将神经网络的优化计算能力与Rayleigh极小值原理相结合得到了求解广义特征值问题的极小值及其对应特征向量的神经网络解法,为神经网络优化计算应用于有限元结构动力分析打下了一个良好的基础。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,107
精华内容 442
关键字:

极大值极小值计算