精华内容
下载资源
问答
  • 在这里总结下可替代循环的区间成员函数和区间算法; 相比单元素遍历操作,使用区间成员函数的优势在于: 1)更少的函数调用 2)更少的元素移动 3)更少的内存分配 在区间成员函数不适用的情况下也应该使用区间...
  • 论文研究-区间算法简介.pdf, 近年来 ,国际上区间算法运用于计算科学和工程取得了一些显著成果 ,国内也开始了这方面的研究 .区间算法提出初衷是为了提高计算结果的可靠性...
  • JavaScript数组分段区间算法

    千次阅读 2019-04-08 18:27:09
    JavaScript数组分段区间算法

    使用场景

      在数组[ 0, 1, 2, 3, 9, 0, 9, 9 ]中,对照数组[ 0, 2, 3, 8, 9, 10 ],删除其中所有相同的元素。
      常用的方式是嵌套循环,逐个对比判断为true时,使用splice函数逐个删除。这样删除N个元素,就需调用N次splice函数,效率低。
      通过简单分析可看出,原数组中的2, 39, 9是一段连续的元素,所以调用splice时,可获取此区间的“起始”、“结束”索引值,分批删除,减少调用次数。

    代码实现

    简单实现一个数组分段批量删除:

    /**
     * 区间算法,分段批量删除
     * @param a {@link Array}:被执行数组;
     * @param b {@link Array}:对比参照数组;
     */
    function rangeDel(a, b) {
    	if (!a || !a.length || !b || !b.length)
    		return a;
    
    	for (var i = 0, idx = i; i < a.length; i++) {
    		let item = a[i];
    		if (b.indexOf(item) == -1) {
    			if (idx < i) {
    				let m = i - idx;
    				let s = a.splice(i = idx, m);
    				console.log('批量删除:', s);
    			}
    			idx++;      //idx与i同步
    		}
    	}
    	if (idx < a.length) {   //删除末尾元素
    		let s = a.splice(idx, a.length - idx);
    		console.log('批量删除(末尾):', s);
    	}
    	return a;
    }
    

      测试示例:

    let a = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 9, 9 ];
    let b = [ 0, 2, 3, 4, 8, 9, 10 ];
    console.log('结果:', rangeDel(a, b)); //结果: [ 1, 5, 6, 7 ]
    

    升级:#1

      既然是对数组本身进行操作,且改变了原数组,那么可将此方法直接放到Array原型上,以方便实例直接调用。
      另外,某些情况下,不单单是两个不同数组中的元素进行对照删除,还可能是其它判断条件,比如删除所有“奇数”元素。因此可将判断条件设置为自定义函数,获取其返回值即可。

    /**
     * 分段区间算法,删除元素
     * @param arr {@link Array}:对比参照数组;
     * @param pms {@link Object}:非必参,自定义功能;
     *  pms.judge {@link Function}:两个数组以某种条件进行判断,返回{@link Boolean}值;
     *  pms.fn {@link Function}:当pms.judge判断为true时,调用的函数;
     * @return {@link Array}:this改变后的结果。
     * @version V1.0.1
     */
    Array.prototype.rangeDel = function (arr, {
    	judge = v => arr.indexOf(v) == -1,
    	fn = (start, end, dif = end - start + 1) => { start, end, dif }
    } = (pms = {})) {
    	if (!arr || !arr.length || !this.length)
    		return this;
    
    	let splice = (start, end) => {
    		fn(start, end);
    		let items = this.splice(start, end - start + 1);
    		return items;
    	};
    	for (var i = 0, idx = i; i < this.length; i++) {
    		let item = this[i];
    		if (judge(item)) {
    			if (idx < i) {
    				splice(idx, i - 1);
    				i = idx;
    			}
    			idx++;  //judge返回true时,idx与i同步
    		}
    	}
    	if (idx < this.length)  //删除末尾元素
    		splice(idx, this.length - 1);
    	return this;
    };
    

    知识点:rangeDel函数中,形参"pms"为Object类型,使用了“解构”。且解构的每个属性都赋予了默认值。
    因其使用了解构,传入实参时,不能为空(否则会抛异常),故又给"pms"赋予了默认值。

      测试示例:

    let arr1 = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 11 ];
    let arr2 = [ 0, 2, 3, 4, 7, 8, 10, 11, 12, 12 ];
    
    var rs = [ ...arr1 ].rangeDel(arr2);
    console.log(rs);    //[ 1, 5, 6, 9, 13 ]
    
    var rs = [ ...arr1 ].rangeDel(arr2, {
    	judge: v => arr2.indexOf(v) != -1   //自定义判断函数
    });
    console.log(rs);    //[ 0, 2, 3, 4, 7, 8, 10, 11, 11 ]
    

      对比两个测试示例,发现rangeDel函数中形参arr并非关键参数,可有可无。起关键作用的是形参pms中的judge属性,因此可将形参arr删除。


    改造为工具类

      区间算法不只用于进行删除操作,多数为获取数组中符合条件的区间范围,因此可改造为工具类使用。

    /**
     * 分段区间算法:获取区间。
     * @param judge {@link Function}:以某种条件进行判断,返回{@link Boolean}值。接收3个参数function(currentValue, index, arr),用法同Array的"forEach"、"map"函数;
     * @param fn {@link Function}:每获得一个区间,调用此函数;
     * @return {@link Array}:分段区间计算结果([ { start, end }... ])。
     * @version V1.0.1
     */
    Array.prototype.range4 = function (judge, fn = () => {}) {
    	let rs = [];
    	if (!judge || !this.length)
    		return rs;
    
    	let push = (start, end) => {
    		let dif = end - start + 1;
    		let r = { start, end, dif };
    		rs.push(r);
    		fn(start, end, dif, this);	//获得区间后的回调
    		return r;
    	};
    	for (var i = 0, idx = i; i < this.length; i++) {
    		let item = this[i];
    		if (!judge(item, i, this)) {
    			if (idx < i) {
    				push(idx, i - 1);
    				idx = i;
    			}
    			idx++;  //!judge返回true时,idx与i同步
    		}
    	}
    	if (idx < this.length)   //末尾区间
    		push(idx, this.length - 1);
    	return rs;
    };
    

      测试示例:

    let arr = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, '', false, null, 10 ];
    let rs = arr.range4(v => !v);	//获取数组中“无效元素”的所有区间
    console.log(rs);	//[ { start: 0, end: 0, dif: 1 }, { start: 10, end: 12, dif: 3 } ]
    

    使用过程中,如出现bug,或有其它优化建议,欢迎在此文章“评论区”留言讨论,并留下您的邮箱,以便改正后及时通知您。

    展开全文
  • 区间树查找区间算法的实现,VC++实现,自动随机生成区间,查找最小区间和调度区间
  • 多目标Minimax优化问题的区间算法,王娟,曹德欣,研究由Lipschitz连续函数构成的无约束多目标minimax问题. 通过构造目标函数的区间扩张,无解区域的删除原则,建立求解多目标minimax问题
  • 迭代区间算法在路径测试数据生成中的应用
  • 运用区间算法的约束非线性系统鲁棒模型预测控制
  • 一类连续型minimax问题的区间算法,王娟,杨细全,本文在曹德欣[高等学校计算数学学报,2002,24(4):359-365]的基础上研究由一阶连续可微函数构成的连续型minimax问题的区间解法.通过构造目�
  • 约束Min-Max-Min问题的区间算法,陈月霞,,本文给出了一种目标函数和约束函数都是二阶连续可微函数的带约束的离散min-max-min问题的数值解法。利用区间分析方法,构造了max-min函
  • 利用罚函数将无界域二次规划问题转化为无约束优化问题,讨论了罚函数的区间扩张,利用Moore二分法与无解区域的删除原则,给出了求解无界域二次规划问题的区间算法。理论分析和实例计算均表明算法是可靠和有效的。
  • 讨论目标函数为Lipschitz连续函数的无约束整数规划的...通过构造目标函数的区间扩张和无解区域删除检验原则,建立了求解无约束非线性整数规划的区间算法,并进行了数值实验.理论证明和数值实验均表明算法是可靠和有效的.
  • 健康特征量的估计过程是区间估计问题,估计过程遵循区间算法,它适合于处理非线性问题。以一栋新建5层楼房的抗震性能评估为实例,介绍了评估过程中区问量的表示方法及区间评估准则。用第一层层问刚度系数为健康特征...
  • 威尔逊置信区间算法

    万次阅读 2020-03-23 17:26:52
    二项分布计算置信区间有多种计算公式,最常见的是“正太区间”(Normal approximation interval),但它只适用于样本较多的情况(np > 5 且 n(1 − p) > 5),对于小样本,它的准确性很差。Wilson算法正是解决...

    此算法的基础是以用户对某种抉择的二项性为基础,每条可记录的数据都是“0-1”的独立事件,符合泊松分布,于是该类数据很容易归类于二项分布里。二项分布计算置信区间有多种计算公式,最常见的是“正太区间”(Normal approximation interval),但它只适用于样本较多的情况(np > 5 且 n(1 − p) > 5),对于小样本,它的准确性很差。Wilson算法正是解决了小样本的准确性问题,Wilson算法的输入是置信度,输出是置信区间,如果要做数据排序对比,则可以选择置信区间的下限数据。

    S为威尔逊置信区间算法公式,其中n为样本总数,u为正例数,v为反例数,z表示对应某个置信水平的统计量,一般情况下,在95%的置信水平下,z统计量的值为1.96。举个简单例子,给某个人投票,80票赞成,20票反对,则n为100,u为80,v为20。

    正态分布的分位数表:

    算法性质:

    1. 性质:得分S的范围是[0,1),效果:已经归一化,适合排序
    2. 性质:当正例数u为0时,p为0,得分S为0;效果:没有好评,分数最低;
    3. 性质:当负例数v为0时,p为1,退化为1/(1 + z^2 / n),得分S永远小于1;效果:分数具有永久可比性;
    4. 性质:当p不变时,n越大,分子减少速度小于分母减少速度,得分S越多,反之亦然;效果:好评率p相同,实例总数n越多,得分S越多;
    5. 性质:当n趋于无穷大时,退化为p,得分S由p决定;效果:当评论总数n越多时,好评率p带给得分S的提升越明显;
    6. 性质:当分位数z越大时,总数n越重要,好评率p越不重要,反之亦然;效果:z越大,评论总数n越重要,区分度低;z越小,好评率p越重要;

    Python代码实现:

    def wilson_score(pos, total, p_z=0.8):
        """
        威尔逊得分计算函数
        :param pos: 正例数
        :param total: 总数
        :param p_z: 正太分布的分位数
        :return: 威尔逊得分
        """
        pos_rat = pos * 1. / total * 1.  # 正例比率
        score = (pos_rat + (np.square(p_z) / (2. * total))
                 - ((p_z / (2. * total)) * np.sqrt(4. * total * (1. - pos_rat) * pos_rat + np.square(p_z)))) / \
        (1. + np.square(p_z) / total)
        return score

    应用测试:

    展开全文
  • 区间分析,又称区间数学,是一门用区间变量代替点变量进行运算的数学分支,本书主要介绍了用区间分析方法求解非线性方程的方法
  • 一个区间映射到另外一个区间算法

    万次阅读 多人点赞 2017-03-14 23:03:54
    映射算法思想:计算出N区间长度除以O区间长度,得出O区间上单位长度对应于N区间上的大小,再将O区间上每个数减去O区间最小值后乘以单位区间对应的长度,最后加上N区间的最小值,实现投射到N区间上。数学模型如下:


    将[Omin,Omax]上每个数映射到区间[Nmin,Nmax]上。映射算法思想:计算出N区间长度除以O区间长度,得出O区间上单位长度对应于N区间上的大小,再将O区间上每个数减去O区间最小值后乘以单位区间对应的长度,最后加上N区间的最小值,实现投射到N区间上。数学模型如下:


    展开全文
  • 本文的目的提供了不同的Weibull几何(WG)分布估计算法,具体取决于渐进式II型审查样本计划,空间上参数的联合置信区间。 讨论了参数的近似联合置信区间,近似置信区间和置信度的百分数自举区间,并提出了几种...
  • 针对不可微方程组—绝对值方程Ax B|x|=b的数值解问题进行研究, 提出了通过构造极大熵函数和新的区间算子对方程进行求解的区间极大熵算法。该算法能同时求出绝对值方程的近似解和估算其近似解的误差限, 并在A的奇异值...
  • 针对不可微方程组―绝对值方程Ax+B|x|=b的数值解问题进行研究, 提出了通过构造极大熵函数和新的区间算子对方程进行求解的区间极大熵算法。该算法能同时求出绝对值方程的近似解和估算其近似解的误差限, 并在A的奇异值...
  • 上限置信度区间算法(UCT)

    千次阅读 2020-04-25 03:56:42
    算法来源文章《Bandit based Monte-Carlo Planning》,06年的ECML。建议想做游戏人机玩家的同学看看。 1.多臂老虎机 多臂老虎机问题,简单来说,我有很多个老虎机,虽然都是老虎机但它们的中奖率采取的是不同的概率...

    算法来源文章《Bandit based Monte-Carlo Planning》,06年的ECML。建议想做游戏人机玩家的同学看看。相关的算法还有最大最小算法,alpha-beta算法等,而这些算法普遍存在不收敛,和应对超大搜索空间不足的问题。

    1.多臂老虎机

    多臂老虎机问题,简单来说,我有很多个老虎机,虽然都是老虎机但它们的中奖率采取的是不同的概率分布,现在我希望在有限次的摇臂过程中,获得最大的收益,我该怎么做呢?
    最简单的想法肯定是,我对每一个老虎机都摇N次,根据大数定律,频率最终会等于概率。然后我就一个劲的去摇那个中奖概率最高的老虎机不就行了吗?
    想法很好,但是实际上不可能给你那么多机会。那么多臂老虎机,本质上就是,在一个解空间中搜索最优解的过程,我们要找到一组选择序列,这个序列可以让我们收益最大化。

    Monte-Carlo Planning

    蒙特卡洛的算法有很多,最熟悉的恐怕就是通过正方形内切圆,根据采样去计算π。蒙特卡洛算法有一个特点,就是抽样(或者说搜索)越多,那么我们获得最优解的可能性就越高。
    以下就是蒙特卡洛搜索算法的伪代码。
    在这里插入图片描述
    我们可以看到,这种搜索算法本质上就是启发式搜索,一种沿着子节点递归的一个过程。
    1.在实际运行中,若子节点非常多的时候,它会采取一种选择策略(均匀采样)从所有可能的actions(因为action非常多,所以不能一一遍历,只能选择部分)中,选出部分candidate actions。
    2.在candidate actions中,为了选出能带来最大收益的action,它必须对action进行一个一一评估的过程,即求 R e w a r d ( v i ) Reward(v_i) Reward(vi)
    3.但是求 R e w a r d ( v i ) Reward(v_i) Reward(vi),不是仅仅只考虑当前所选择的action,还要考虑选择了这个action之后,当前的state会到一个什么样的新状态,这个新状态又会带给我们多大的未来收益呢?
    4.选择一个能够给我们带来未来最大收益即红利(ps:不是当前最大收益)的action,作为我们的最终选择。然后递归1~4的步骤。

    首先,如果这里我们选择了当前最大收益的action作为我们下一步的话。这个搜索算法就退化为了贪心的算法,首先贪心的算法很容易早熟,而且不容易求的最优解。而蒙特卡洛法呢,通俗来说,就是我们下棋过程中的一步看三招,启发因子是action未来可以带给我们的最大收益。而伪代码中的depth就可以理解为,这个未来是有多远,depth越深看的越远,但是算法复杂度也指数上升。
    这个搜索算法因此完全符合蒙特卡洛性质,通过随机地,递归地选择candidate action,来找到最大红利,来获取近似的最优解

    UCT

    UCT是一个基于UCB和蒙特卡洛的改进版本的搜索算法。
    蒙特卡洛搜索选择下一个臂,存在的问题

    1. 选择下一个臂,只基于当前臂的评估表现,而不考虑之前此臂的表现,和这个臂被拉的次数
    2. 蒙特卡洛搜索,面对臂数特别多的情况下,搜索具有很强的随机性
    3. 蒙特卡洛搜索不使用超参,这意味着我们不能给模型一个先验条件。
      此外还有一点,蒙特卡洛算法在选择candidate actions,是随机挑选的在这里插入图片描述
      挑选的节点服从均匀分布,所以说蒙特卡洛在选择candidate actions集合的时候,具有很强的随机性。而当action非常多的时候,少量的actions中很难找到更优的解。

    UCT的改进之处:

    1. 选择下一个臂:
      I t = arg ⁡ max ⁡ i ∈ { 1 , . . . , k } { X ˉ i , T i ( t − 1 ) + c t − 1 , T i ( t − 1 ) } I_t = \mathop{\arg\max_{i\in\{1,...,k\}}}\{{\bar{X}_{i,T_i(t-1)} + c_{t-1,T_i(t-1)}}\} It=argi{1,...,k}max{Xˉi,Ti(t1)+ct1,Ti(t1)}
      这里 X ˉ i , T i ( t − 1 ) \bar{X}_{i,T_i(t-1)} Xˉi,Ti(t1)是过去i这个臂带来的平均红利,如此我们可以参考此臂之前的表现,而不是当前此臂的带来红利。除此之外,我们只需要选一个臂,而不是以前的candidate actions集合。这在应对大规模搜索的时候,非常有效。
    2. c t , s = 2 C p ln ⁡ t s c_{t,s}=2C_p\sqrt{\frac{\ln t}{s}} ct,s=2Cpslnt
      这里 C p C_p Cp是一个超参,可以是我们在exploitexplore之间进行调整,如果设为0,此算法直接退化为一个贪心算法,贪心度量为过去平均表现最好的臂,如此会很快收敛,而且也找不到更优解。其次 t t t s s s分别代表,臂i被选中的次数,和一共选臂的总数。即臂i在过去被选中的次数越多 c t , s c_{t,s} ct,s越小。
      P ( X i s ˉ ≥ μ i + c t , s ) ≤ t − 4 \mathbb{\Rho}(\bar{X_{is}}\ge\mu_i+c_{t,s})\le t^{-4} P(Xisˉμi+ct,s)t4
      P ( X i s ˉ ≤ μ i + c t , s ) ≥ t − 4 \mathbb{\Rho}(\bar{X_{is}}\le\mu_i+c_{t,s})\ge t^{-4} P(Xisˉμi+ct,s)t4
      至此我们可以看到 X ˉ i , T i ( t − 1 ) + c t − 1 , T i ( t − 1 ) \bar{X}_{i,T_i(t-1)} + c_{t-1,T_i(t-1)} Xˉi,Ti(t1)+ct1,Ti(t1)计算的就是一个 X ˉ \bar{X} Xˉ的最大上限区间。如若臂i在过去被选中的次数多,则我们对 X ˉ \bar{X} Xˉ比较确信,所以置信区间窄,所以最大置信度区间上限相对小。如若臂i在过去被选中的次数少,则我们对 X ˉ \bar{X} Xˉ不确信,所以置信区间宽,所以最大置信度区间上限相对大,更容易选中。所以UCT算法给予过去表现不好的臂,一定几率翻身的机会。
    3. UCT 改进之后的特点:
      1. 综合考虑了过去的拉臂带来的影响。比如,过去拉臂次数多且收益多的臂,置信度上限区间会很大,很容易被再次选中。
      2. 通过Cp超参数,可以调整模型在“探索”和“采用”之间的平衡,避免模型早熟。
      3. 比起蒙特卡洛搜索算法,只用搜一个节点的子空间,不用再搜索其它节点的子空间,搜索效率上获得了很大的提高。
        UCT 实验结果:
        在这里插入图片描述UCT可以在更快的迭代次数内收敛到目标错误率,而MMMC,和MC不能收敛。
    展开全文
  • 都是针对已序区间执行的算法。 binary_search() 判断某区间内是否包含某个元素 includes() 判断某区间内的每一个元素是否都涵盖于另一区间中 lower_bound() 搜索第一个"大于等于给定值"的...
  • 在已序区间中搜寻某元素 检查某个元素是否存在 bool binary_search(beg,end,const T& value) bool binary_search(beg,end,const T& value,op) (1)两种形式都用来判断已序区间[beg,end)中是否包含“和...
  • 区间合并算法

    千次阅读 2019-04-16 00:56:19
    区间合并算法 问题:对输入的区间如[1,2][2,6][3,5][7,9]进行合并,输出[1,6][7,9] 思路1:如果数据较小,可开辟一大数组,如上述数据,开辟一个大小为100的布尔型数组对在区间内的赋值true。扫描输出为true的数字。...
  • 算法导论,在红黑树的基础上扩张出区间树的数据结构,并且构造区间树的重叠区间查找算法
  • 讨论了目标函数为一阶连续可微的无约束连续型minimax问题的区间算法.利用连续型极大熵函数和区间斜率法,通过建立区间扩张和无解区域删除检验原则,构造了求解连续型minimax问题的区间斜率算法,证明了算法的收敛性...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 222,212
精华内容 88,884
关键字:

区间算法