Bing碎冰 2022-01-24 06:24 采纳率: 83.3%
浏览 30
已结题

求根号n的值 模拟退火

#include<bits/stdc++.h>
using namespace std;
#define endl '\n'
const int inf = 1e5 + 10;
int n;
double func(int x) {
    return fabs(x * x - n);
}
double T = 20000;
double dt = 0.993;
const double eps = 1e-14;
void SA() {
    double x = 0;
    double f = func(x);
    while (T > eps) {
        double dx = x + (rand() * 2 - RAND_MAX) * T;
        while (dx < 0)dx = x + (rand() * 2 - RAND_MAX) * T;
        double df = func(dx);
        if (df < f)x = dx, f = df;
        else if (exp((f - df) / T)*RAND_MAX > rand())x = dx, f = df;
        T *= dt;
    }
    cout << x;
}
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n;
    SA();
    return 0;
}


我是对比别人写的发现结果不对,也没找到哪里有问题

展开全部

  • 写回答

1条回答 默认 最新

  • wresource Android领域优质创作者 2022-01-24 07:20
    关注

    模拟退火是启发式算法,有一点点运气成分,多运行几次或者加大迭代次数,如果结果有改善应该就不是程序的问题了

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
    Bing碎冰 2022-01-24 11:28

    我试了发现结果错的都挺远,应该代码哪里有问题吧

    回复
编辑
预览

报告相同问题?

问题事件

  • 系统已结题 2月10日
  • 已采纳回答 2月3日
  • 专家修改了标签 1月24日
  • 创建了问题 1月24日
手机看
程序员都在用的中文IT技术交流社区

程序员都在用的中文IT技术交流社区

专业的中文 IT 技术社区,与千万技术人共成长

专业的中文 IT 技术社区,与千万技术人共成长

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

关注【CSDN】视频号,行业资讯、技术分享精彩不断,直播好礼送不停!

客服 返回
顶部