求f(x) = 0.7*x + 8*sin(6*x) + 9*cos(3*x)在區間[0,10]的最大值。要求結果保留到小數點後6位。
///view code 這就算是好好學習了一下模擬退火吧。因為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()
不得不說,模擬退火的學問是真的很大。下面是我在學習模擬退火時看的幾個部落格,個人感覺都寫的很好:
(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將使程式崩潰 之所以...