关于梯度下降法
查看原帖
关于梯度下降法
243063
cyx20080216楼主2021/8/8 21:50

这道题我可能是第一个闲着蛋疼用梯度下降法做的。

众所周知,这是一个看脸的算法,要精细地调整学习率,还得祈祷到一个好的出生点

于是乎,我调了8次才通过,有几次是梯度算错了,还有几次学习率没调好,希望不要被判定为滥用评测资源

Code

#include<bits/stdc++.h>
#define EPS 1e-3
using namespace std;
double a,b,c,d;
inline double calcValue(const double &x)
{
	return (a*x*x*x+b*x*x+c*x+d)*(a*x*x*x+b*x*x+c*x+d);
}
inline double calcDerivative(const double &x)
{
	return (2*(a*x*x*x+b*x*x+c*x+d))*(3*a*x*x+2*b*x+c);
}
inline double findTrough(const double &start,const double &learningRate)
{
	double ans=start;
	while(fabs(calcDerivative(ans))>EPS)
		ans=ans-calcDerivative(ans)*learningRate;
	return ans;
}
inline void init()
{
	srand(time(0));
	scanf("%lf %lf %lf %lf",&a,&b,&c,&d);
}
inline void solve()
{
	vector<double> ans;
	while(ans.size()<3)
	{
		double re=findTrough(rand()/(double)(RAND_MAX)*200.0-100.0,0.0001);
		if(fabs(calcValue(re))<=EPS)
		{
			bool flag=1;
			for(vector<double>::const_iterator i=ans.begin();i!=ans.end();i++)
				if(fabs(re-*i)<1.0)
				{
					flag=0;
					break;
				}
			if(flag)
				ans.push_back(re);
		}
	}
	sort(ans.begin(),ans.end());
	for(vector<double>::const_iterator i=ans.begin();i!=ans.end();i++)
		printf("%.2lf ",*i);
}
int main()
{
	init();
	solve();
	return 0;
}

2021/8/8 21:50
加载中...