C艹老師布置的思考題

2022-05-08 03:03:08 字數 2068 閱讀 6426

f(x) = 0.7*x + 8*sin(6*x) + 9*cos(3*x)在區間[0,10]的最大值。要求結果保留到小數點後6位。

///

因為random庫是c++11的拓展庫,所以vc6跑不了

#include #include

#include

#include

#include

#include

using

namespace

std;

#define inf 0x3f3f3f3f

intn,sx,sy;

double

lbound, ubound;

double

ansx;

double ans=-inf,t;

const

double delta=0.993

;mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

uniform_real_distribution

dis(-1,1

);double func(double

x)void

simulate_anneal()

else

if (exp(-delta/t)*1.0 > dis(rng)) x=x;

t*=delta;

}}inline

void

solve()

intmain()

view code

這就算是好好學習了一下模擬退火吧。

不得不說,模擬退火的學問是真的很大。下面是我在學習模擬退火時看的幾個部落格,個人感覺都寫的很好:

(ps:個人感覺這篇講的最好,它讓我清楚地知道了在模擬退火中的幾個很重要的概念,真的很棒鴨)

談一談個人對模擬退火的理解。感覺就是x從中位數或者平均值開始,之後加上平均值*(-1,1)的隨機浮點數。

帶入式子,看是不是比當前全域性最優解更優,如果更優的話就換掉,如果不更優的就以一定的機率更換x。

之後逐漸縮小隨機函式跳躍間隔。最後就會在最優解附近了。(蒟蒻理解,大佬勿噴

當然最好多跑幾遍,玄學演算法嘛

最後在看大佬們的**過程中,偷學到一點生成隨機數的奇淫技巧。(我才不會告訴你們我之前還在用rand的

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

uniform_real_distributiondis(-1,1);

運用這段**需要#include , #include ,並且使用c++11以上的版本的編譯器

mt19937是一種生成隨機數的類,mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); 這一句話就相當於生成乙個叫rng的隨機數

uniform_real_distribution

是生成隨機數的類?之後會生成乙個可以定生成範圍的函式?

差不多這樣的感覺

所以uniform_real_distributiondis(-1,1);

就是生成了

乙個會生成-1~1的浮點數的函式。

double x=x+dis(rng)*t; 呼叫就差不多這麼呼叫。

C語言中的思考題

1 學完迴圈之後,如何把乙個十進位制正整數按二進位制形式輸出。作用,理解陣列的作用。注 不用陣列很難搞定,當然會用遞迴的話肯定學過陣列。2 學完函式之後,如何把乙個浮點數的整數部分新增千分位符後輸出。用庫函式 函式名 fcvt 功 能 把乙個浮點數轉換為字串 用 法 char fcvt double...

常見的邏輯思考題

對於乙個優秀的程式設計師來說,學習理解一些邏輯思考題有助於開闊自己的思維,在編碼過程中邏輯更加的嚴密完整。同時,還能增添日常枯燥生活的趣味,通過解答一道複雜的邏輯思考題,會獲得慢慢的成就感,那我們還有什麼理由不去學習和理解呢?有100個囚犯,將他們站成一排依次報數,報到奇數的那個人被槍斃,接著開始下...

C有關記憶體的思考題

void getmemery char p void test int main 請問執行test函式會有什麼樣的結果?下面是在windows下vs2013編譯器的結果 程式崩潰 因為getmemory方法並不能傳遞動態記憶體 test函式中的str一直都是null strcpy將使程式崩潰 之所以...