现在的位置: 首页 > 综合 > 正文

多维优化:最速下降法C++代码

2018年02月20日 ⁄ 综合 ⁄ 共 2023字 ⁄ 字号 评论关闭
MultidimensionalOptimization.h

#ifndef _MultidimensionalOptimization_
#define _MultidimensionalOptimization_
#include <vector>
#include <stdio.h>
#include "OneDimensionalOptimization.h"
using namespace std;
class MultidimensionalOptimization : public OneDimensionalOptimization
{
public:
	//最速下降法
	MultidimensionalOptimization();
	double norm2(double* vec, int n); //计算vec中2的范数
	
	double steepestDescent(double(*p)(double* x),double* x0,int n,double tol = 1e-6); 
	double* gradient(double(*p)(double* x),double* x0, int n, double size = 1e-10); //计算搜索方向,即负梯度

	void testSteepestDescent();
};
#endif


MultidimensionalOptimization.cpp

#include "MultidimensionalOptimization.h"
double* xv = NULL;
double* xk = NULL;
double* vk = NULL;
int paraNum = 0;
double(*point)(double* x) ;
double fitFunc(double x)
{
	double* xv = new double[paraNum];
	for(int i =0; i < paraNum; i++)
	{
		xv[i] = xk[i] + x * vk[i];
	}

	double y = point(xv);

	return y;
}

MultidimensionalOptimization::MultidimensionalOptimization()
{
	xk = NULL;
	vk = NULL;
}
//最速下降法
double* MultidimensionalOptimization::gradient(double(*p)(double* x),double* x0, int n, double size) //计算目标函数的负梯度
{
	double* grads = new double[n];
	for(int k = 0; k < n; k++)
	{
		double* delx = new double[n];
		memcpy (delx, x0, sizeof(*x0)*n );
		delx[k] += size;
		double delObjFun = p(x0) - p(delx);
		grads[k] = (-delObjFun / size);
		delete[] delx;
	}
	return grads;
}
double MultidimensionalOptimization::norm2(double* vec,int n) //计算vec中2的范数
{
	double res = 0.0;
	for(int i = 0; i < n; i++)
	{
		res += vec[i] * vec[i];
	}
	return sqrt(res);
}

double MultidimensionalOptimization::steepestDescent(double(*p)(double* x),double* x0, int n,double tol)
{
	paraNum = n;
	point = p;
	double lamta = 0;
	while(true)
	{
		//1)计算搜索方向
		double* direction = gradient(p , x0, n);
		//2)判断搜索方向是否满足收敛条件
		double conver = norm2(direction,n);
		if(conver < tol)
			break;
		//3)进行一维搜索
		xk = x0;
		vk = direction;
		double l = 0;
		double u = 1e10;
		
		quadraticInterpolationSearch(fitFunc,l, u, lamta);
		//4)更新xk,此处为x0
		for(int i = 0; i < n; i++)
		{
			x0[i] += lamta * vk[i];
		}
		delete[] direction;
	}
	return p(x0);
}

double steepestDescentFunc(double*x)
{
	return (x[0]-4)*(x[0]-4) +  (x[1]+2)* (x[1]+2) + 1;
}

//测试代码,调用此函数即可
void MultidimensionalOptimization::testSteepestDescent()
{
	double x0[2] ={1.0,-3.0};
	double r = steepestDescent(steepestDescentFunc,x0,2,1e-6);
}




抱歉!评论已关闭.