用遗传算法求平方根倒数速算法中的魔法常数,应该咋做
这个平方根倒数快速算法在输入比较大时误差较小,在数据小时误差大。0x5f375a86这个常数在原算法的适用范围是图形向量计算,数据一般不会超过100,所以推荐题主对2000以下的数据再进行计算。
■网友
【用遗传算法求平方根倒数速算法中的魔法常数,应该咋做】 我是题主,我的代码是这样的#include\u0026lt;iostream\u0026gt;#include\u0026lt;cmath\u0026gt;#include\u0026lt;ctime\u0026gt;#include\u0026lt;cstdlib\u0026gt;#include\u0026lt;algorithm\u0026gt;#include\u0026lt;vector\u0026gt;#include\u0026lt;iomanip\u0026gt;using namespace std;float InvSqrt(float x, int param) {\tfloat xhalf = 0.5f*x;\tint i = *(int*)\u0026amp;x;\ti = param - (i \u0026gt;\u0026gt; 1);\tx = *(float*)\u0026amp;i;\tx = x * (1.5f - xhalf *x*x);\treturn x;}double score(int param, float num) {\tfloat ret = InvSqrt(num, param);\tdouble relSqrt = 1 / sqrt((double)num);\treturn abs(ret - relSqrt) / (double)relSqrt;}double random() {\treturn rand() / (double)RAND_MAX;}struct Chromosome {\tint value;\tdouble score;\tbool scoreAvailable;\tChromosome(int v):value(v),scoreAvailable(false) {}\tChromosome(const Chromosome\u0026amp; r) {\t\tvalue = https://www.zhihu.com/api/v4/questions/66458413/r.value;/t/tscore = r.score;/t/tscoreAvailable = r.scoreAvailable;/t}};Chromosome/u0026amp; roulette(vector/u0026lt;Chromosome/u0026gt;/u0026amp; values) {/tdouble* proList = new double;/tproList = values.score;/tfor (int i = 1; i /u0026lt; (int)values.size(); i++){/t/tproList = values.score + proList;/t}/tdouble sum = proList;/tChromosome* ret = nullptr;/tdouble randDouble = random();/tfor (int i = 0; i /u0026lt; values.size(); i++) {/t/tif (randDouble /u0026lt;= (proList/sum) ) {/t/t/tret = /u0026amp;values;/t/t/tbreak;/t/t}/t}/tdelete proList;/treturn *ret;}void addScore(vector/u0026lt;Chromosome/u0026gt;/u0026amp; values) {/tfor (auto/u0026amp; x : values) {/t/tif (!x.scoreAvailable ) {/t/t/tx.scoreAvailable = true;/t/t/tdouble sumScore = 0;/t/t/tfor (int i = 4000; i /u0026lt; 5000; i++) {/t/t/t/tfloat test = i * 0.5;/t/t/t/tdouble cScore = 1.0 - score(x.value, test);/t/t/t/tif ((!isnormal(cScore)) || (cScore /u0026lt;= 0)) {/t/t/t/t/tx.score = -1;/t/t/t/t/tcontinue;/t/t/t/t}/t/t/t/tsumScore += cScore;/t/t/t}/t/t/tx.score = sumScore / 1000;/t/t}/t}}bool sort_by_score(Chromosome/u0026amp; a,Chromosome/u0026amp;b) {/treturn a.score /u0026gt; b.score;}int main(){/tsrand(time(0));/tvector/u0026lt;Chromosome/u0026gt; currentGenerate;/tfor (int i = 0; i /u0026lt; 100; i++) {/t/tint rand = 0x50000000 + (0xFFFFFFF)*random();/t/tcurrentGenerate.push_back(rand);/t}/tcurrentGenerate.push_back(0x5f375a86);/tint genCount = 0;/tint genStep = 100;/tint totalGenCount = 99999999;/twhile (totalGenCount--) {/t/tgenCount++;/t/tvector/u0026lt;Chromosome/u0026gt; childs;/t/tfor (int i = 0; i /u0026lt; 300; i++) {/t/t/tChromosome/u0026amp; mom = roulette(currentGenerate);/t/t/tChromosome/u0026amp; dad = roulette(currentGenerate);/t/t/tChromosome child((int)(((long long)mom.value+(long long)dad.value)/(long long)2));/t/t/tif (random() /u0026lt;= 0.9) {/t/t/t/tint r = (0xFFFFFFF*(1/pow(2,genCount/100)) * random());/t/t/t/tif (r /u0026lt;= 10)r = random() * 10;/t/t/t/tchild.value += (random()/u0026gt;=0.5?r:-r);\t\t\t}\t\t\tchilds.push_back(child);\t\t}\t\tfor (auto\u0026amp; child : childs) {\t\t\tcurrentGenerate.push_back(child);\t\t}\t\taddScore(currentGenerate);\t\tsort(currentGenerate.begin(), currentGenerate.end(), sort_by_score);\t\twhile (currentGenerate.size() \u0026gt;= 200) {\t\t\tcurrentGenerate.pop_back();\t\t}\t\twhile (currentGenerate.score \u0026lt;= 0) {\t\t\tcurrentGenerate.pop_back();\t\t}\t\tif (genCount % genStep == 0) {\t\t\tcout \u0026lt;\u0026lt;"第" \u0026lt;\u0026lt; genCount \u0026lt;\u0026lt; "代:"\u0026lt;\u0026lt; endl;\t\t\tfor (int i = 0; i\u0026lt;=15 \u0026amp;\u0026amp; i \u0026lt; currentGenerate.size(); i++) {\t\t\t\tcout \u0026lt;\u0026lt; "V:"\u0026lt;\u0026lt;hex\u0026lt;\u0026lt; currentGenerate.value \u0026lt;\u0026lt;dec\u0026lt;\u0026lt; " S:"\u0026lt;\u0026lt;setprecision(20) \u0026lt;\u0026lt; currentGenerate.score \u0026lt;\u0026lt; "\\t";\t\t\t}\t\t\tcout\u0026lt;\u0026lt;currentGenerate.size() \u0026lt;\u0026lt; endl;\t\t}\t}\tsystem("pause");\treturn 0;}
推荐阅读
- 为啥这个算法误差的看起来这么小
- 使用算法帮助人们筛选reader的信息是否存在可能
- 请问如果想成为算法工程师的话,大学选专业是选软件工程好还是计算机科学与技术好。
- 吕良伟|吕良伟19岁独子罕曝光,被指没遗传爸爸好基因,福相满满引热议
- 神经网络算法是否真的属于人工智能范畴
- |常州市省级非遗传承人增至59位
- 以算法为例,是否存在讲解者认为“懂得自然懂了,不懂的我说再多也白搭”的心理
- 豆瓣FM的推荐算法还有哪些可以改进的地方
- 如果已确定图像中物体的位置, 常用的目标分割和提取算法有哪些
- 基因|有些癌症会遗传!提醒:如果父母有过这6种癌,你也很危险
