
C/C++
文章平均质量分 81
九日王朝
技术是谋生的手段,而不是生命的全部。过分沉迷技术只会让人坠入深渊和绝望,人生应该追求的是智慧与认知。
与其劳碌拼搏匆匆过完一生,应该把更多的精力用于了解这个世界,锻造通透豁达的内心。才能得以善终。
展开
-
【v8】一些关于内存泄漏的踏坑
1.Persistent.Reset并非引用v8源码:V8_INLINE Persistent() : PersistentBase<T>(nullptr) {}template <class T>void PersistentBase<T>::Reset() { if (this->IsEmpty()) return; V8::DisposeGlobal(reinterpret_cast<internal::Address*>原创 2020-07-21 09:35:18 · 1530 阅读 · 0 评论 -
C++ 封装DLL遇到的一些坑爹问题与解决方案
一.string类型不兼容这个算是最常见也是最初级的问题了,为了方便跨语言接口调用,如果数据量不是特别大的话,我们可以在封装DLL时选择json串来作为方法的引入参数和返回值,但由于C++的string类型(其实是STL)内存分配器兼容性很滑稽,基本上跨平台调用就一定会出现异常。所以要避免在动态库接口中传递STL容器。解决方案:比较常规的方法是使用char *进行指针传递,但同时有会存...原创 2018-12-13 13:27:45 · 6570 阅读 · 0 评论 -
C++ 遗传学SFLA混合蛙跳算法
蛙跳算法(Shuffled Frog Leading Algorithm)是一种启发式算法,通过启发式函数进行启发式搜索,从而找到组合最优问题的解。他结合了以遗传为基础的memetic算法和以社会行为为基础的粒子群优化算法的优点。也可以说SFLA=SCE+PSO一、问题概念:蛙跳算法的思想是:在一片湿地中生活着一群青蛙。湿地内离散的分布着许多石头,青蛙通过寻找不同的石头进行跳跃去找到食原创 2017-10-20 16:51:53 · 4238 阅读 · 1 评论 -
全排列及相关扩展算法(七)——组合数的字典序(另含全章代码整理)
1.引入概念:要列出一个集合{1,2,3,4}的所有子集是很容易的,我们可以按照二进制数的顺序,0000,0001,0010,0011,0100,0101,0110,0111......来表示我们要取的元素,其中0表示不取,1表示取,这样就获得了一个顺序。而组合也包含在这个顺序当中。我们看从{1,2,3,4}中选取两个元素的所有组合:0000 0001 0010 0011 0100 010原创 2017-08-18 18:24:15 · 1915 阅读 · 0 评论 -
全排列及相关扩展算法(六)——全排列最蛋疼的算法:邻位对换法
1.引入原因:在此之前我们实现全排列本质上都是采用单向交换的思路,当交换到末端便要回溯至上一层面,如果我们采用双向的交换,便可以不断地交换下去,于是产生了邻位对换法。邻位对换法在找下一个排列的方法上在很多情况下要比字典序算法要快上许多,因为每次的下一个排列只是交换两个相邻的元素,当然缺点就是到左端或者右端时要进行找最大可移动数的计算,故最终整体效率也没什么提升,所以称之为最蛋疼的全排列算法。原创 2017-08-18 18:07:43 · 2863 阅读 · 0 评论 -
全排列及相关扩展算法(五)——递增(递减)进位制数求原排列算法
1.引入原因:通过上一章我们意识到通过原始中介数求原排列并不是那么的方便,于是我们延伸出几种新的中介数算法来方便计算原排列。2.递增进位制数法:递增进位制是指数字的进制随着数字位置的不同递增,一般的,最右位的进制为2,向左依次增1。用递增进位制数法改造的中介数即:我们不按照从左到右的顺序排,而是按照数字的大小来排。以上一章{ 7,6,8,3,4,5,1,2 }为例,其原始中介数为{6,5,5,原创 2017-08-17 20:59:52 · 3932 阅读 · 0 评论 -
全排列及相关扩展算法(四)——原始中介数通过逆推求原排列算法
1.中介数逆推原排列:上一章我们讲到了中介数,通过一个排列可以很方便地求数它的中介数,通过中介数也可以很方便地求出排位序号。但是通过中介数逆推原排列就不是那么容易了。因为我们每求一位数,都需要对比其前面所有的数来获取他的定位,以上一章{ 3,4,5,6,7,2,1 }为例,得到的{2,2,2,2,2,1}中介数,第一位我们可以直接得出3,第二位本应也是3,但是考虑前面已经有3了,所以第二位就只能是4,以此类推……即:如果之前存在某排位i小于等于当前排位,那么当前排位所对应的数需要再加上1原创 2017-08-17 10:29:47 · 2018 阅读 · 0 评论 -
全排列及相关扩展算法(三)——利用中介数求排列在字典序排位算法
1.中介数的定义及作用:很多时候,我们要通过一个排列得出它的字典序中的位置(序号),比如1234567应该排在第0位(开始位),1234576应该排在第1位,7654321排在第7!-1=5039位。当然,我们可以通过计算Next_Permutation函数的迭代次数来得到这个数据,但这样时间复杂度最差为O(n!),是非常不划算的,因为我们仅仅要求一个数的位置。所以我们要先从数学的角度去计算这个问原创 2017-08-16 20:46:24 · 3782 阅读 · 0 评论 -
全排列及相关扩展算法(二)——求字典序下一组排列及全排列算法
1.字典序排列的定义:为了便于理解,以数字为例,对于数字1、2、3......n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 12354和12345,排列12345在前,排列12354在后。按照这样的规定,5个数字的所有的排列中最前面的是12345,最后面的是 54321。2.字典序排列解决思路:参考上文中(1,2,3,4)全排列的输出截图最后输原创 2017-08-16 16:33:14 · 1339 阅读 · 0 评论 -
全排列及相关扩展算法(一)——基础的回溯递归实现全排列算法
1.全排列的定义和公式: 从n个数中选取m(m2.时间复杂度: n个数(字符、对象)的全排列一共有n!种,所以全排列算法至少时O(n!)的。如果要对全排列进行输出,那么输出的时间要O(n*n!),因为每一个排列都有n个数据。所以实际上,全排列算法对大型的数据是无法处理的,而一般情况下也不会要求我们去遍历一个大型数据的全排列。3.全排列算法解决思路:假设现有1 2 3 三个数,我们构造全原创 2017-08-16 14:28:22 · 2830 阅读 · 0 评论 -
洛谷OJ上的A+B花(zhuang)式(bi)解法
转眼间快到了8月,一想自己都毕业好久了,很怀念曾经在各大OJ上刷题的时光,今天无意在一个算法群里看到最近有个叫洛谷的oj网站貌似蛮火的,于是注册了一个下进去看一看,顺手打开了A+B problem,然后……作者: Treeloveswater 更新时间: 2017-03-26 15:06 举报终于可以写一份A+B这么难的题的题解了。咦?竟然没有人写LCT的题解?转载 2017-07-28 16:26:40 · 2892 阅读 · 0 评论 -
C++ concurrency::task实现异步编程(Windows)
最近一直在看js、python、lua等脚本语言的异步编程,今天脑子一热突然想看看C++能否也有支持异步的相关类库,上网一搜还真的有microsoft官方文档https://msdn.microsoft.com/library/windows/apps/Hh780559.aspx主要使用task class 及其相关类型和函数,它们都包含在 concurrency 命名空间中且在原创 2017-07-22 15:35:22 · 8426 阅读 · 2 评论 -
Tesseract-ocr实现图像文本识别
Tesseract是一个开源的OCR(Optical Character Recognition,光学字符识别)引擎,可以识别多种格式的图像文件并将其转换成文本,目前已支持60多种语言(包括中文)。 Tesseract最初由HP公司开发,后来由Google接盘填坑。原创 2017-06-20 16:33:04 · 5041 阅读 · 0 评论 -
斗地主AI算法——第十七章の总结整理
2.0版本的斗地主AI算法在这里就算告一段落了。**********************完结撒花**********************不过后续应该还会开发更智能的版本,毕竟当前版本还有很多策略没有加入。比如说角色位置(地主上家下家打法)、比如说记牌算牌、又比如对于一些残局的分析等等。斗地主规则看似简单,实际变幻莫测,也包含一些心理上的博弈。而我想做的AI,不一定要做到最牛原创 2017-04-27 20:50:26 · 10481 阅读 · 7 评论 -
斗地主AI算法——第十六章の样例分析
上一章,我们已经完成了测试模块的开发。至此我们已经可以进行整体测试了。本章主要内容就是随机生成了一些样例并进行分析。实际上整个开发过程绝大部分时间都是用在样例分析上,通过样例给出的返回操作分析自己设计的策略是否合理,然后不断的调整策略,调整权值等等。这个过程持续了蛮久的,而且很多地方都反复的修改,感觉git都快要被我玩坏了。下面具体拿出一组测试数据进行简单的分析发牌原创 2017-04-27 20:12:31 · 6116 阅读 · 0 评论 -
斗地主AI算法——第十五章の测试模块
前面已经完成了整个工程大部分模块,接下来进入整合联调以及模拟测试模块。测试模块主要任务就是代替服务器给出我们需要的数据。因为我们本来的计划是封装成类库通过服务器调用获取,其调用的接口无非就是叫分、被动出牌、主动出牌。被动出牌和主动出牌我们已经完成,叫分我们已经实现了权值的获取,只需要在外面加一个区间划分即可:/*获取叫分函数*/int LandScore(GameSituati原创 2017-04-27 17:48:18 · 5567 阅读 · 5 评论 -
斗地主AI算法——第十四章の主动出牌(3)
上一章已经排除了飞机、三带等牌型,那么除去炸弹王炸以外,我们只剩下单牌、对牌、三牌以及单顺、双顺、三顺了。首先说单牌、对牌、三牌。其逻辑基本一样,只是出牌的个数有差别,即:如果该i牌数量满足这种牌型要求,即先打出,计算其剩余价值。 //出单牌 if (clsHandCardData.value_aHandCardList[i] > 0) { clsHandC原创 2017-04-27 16:42:49 · 6097 阅读 · 7 评论 -
斗地主AI算法——第十三章の主动出牌(2)
上一章我们已经搭好了出牌算法的基本框架,本章主要实现优先处理的三带、飞机等牌型。首先定义一些基本变量: //暂存最佳的价值 HandCardValue BestHandCardValue; BestHandCardValue.NeedRound = 20; BestHandCardValue.SumValue = MinCardsValue; //我们认为不出牌的话会让对手一个轮次原创 2017-04-27 16:26:26 · 5872 阅读 · 0 评论 -
斗地主AI算法——第十二章の主动出牌(1)
本章开始,我们介绍主动出牌的算法,和被动出牌类似,我们第一步把主要架子搭起来。首先清空出牌序列clsHandCardData.ClearPutCardList();主动出牌的策略按照优先级大体可以分为三类:【一】能直接一手牌出去,优先出。【二】两手牌出去且有绝对大牌,先出绝对大牌。【三】出一手牌使得接下来自己手牌价值最大化。首先说【一】:一手牌的原创 2017-04-27 16:04:15 · 8924 阅读 · 6 评论 -
斗地主AI算法——第十一章の被动出牌(5)
本章是被动出牌的最后一章,截止目前,我们已经解决了大部分牌型。只剩下飞机和炸弹了。飞机无疑是最复杂的类型,他等于顺子和三带的结合体,但又增加了很多难度。根据上一章的算法,我们可以大概想到,若是带出去一张我就加一个循环,若是带出去两张我就加俩循环,但是这个飞机长度不一致,带出去的牌个数也就不一致,这TM怎么加啊!!我一开始的想法是外置一个全排列函数,给定count个数,然后列举所有的方案去改原创 2017-04-27 15:12:33 · 7268 阅读 · 2 评论 -
斗地主AI算法——第十章の被动出牌(4)
上一章已经说明了单顺的实现方法,双顺、三不带顺牌型实现方法与单牌基本类似。改动的地方除了上一章说的枚举牌类型,出牌时value_nPutCardList的处理,回溯时value_aHandCardList和nHandCardCount的变化等几个方面,还有length设置的变化,因为双顺的length是count的1/2,三顺是1/3。下面给出完整代码://对连类型 else if (c原创 2017-04-27 14:41:33 · 5062 阅读 · 5 评论 -
斗地主AI算法——第九章の被动出牌(3)
上一章已经说明了被动出牌算法基本的出牌思路,且以单牌为例给出了具体的代码。对牌、三不带牌型实现方法与单牌基本类似。改动的地方主要是枚举牌类型,出牌时value_nPutCardList的处理,回溯时value_aHandCardList和nHandCardCount的变化等几个方面。下面给出完整代码:/对牌类型 else if (clsGameSituation.uctNowCardGr原创 2017-04-27 14:11:07 · 5500 阅读 · 1 评论 -
斗地主AI算法——第八章の被动出牌(2)
上一章我们已经搭好了被动出牌的基本架子,本章我们主要解决面对不同牌型分支的出牌策略问题。在这里我把出牌逻辑分为四个阶段,也就是策略的优先级。分别是:【直接打光手牌】→【同类型牌压制】→【炸弹王炸压制】→【不出】第一阶段【直接打光手牌】就是说如果我们可以一次性把手牌打出,那就不用考虑接下来价值之类的问题了,因为已经赢了。这种情况可能是对方打出的牌型和你一样且你比他大,或者你剩的牌是炸原创 2017-04-27 11:13:09 · 7872 阅读 · 0 评论 -
斗地主AI算法——第七章の被动出牌(1)
哎,之前扯了那么多蛋,重要讲出牌了!本章开始讲被动出牌的逻辑算法。首先我们先把架子搭起来,被动出牌我们肯定是要知道场上目前打出的是什么牌型。在第二章数据结构里我们定义过,游戏全局类里面有一个存放当前牌型结构的成员,即 //当前打出牌的类型数据,被动出牌时玩家根据这里做出筛选 CardGroupData uctNowCardGroup;我们即将通过他进行类型的筛选,所以整个原创 2017-04-26 20:53:05 · 9502 阅读 · 1 评论 -
斗地主AI算法——第六章の牌型判断
本章实现了上一章提到的检查当前是否只是一手牌函数ins_SurCardsType/*检查剩余的牌是否只是一手牌是: 返回手牌类型数据不是:返回错误类型(cgERROR)*/CardGroupData ins_SurCardsType(int arr[]);输入很简单,就是一个状态数组。输出是手牌类型结构//牌型组合数据结构struct CardGr原创 2017-04-26 20:20:45 · 9368 阅读 · 7 评论 -
斗地主AI算法——第五章の总值计算
本章算是比较重点的一章,前一章已经对各个牌型做出了价值定义,本章主要实现计算手牌总价值模块函数。根据之前的思路,我们设定一下输入输出:输入:手牌数据类(主要用手牌个数nHandCardCount以及手牌状态数组clsHandCardData.value_aHandCardList)输出:手牌价值结构 HandCardValue先处理剪枝部分,如果剩下的手牌是一手牌,我们即直原创 2017-04-26 19:48:01 · 11126 阅读 · 9 评论 -
斗地主AI算法——第四章の权值定义
第一章业务逻辑结尾部分我提到了权值的计算方法:①每个单牌都有一个基础价值②组合牌型的整体价值与这个基础价值有关,但显然计算规则不完全一样。③整手牌可以分成若干个组合牌,但分法不唯一。当时,我说了①和②可以直接定义,③需要迭代计算。所以本章的主要内容就是确定基础价值&组合牌型的价值定义对于牌型权值的定义看似简单,实际却需要大量的推敲。这就跟游戏里不同英雄属性、技能反复修改一样原创 2017-04-26 18:04:38 · 14210 阅读 · 6 评论 -
斗地主AI算法——第三章の数据处理
上一章我们定义了基本的数据结构,相信大家看到手牌类里面那么多出牌序列时一定会比较愤慨。。。其实一开始写的时候我也是觉得很脑残,不过后续开发证明了这样的结构还是可以的,因为只要我封装了一层数据转换,接下来所有的算法策略都只用到2个成员变量,状态数据及手牌数量。特别便于调试、管理。那么接下来就写出类成员函数的实现方法//手牌数据类class HandCardData{public:原创 2017-04-26 16:53:29 · 12923 阅读 · 0 评论 -
斗地主AI算法——第二章の数据结构
上一章我们已经确立了进本的业务逻辑处理流程。从本章开始,我们便进入开发阶段。首先就是明确我们都需要哪些数据,且它们以怎样的形式存储。首先从上一章反复提到的手牌权值结构说起,也就是F()的返回值,他包含了两个成员,①手牌总价值②需要打几手牌。//手牌权值结构struct HandCardValue{ int SumValue; //手牌总价值 int Nee原创 2017-04-26 16:00:34 · 20895 阅读 · 1 评论 -
斗地主AI算法——第一章の业务逻辑
转眼间快到了五月,帝都的天气也变的非常梦幻。 时而酷暑炎热,时而狂风席卷。而不管外面如何,我们也只能在办公室里茕茕无依的撸着代码,无可奈何的负着韶华。世界是寂寞的,寂寞到不只是寂寞,而是死一般的寂寞。或许AI就是因此而生吧,因为到了最后,能一直陪伴我们走下去的,或许也就只有程序了。好吧不装逼了,近期在研究skynet服务器框架,里面有斗地主的demo,于是想原创 2017-04-26 15:27:24 · 42806 阅读 · 9 评论 -
protobuf——VC&pb开发(另附vs2017完整工程及vs可编译pb源码)
由于近期研发的项目框架是通过protobuf进行网络通信的,在此之前从未听说过protobuf,上网搜了一下才知道这个东西竟然还蛮火热的原来自己这么孤陋寡闻。。场面一度十分尴尬。。。首先介绍一下protobuf,protobuf是google提供的一个开源序列化框架 ,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多。虽然是二进制数据格式,但并没有因此变得原创 2017-04-11 12:04:18 · 5978 阅读 · 9 评论 -
lua——C/C++lua嵌入式开发
首先介绍一下Lua语言,Lua 是一个小巧的脚本语言,该语言的设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。一:lua定位——C/C++嵌入式脚本语言lua本身就是C写的,所以Lua脚本可以很容易的被C/C++代码调用,也可以反过来调用C/C++的函数lua语法、解释器、执行原理都与python相似唯一差距就是lua没有强大的类库作为支撑,Lua原创 2017-04-01 18:17:10 · 14689 阅读 · 3 评论 -
VS2017——50G超豪华IDE套餐酸爽体验!
遥想当年,VS出2015的时候,那年的九日哥还没有自己的电脑。为了知识,为了技术,九日哥给好几个同学的笔记本都装了VS2015~然后他们就都重装系统了而如今,时光荏苒,微软已经推出了Visual Studio2017,作为一个有情怀的菜逼程序员。九日哥自然要体验一番的。https://www.visualstudio.com/zh-hans/ 下载地址原创 2017-03-31 15:31:48 · 32006 阅读 · 12 评论 -
视频跟踪——meanshift算法
部分内容转载于:http://blog.youkuaiyun.com/google19890102/article/details/51030884http://www.cnblogs.com/liqizhou/archive/2012/05/12/2497220.htmlmeanShift,均值漂移,在聚类、图像平滑、分割、跟踪等方面有着广泛的应用。meanShift这个概念最早原创 2017-01-12 14:57:19 · 1372 阅读 · 0 评论 -
视频跟踪——TLD算法
部分内容转载于http://blog.sina.com.cn/s/blog_4a03c0100101dbcr.htmlhttp://blog.youkuaiyun.com/carson2005/article/details/7647500TLD(Tracking Learning Detector),包括tracking、modeling、detection,其中tracki原创 2017-01-12 14:32:26 · 2916 阅读 · 0 评论 -
视频跟踪——CMT算法
*部分内容转载于http://blog.youkuaiyun.com/songrotek/article/details/47662617CMT,全称是Clustering of Static-Adaptive Correspondences for Deformable Object Tracking主要应用功能为对于物体的视觉跟踪。视频跟踪常见的方法思路可以分为三大类:第一原创 2017-01-12 14:16:03 · 2386 阅读 · 0 评论 -
C++ win32控制台显示月历
事情的起因是前端同事一时性♂起想自己写一个日历控件然后研究了一下逻辑思路我们参考一下win10系统的显示格式从日期数据来说,这是一个6X7的矩阵除了当月的天数以外,头尾还要补齐上月末与下月初的日期。首先,需要确定本月显示的天数,那么第一件事,得判断当前月共有多少天,包括闰年的处理int getdays(int year原创 2017-01-04 17:45:38 · 1335 阅读 · 0 评论 -
BrainFuck——C实现BrainFuck解释器
首先介绍一下吊炸天的语言——BrainFuckBrainfuck是一种极小化的计算机语言,它是由Urban Müller在1993年创建的。由于fuck在英语中是脏话,这种语言有时被称为brainf*ck或brainf**k,甚至被简称为BF这种语言基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一原创 2016-12-27 18:01:33 · 9939 阅读 · 0 评论 -
小顶堆数据结构C/C++代码实现
相比队列和栈,很多人可能对堆的概念比较陌生,下面个给出堆的本质概念一、堆也是一种数据结构,从实际应用意义来说,他是一种最优级别数据永远在第一位的队列,本文皆以最小值为例(小顶堆),即它变相是一种会永远保持最小值先出队的队列。二、堆的本质是一颗完全二叉树,树根永远为整个树的最小值,这也就是实现了①永远保持最小值先出队的队列这样的功能。三、为了便于实现②树根为整个树的最小值,堆中某个节点的原创 2016-12-23 12:11:42 · 5969 阅读 · 0 评论 -
pythonの鉴黄之路(五)——强行解析json串
*以下内容并非正规解决方案,效仿请谨慎。之前有介绍过阿里云的鉴黄API接口http://blog.youkuaiyun.com/sm9sun/article/details/53321888其支持:porn: 黄图检测,ocr:文字识别,illegal: 暴恐敏感识别三个业务其API也很人性的把其返回的json串做出了解析,我们可以直接拿到相应的返回值。而如果想对其做进一步的开发,比如原创 2016-12-02 15:53:43 · 1645 阅读 · 0 评论