有没有用退火的兄弟

回复帖子

@Imakf 2018-11-02 20:22 回复

精度卡的有点严重鸭……

@zyywzw 2018-11-02 20:24 回复

放弃吧,还不如求导(雾)

@Imakf 2018-11-02 20:27 回复
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
struct func{
    double xishu[50];
    int ci;
    func *dao;
    void readxishu(){
        for(int i=ci;i>=0;--i)  scanf("%lf",&xishu[i]);
    }
    void getdao(){
        dao=new func;
        for(int i=0;i<ci;++i)
            dao->xishu[i]=xishu[i+1]*(i+1);
        dao->ci=ci-1;
    }
    double value(double x){
        double ans=0;
        for(int i=0;i<=ci;++i){
            ans+=pow(x,i)*xishu[i];
        }
        return ans;
    }
    double sanfen(double l,double r,double jingdu){
        while(l<=r){
            double mid=(l+r)/2;
            if(fabs(value(mid))<jingdu) return mid;
            if(value(mid)>0)    l=mid;
            else r=mid;
        }
    }
};
int main(){
    func f;
    double l,r;
    scanf("%d%lf%lf",&f.ci,&l,&r);
    f.readxishu();
    f.getdao();

    printf("%.5lf",f.dao->sanfen(l,r,0.00001));
    return 0;
}

求导过的

@TempTest 2018-11-08 15:59 回复

我的膜拟退火过了....
玄学调参数,温度T=100000,降温系数0.99
我把输入搞反了,,该死的输入居然是对称的
根本发现不了
我发现eps设置为1e-10貌似不够
以下是代码

#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<cstdio>
#include<ctime>
using namespace std;
typedef double Type;
int n,ans;
Type ansx,l,r,eps=1e-15;
struct function
{
    Type factor[20];
    Type operator()(Type x)
    {
        Type ans=0;
        for(int i=0;i<=n;i++)
        ans+=factor[i]*pow(x,i);
        return ans;
    }
}f;
void mnth()
{
    Type T=100000;
    while(T>=eps)
    {
        Type nowx=ansx+(rand()*2-RAND_MAX)*T,
        delta=f(nowx)-f(ansx);
        if(delta>0&&l<=nowx&&nowx<=r)ansx=nowx;
        else if(exp(delta/T)*RAND_MAX>rand()&&l<=nowx&&nowx<=r)ansx=nowx;
        T*=0.99;
    }
}
int main()
{
    srand(time(NULL)+rand());
    cin>>n>>l>>r;
    for(int i=n;i>=0;--i)cin>>f.factor[i];
    ansx=(l+r)/2;
    mnth();
    printf("%.5f",ansx);
}