网格搜索 C++实现 机器暴力参数优化

来源:互联网 发布:单片机协议栈开发 编辑:程序博客网 时间:2024/06/09 19:43

网格搜索 C++实现 机器暴力参数优化:

参数设置和实现原理见下图,后面附带C++源码(个人原创),帮助解决C++程序参数优化问题。

一般放那跑一夜,最好的参数就出来了,哈哈,还是比较方便滴。

有问题记得留言讨论。。

class JrGrid{public:JrGrid() {/* --搜索初始化设置-- */m_para_num = 3; // 参数个数m_iter = 10;// 迭代次数m_parts = 5;// 每次迭代的搜索分片数m_upper = new double[m_para_num];m_lower = new double[m_para_num];set_lower_and_upper(0, 10, 15); // 设置第1个参数的下限是10 上限是15set_lower_and_upper(1, 1, 5000);// 设置第2个参数的下限是1 上限是5000set_lower_and_upper(2, 5, 10);  // 设置第3个参数的下限是5 上限是10}private:/* --将你的代码写到这个函数里,从para中获取参数,返回其得分(默认选择得分高的参数组合)-- */double validate(double *para);public:~JrGrid() { delete m_upper; delete m_lower; delete m_score; delete m_paras; }/* --调用此函数启动网格搜索-- */void do_grid_search() {int size = (int)pow(m_parts + 1, m_para_num);m_score = new double[size];m_paras = new double[size*m_para_num];for (int i = 0; i < m_iter; i++) {std::cout <<"GS ITER "<<i+1<<" -->"<<std::endl;double *para = new double[m_para_num];double *delta = new double[m_para_num];for (int j = 0; j < m_para_num; j++) {delta[j] = (m_upper[j] - m_lower[j]) / m_parts;para[j] = m_lower[j];}m_count_para = 0;m_count_part = 0;m_count_s = 0;iter_search2(para, delta, 0);double set = -9999999.0;int locate = 0;for (int j = 0; j < size; j++) {if (m_score[j] > set) {locate = j;set = m_score[j];}}for (int j = 0; j < m_para_num; j++) {std::cout <<"para"<<j+1<<"="<< m_paras[locate*m_para_num + j]<<",";double next_lower = m_paras[locate*m_para_num + j] - delta[j];if (next_lower > m_lower[j]) {m_lower[j] = next_lower;}double next_upper = m_paras[locate*m_para_num + j] + delta[j];if (next_upper < m_upper[j]) {m_upper[j] = next_upper;}}std::cout <<"score="<< set << std::endl;delete para;delete delta;}}private:void iter_search2(double *para, double *delta, int layer){if (layer == m_para_num) {m_score[m_count_s] = validate(para);for (int j = 0; j < m_para_num; j++) {m_paras[m_count_s*m_para_num + j] = para[j];}m_count_s++;}else {for (int i = 0; i <= m_parts; i++) {double *spara = new double[m_para_num];memcpy(spara, para, m_para_num*sizeof(double));spara[layer] += i*delta[layer];iter_search2(spara, delta, layer + 1);delete spara;}}}void set_lower_and_upper(int para_i, double low, double up) { m_lower[para_i] = low; m_upper[para_i] = up; }private:int m_para_num;int m_iter;int m_parts;double *m_upper;double *m_lower;int m_count_para;int m_count_part;int m_count_s;double *m_score;double *m_paras;};


0 0
原创粉丝点击