[题解]异或三角形|2021蓝桥杯国赛|xor triangle
此文使用了mathjax,请等待公式加载 这是2021年蓝桥杯国赛A组C++的一道题目。
当时没有来得及写暴力对拍,只是测了示例过了,也就是说不确定是否正确。
此文使用了mathjax,请等待公式加载 这是2021年蓝桥杯国赛A组C++的一道题目。
当时没有来得及写暴力对拍,只是测了示例过了,也就是说不确定是否正确。
本文所指AI,仅包括ChatGPT(GPT3.5),Copilot以及文心一言。其他模型没有进行尝试。
用AI写代码在过去的一年中可能已经很常见了,不过我则是几乎没有使用过。这一周为了迁移代码从Python到C++,可是和AI斗法废了一番功夫。
先介绍一下背景吧,毕设涉及到了汽车的图像识别,考虑各种情况最后选择了intel的神经计算棒加速,自然也就用了OpenVINO。因为我负责的是项目其他部分,所以并没有在意这个部分,直到我们的Python版本测试效果不错,需要合入C++版本的时候,“噩梦”才开始了。
因为之前在RoboMaster时有干过Python转C++的活,干的也是Opencv的东西。所以一开始听说转换有问题的时候,觉得我应该能搞定,就跟着一起搞,觉得opencv的api在cpp和python上基本一样,一行行照抄改不就是了。然后就发现遇到了问题,有这样一行代码:image = image.transpose((2, 0, 1))用于对opencv读到的图片进行维度转换以符合模型的输入要求,然而当我去查opencv的api时,发现opencv的transpose并不长这样,只有一个输入和输出。搜索后发现,这里是用了numpy的函数进行了转换。可是cpp没有numpy啊,为了一个这个功能再搞eigen?好像也不合适。此时cpp的代码已经写好了可以编译运行,只是模型结果和python的不一样,识别不出车子来。于是去看cpp代码是怎么写的,发现是cvtColor,emm?于是队友就开始问了AI,给出的方案是手动三重循环转换,copy进代码跑,发现还是不行。于是反复循环问ai,copy进代码,发现不行。我也试了copilot的翻译代码功能到cpp,结果照样不行。反复尝试换模型(FP32,FP16),修改遍历顺序,修改不同的api,都不行。
我于是尝试搞到自己电脑上跑。原来的编译是直接g++跑,但是换了环境之后自然是跑不了了,再加上其他部分代码都是cmake编译的,便尝试搞成cmake,弄了好久搞定了,在编译时会提示使用了2024要被废弃(如废)的框架。于是我想到不如用新框架也许能更好写,便问了队友初始的python代码是从哪个文档里面学来的,得知也是AI生成的。
我想着AI只能出旧框架,那我要不上网搜索有没有新框架。于是花了可能就一分钟就找到了知乎上的文章,然后照着抄,抄的时候看到文章里面的转换,感觉和我们的代码一样,可能还是不行的时候,突然反应过来不一样的地方:之前的尝试,都只是在改模型部分的类型在各种变化,但是Mat读的时候,一直是at成float读的,但是我们的图片读进来是int啊,到原来代码里面一改,模型输出正确了。
唉,与其去搞AI问答,不如当初就直接搜索引擎搜索,早解决了。看起来C++开发暂时还是不会被AI取代的,需要的各类信息比Python一类的代码多得多。
最近发现了一个感觉有点反常识的数学估算情况。假设现在我们知道了\(\frac{52}{100} = 0.52\),想计算\(\frac{(52+1)}{(100+1)}\)。我一开始的想法是,分母基本没变,分子加了1,所以增加了略小于\(\frac{1}{100}=0.01\)的值。实际上\(\frac{53}{101}\)差不多是0.00524752,也就是只增加了\(0.01\)作为估算值的一半不到,误差很大。
另外一个估算方法是,原来是100的52份,现在我又加了一份,所以是加了原来分数的\(\frac{1}{52}\),差不多是增加了百分之2,原来是\(\frac{52}{100}\),差不多是百分之50,那么增加的就是百分之2个百分之50,增加了1个百分点(0.01),也是这样。
我发出去后得到了一些反馈(摘录已获得授权),一位朋友说 > 分子增加了1,增加的是原来的1/52 分母增加了1,增加的是原来的1/100 (1/52)/(1/100)=1.923就是原来的倒数 用1<<100不太合适,因为增量比率的比值是差不多是2,显然不符合“远大于”的定义
也有一位同学说
分子变化造成的比例影响:约+2% 分母变化造成的比例影响:约-1% 故总影响:+1%(比例影响) 数值在0.5左右,所以数值影响在0.5%左右
我还是想知道可以怎么样地估算呢,于是我尝试算一下增加值的表达式 \(\frac{x+1}{y+1} - \frac{x}{y} = \frac{y(x+1) - x(y+1)}{y(y+1)} = \frac{xy + y - xy - x}{y^2 + y} = \frac{y-x}{y^2+y}\) 这里忽略一次项的\(y\),那么我们就可以得到一个估算方法,分母减分子的差与分母作商。我们带入一下可以得到0.48,与实际值接近。
我们也可以从比值的角度算一下 \(\frac{x+1}{y+1} \div \frac{x}{y} = \frac{x+1}{y+1} \frac{y}{x} = \frac{x+1}{x} \frac{y}{y+1} = (1+ \frac{1}{x}) - (1 - \frac{1}{y+1})\) 从而我们知道 \((\frac{x+1}{y+1} - \frac{x}{y})\div \frac{x}{y} = (1+ \frac{1}{x}) - (1 - \frac{1}{y+1}) - 1 = \frac{1}{x} - \frac{1}{y+1} - \frac{1}{x(y+1)}\approx \frac{1}{x} - \frac{1}{y+1}\) 忽略掉分母里面的高次项。或者如果这里不够明显的话计算下去\(\frac{1}{x}(1 - \frac{1}{y+1}) -\frac{1}{y+1} =\frac{1}{x}(\frac{y}{y+1}) - \frac{1}{y+1}\)这里我们估算\(\frac{y}{y+1}\) 为1可以得到一样的结果。 这样带入\(x\approx 50,y=100\)得到\(\frac{1}{50} - \frac{1}{100} = \frac{1}{100}\)也就是说增加值是原值的百分之一,也和真实值接近。
那么为什么一开始的两个估算法不对呢?和后面计算出来的式子,进行比较,发现我们的估算在一开始是算了分子变化的影响略去了分母变化的影响而在这里分母的变化很大。分母增加一后会让前面的52份都变小,虽然每份都不大,但是加起来却是不可以省略的。
收到了一封邮件。 五年了啊,算上加入之前的时间,可能已经快六年了。记得刚开始建站的时候,只是看到其他人有题解发在博客上,想着自己做的那些题,有些想法好像也是网上题解没有的,发出来分享记录一下。但其实好像也没有写出来什么,毕竟建站的时候基本已经不大oi竞赛了。 一开始只是网上搜有什么免费的路子,开始在github上面搭网站,之后想着做更多的东西,就自己搞了一个服务器开始搭。那时候还什么都不懂呢,就在网上其他人发的内容里面抄抄改改。服务器系统也不懂。记得一开始在oi里面接触Linux的时候,我还想着这些cdls的真复杂啊,没想到建站过程中用的越来越多居然轻松记住了。 那时候也不懂nginx,网上找到配置开始各种改勉强跑了起来,后面又知道了https,又是一堆代码的摘抄,当然现在我也没搞明白换caddy了。那时候也不懂git,也就是网上找到了hook代码,让服务器接收到推送之后自动复制到网站目录下,当然之后我也没用过hook了。也搞了cloudflare,逐渐学习互联网的构成,开始dns配置,搞缓存,防火墙。 我一开始找到的是hexo,没想到这就用下来了。为了做个性化,我又靠着自己那点c++的知识开始用js改,还有操作html和css,确实很难理解啊,属性太多了。也要处理npm的一堆包,更新后的各种变动,更换那些不维护的组件,东西逐渐多了起来。 上大学之后,反而操作变少了,也没再折腾什么一直拿着原来的框架跑,只是在平常的学习中,那些以前积累的东西倒是帮助了不少,用linux时候不用再手忙脚乱了。五年前我基本都是从开源社区拿东西,却好像没有给过什么,现在我逐渐也能写一点代码送回去了。 十年这就过去了一半。当时我想着,十年好久啊,要等到我高考结束,大学本科毕业,现在不知不觉居然就已经过去了。有时候我想,如果我是小说中的人物,我是已经出场了还是已经退幕了呢? 但,来年的事情,谁知道呢?

这里只是记录一下安装和使用的过程,考虑到OpenClaw在快速迭代,可能在未来文章中提到的问题会被解决。
前段时间从ClawdBot改名到最后确定为OpenClaw,又有什么私人AI,安全问题,Mac Mini抢购之类的新闻,一个周末就爆发出来了,于是想着自己也跑一下。目前大致跑了起来了,看到相关的个人安装教程不多,官方的又自然不能适配各种情况,于是想着自己写一下回馈社区,毕竟自己搭博客等等的时候也是看了许多前面的安装经验的。
考虑到LLM的执行的不稳定性和已经确认的风险,不打算在本地跑,而是在远程VPS上面跑。看概念上说,如果是调取远程的API,服务器本身的性能没有那么重要,差不多有性能能跑起来就行了,于是直接在vultr上面就选了最便宜的版本,这里就遇到了第一个坑了。虽然运行没什么资源要求,使用官方的安装脚本的话,对内存还是有不少要求的,会出现内存问题无法安装,感觉是可以远程本地搞好之后再传到服务器上面,不过我对于nodejs不是很熟悉,所以就放弃了而是转成用我之前在香港的机器去安装。安装完之后看运行时的占用,是非常低的,感觉最低配的服务器也能跑起来的。
因为只是玩玩,没打算在上面投入什么,就打算用OpenRouter,这个上面,结果又遇到了第二个坑了。OpenRouter有一个auto的模式自动路由到合适的模型上,也有一个free的版本路由到free的模型上面去。但是,这两个名字输到openclaw的配置里面都不行,考虑到提供商的名字问题,尝试了openrouter/openrouter/free
和 openrouter/free
都不行,一直提示Unknown model。然后想着是不是路由模型有不一样的格式导致OpenClaw无法识别,于是找到deepseek的一个标着free的模型填进去,也不行。最后发现好像OpenClaw支持的模型名字是固定的,只能是在配置列表里面的名字才可以,有些新的模型名字是没有的,所以到配置列表里面选了一个free的模型。但是还有问题,提示404 No endpoints found matching your data policy (Free model publication),按照指示在OpenRouter里面设置接受一些隐私相关的内容,才跑起来了。看起来还可以。
看介绍OpenClaw是支持ChatGPT和Claude的订阅的,Claude的部分是学校的授权,没有code的部分的授权,但是ChatGPT的部分是有codex的,但是没办法用提示受限,不知道是不是因为在服务器在香港的缘故,后面可能会加个代理出去看看能不能用,毕竟免费的API的模型选择和频率限制还是蛮多的。
关于设置方面,有一个Web UI的界面,可以localhost上面访问,但是因为我是在远程服务器上面跑的,所以自然不能localhost访问而是要实际ip地址访问,在服务器里面开放了端口和在运营商的安全组配置端口之后,还是无法访问,看起来是对于非本机的访问做了限制的,这方面安全风险还好。如果想要访问的话,按照官网上的ssh的端口绑定就可以了,之后在本地服务器localhost可以直接访问了。
在通讯软件配置上面,我选了Telgram,按指引一步一步走没遇到什么问题,就不多说了。
目前虽然跑起来对了,但是很多相关的skills之类的配置还没搞,应该会继续完善,后面可能再写一篇相关的设置。
写了一些之前做虚拟主播的过程,得到了一些反馈,根据反馈又做了一些调整,做了一些改变,现在来写一下调整后的情况。
一些反馈说皮套颜色不太好,太像灭霸了,所以修改了一下颜色,现在不知道大家觉得会不会好一点呢?我自己有一些色弱,对于色彩科学相关的了解也不多,也就是看着感觉改了一些,不一定好,大家有好的建议也可以提出来。
之前以为必须要虚拟一个麦克风出来作为OBS和虚拟机之间的中介,后来发现好像不需要,直接连线把OBS的输出连到虚拟机输入上面就可以了。至少我Pipewire没什么问题。
原来的OBS是在Flatpak上面的包,但是感觉附加插件不是很支持,遇到了一些问题,然后转成了snap上面的包,然后装了一个显示鼠标的插件。同时snap包自己还带了一个VST的变声模块,我不怎么会用,就改了一下pitch,好处是不需要再担心linux的音频问题了,直接obs内部就处理好了。
试了一些集成方案,现在自己用上游的whisper.cpp的项目跑,但是whisper的模型不太好设置简体和繁体,网上的方案是prompt上面写,可惜自带的stream代码不能处理prompt,只能自己改了一改,发现自己好久不写C++已经有些生疏了。
解释一下为什么不接入LLM。目前没有在直播上面太盈利的打算,所以不会挂机直播。我真人回复就可以了,还达不到需要LLM回复的地步。
这不是一个常规的虚拟直播需求,而是有一些怪异点的需求(Linux&直播pk&3d皮&免费&变声),所以实现得很别扭,如果你是普通用户,可能和你关系不大。
一直想着做虚拟形象来直播,遇到了蛮多的状况的,有一些网上也没有搜到的,这里写出来和大家分享一下。
皮套有3D和2D两种的,可以使用不同的软件绘制。这里我是用来steam上面的VRoid Studio来画的,目前可以用proton兼容层跑,做出来.vrm的模型格式。我是在默认给的皮上面随便改了改,有更高要求的可以尝试一下自己搞,或者找人搞。画出来的皮套保存在本地,之后动捕软件需要读取这个皮套。
虽然有一些软件是直接完成从摄像头捕捉到生成整个画面的过程,一些工具链会按2个部分单独完成,中间的结构图像是LLVM的IR。
动捕是需要读取摄像头的话画面,识别其中的人脸(以及肢体)画面并转换为抽象的结构图。有一些软件可以从iPhone等设备上拍,但是鉴于我没有,所以就用了笔记本上面的。在软件上有OpenSeeFace,这个是用python写的脚本,可以纯CPU识别。
在获得了动捕软件的结构图之后,这一部分需要把机构图绑定到皮套的骨骼上面,并同时渲染场景光照等内容。这部分是比较麻烦的,很多软件在这里会间或出现渲染的问题,可能和环境有关系,毕竟Linux下的很乱。
我大致跑下来有这几种方案。
使用OBS捕捉生成的画面然后填写rtmp推出去就行了。如果是绿幕的皮套配上一个色度键就可以了,比较简单,OBS在Linux上面没什么大问题。但是声音问题比较大,Linux的音频系统叠岭层峦的,再加上我想要变声,目前比较无解。我自己放弃监听,直接麦克风导入输出出去。变声的软件还没搞定,试了好几只方案都不是太好。
如果是OBS推流B站的话是没法使用各种互动功能的,必须使用b站的直播姬。有浏览器版本但是功能不全,不能用,所以只能想办法用win版本的。
设置OBS虚拟摄像头,然后让直播姬直接捕捉摄像头画面输出出去。或者可以自己设置一个服务器一边推一边拉,延迟比较大,但是因为是基于网络的,相对来说问题少一点,只要能配得明白网络。
1.
wine套上直播姬。在bottles里面尝试了很多配置最后能进去,但是不稳定,重启以后可能就不行了,需要再配来配去。导入的摄像头画面有问题,不确定是什么原因,可能和分辨率有关系。
2.
KVM上Windows,之后打开直播姬。问题是KVM没法捕捉/dev/video流,只能USB重定向,故对于虚拟摄像头不管用。在网上看到好像有新的patch可以导入,但是没搜到太多的使用的文档,还没试过。
3.
VirtualBox开Windows,使用增强功能包之后可以导入摄像头。目前在使用这个方案。
开了服务器挂上了biliup,另外开了一个号上传录播。 见 https://space.bilibili.com/3546737394321661
Linus_Nvidia.jpg