數學建模演算法 一 簡述(1)蒙特卡洛演算法
蒙特卡羅方法概述
蒙特卡羅方法又稱統計模擬法、隨機抽樣技術,是一種隨機模擬方法,以概率和統計理論方法為基礎的一種計算方法,是使用隨機數(或更常見的偽隨機數)來解決很多計算問題的方法。將所求解的問題同一定的概率模型相聯絡,用電子計算機實現統計模擬或抽樣,以獲得問題的近似解。為象徵性地表明這一方法的概率統計特徵,故借用賭城蒙特卡羅命名。
通俗的講:
蒙特卡羅演算法:取樣越多,越近似最優解
舉個例子:假如筐裡有100個蘋果,閉眼拿1個,挑出最大的。於是我隨機拿1個,再隨機拿1個跟它比,留下大的,再隨機拿1個……每拿一次,留下的蘋果都至少不比上次的小。拿的次數越多,挑出的蘋果就越大,但我除非拿100次,否則無法肯定挑出了最大的。這個挑蘋果的演算法,就屬於蒙特卡羅演算法——儘量找好的,但不保證是最好的。
【例】用蒙特卡洛模擬法求圓周率pi
如圖,紅色線條為平面上圓心在原點的單位圓,圓的面積為pi,黑色線條構成邊長為2的正方形
設相互獨立的隨機變數X,Y均服從[-1,1]上的均勻分佈,則(X,Y)服從{-1≤x≤1, -1≤y≤1}上的二元均勻分佈(即圖中正方形區域上的二元均勻分佈),記事件A = {x^2+y^2≤1},則A事件發生的概率等於單位圓面積除以邊長為2的正方形的面積,即P(A) = pi/4。
可得圓周率pi = 4P(A). 而P(A)可以通過蒙特卡洛模擬法求得,在圖1中正方形內隨機投點(即橫座標X和縱座標Y都是[-1,1]上均勻分佈的隨機數),落在單位圓內的點的個數m與點的總數n的比值m/n可以作為A事件的概率P(A)的近似,隨著投點總數的增加,m/n會越來越接近於P(A),從而可以得到逐漸接近於pi的模擬值
MATLAB程式碼
%總的實驗次數
n = input('請輸入n:');
%落在圓中點的次數
m = 0;
%使用的圓的半徑
a = 2;
%迴圈實驗
for i = 1:n
x = rand * a / 2; %產生隨機數
y = rand * a / 2;
if (x^2 + y^2 <= (a/2)^2)
m = m + 1;
end
end
%顯示結果
fprintf('當總實驗次數n = %d時計算出來的圓周率:Pi = %d\n' ,n, 4 * m / n);
C
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
unsigned long i;
unsigned long m;
const unsigned long N=100000000;
double x,y,pi;
srand((unsigned)time(NULL));
for(i=0,m=0;i<N;i++)
{
/*x,y在區間(-1,1)*/
x=2.0*rand()/RAND_MAX-1;、/*產生– 1到1之間的隨機數*/
y=2.0*rand()/RAND_MAX-1;
if((x*x+y*y)<=1)
{
m++;
}
}
pi=4.0*m/N;
printf("%lf\n",pi);
return 0;
}
srand((unsigned)time(NULL))作用
1、隨機數是由隨機種子根據一定的計算方法計算出來的數值。所以,只要計算方法一定,隨機種子一定,那麼產生的隨機數就不會變。
2、只要使用者或第三方不設定隨機種子,那麼在預設情況下隨機種子來自系統時鐘(即定時/計數器的值)
3、建議:如果想在一個程式中生成隨機數序列,需要至多在生成隨機數之前設定一次隨機種子。 也就是隻需在主程式開始處呼叫srand((unsigned)time(NULL)); 後面直接用rand就可以了。不要在for等迴圈放置srand((unsigned)time(NULL));
相關推薦
數學建模演算法 一 簡述(1)蒙特卡洛演算法
蒙特卡羅方法概述 蒙特卡羅方法又稱統計模擬法、隨機抽樣技術,是一種隨機模擬方法,以概率和統計理論方法為基礎的一種計算方法,是使用隨機數(或更常見的偽隨機數)來解決很多計算問題的方法。將所求解的問題同一定的概率模型相聯絡,用電子計算機實現統計模擬或抽樣,以獲得問
數學建模演算法 一 簡述(3)規劃模型-整數規劃
整數規劃 定義: 規劃中的變數(全部或部分)限制為整數,稱為整數規劃。若線上性模型中,變數限制為整數,則稱為整數線性規劃。 一類要求問題的解中的全部或一部分變數為整數的數學規劃。從約束條件的構成又可細分為線性,二次和非線性的整數
數學建模演算法 一 簡述(3)規劃模型-線性規劃
線性規劃的定義: 求一組變數的值,在滿足一組約束條件下,求得目標函式的最優解。 根據這個定義,就可以確定線性規劃模型的基本結構: (1)變數 變數又叫未知數,它是實際系統的未知因素,也是決策系統中的可控因素,一般稱為決策變數,常引用英文字母加下標來表示,
Web Service 部分內容簡述(1)
DC 感受 名詞解釋 其他 通訊 封裝 對象 sax 基於web 1、什麽是Web服務(web service) Wb服務是一種可以用來解決跨網絡應用集成問題的開發模式,是基於網絡的、分布式的模塊化組件,它執行特定的任務遵守具體的技術規範,這些規範使得Web Ser
MATLAB在數學建模中的應用(三)
dash 以及 cxf 原始的 計算 而後 輸入輸出變量 tran fcm optimset函數 功能:創建或編輯優化選項參數結構。 語法: 1 options = optimset(‘param1’,value1,’para
已知長度為n的線性表A採用順序儲存結構,請寫一個時間複雜度為O(n)、空間複雜度為O(1)的演算法,該演算法可刪除線性表中所有值為item的資料元素。
語言:C++ #include <iostream> using namespace std; typedef int ElemType; //定義 #define MAXSIZE 100 typedef struct {ElemType *elem; int length;}Sq
python 基礎演算法題集錦(1)
#(1)尋找序列中的最大值和最小值,不能用內建函式max和min #(2)查詢序列值的出現次數 #(3)逆置序列 #(4)實現序列中元素之和 #(5)實現1+1/2+1/3+1/4+……1/n #(6)實現1+1/2+2/3+3/4+4/5+……(n-1)/n (1)#給定序列li
演算法設計思想(1)——貪婪法
概念 貪婪法(greedy algorithm),又稱為貪心演算法,是尋找最優解問題的常用方法。這種方法模式一般將求解過程分成若干個步驟,在每個步驟都應用貪心原則,選取當前狀態下最好的或者最優的選擇,並以此希望最後堆疊出的結果也是最好的或者最優的解。 貪婪法每次決策都以當前情況為
演算法的樂趣實戰(1)--匈牙利演算法
在閱讀《演算法的樂趣》的時候,實在難以理解第七章中關於匈牙利演算法的描述,所以劣者在網上搜刮各種資料,整理如下,既為了自己複習之用,也為了後來者的方便 匈牙利演算法解決了舞伴的快速匹配問題,什麼是舞伴快速匹配問題呢?男女雙方都有各自的最優選擇名單,在一輪輪的選擇過後,最
機器學習入門(1)--KNN演算法
KNN演算法是一種常用的監督學習方法。 生活之中我們想要給一個未知的樣本歸類,通常就是尋找幾個相似事物進行對比。假如,某人看到一隻未知的貓,想知道其屬於什麼品種,往往會在腦海中尋找貓的資訊,當在腦海中發現短尾貓的形態特徵和這隻貓及其相似時,就認為這隻貓是一直短尾貓。 KN
KCF跟蹤演算法學習筆記(1)
KCF跟蹤是相關濾波跟蹤器最具有代表性的,但是作為一個從來沒接觸過跟蹤演算法,線代苦手來說,看懂KCF中的原理簡直是難上加難,網上所有的相關文件要說也夠多了,可惜水平太差,看完以後只想問兩個問題,這是什麼?這又是什麼?再難啃的骨頭也是要啃的,所以決定把目前還一知半解的學習內容
資料結構實驗一:(1)(順序表)線性表的各種操作SqList
#include<iostream> #include<malloc.h> #include<cstdio> #define MAXSIZE 10 using namespace std; //typedef struct SqList
python演算法之旅(1)-twoSum
# 轉載請註明出處 http://blog.csdn.net/qq_34175893/article/details/79635054# 打算開始用python學習演算法,並進行一系列的學習過程及心得體會的記錄,歡迎大家持續關注,一起學習。歡迎大家提出意見或建議# 不關心問題
3D數學 ---- 矩陣和線性變換(1)
包含平移的線性變換稱作仿射變換,3D中的仿射變換不能用 3 x 3 矩陣表達,必須使用4 x 4矩陣。 一般來說,變換物體相當於以相反的量變換描述這個物體的座標系。當有多個變換時,則需要以相反的順序變換相反的量。例如,將物體順時針旋轉20度,擴大200%,等價於將座標系縮小2
程式碼合集(1)——容器演算法之合併 merge
2、inplace_merge:將兩個序列合併成一個新的序列,並對新的序列進行歸併排序(這兩個序列必須要進過排序) 原型: template <class BidirectionalIterator> void inplace_merge ( BidirectionalIterator fir
數學之美閱讀筆記(1)
大一的時候就開始看吳軍博士第一版的《數學之美》,苦於那時年少無知不懂事,加上自身數學知識的體系不健全,翻著翻著也就沒有了後文。現在讀了研究僧,也許是換了個視野,看到書的開頭“中國教育最失敗的就是學生從上課的第一天到考試結束,都不知道學的東西能幹什麼。”,果然是大
第十四周專案1(1)-驗證演算法
問題及程式碼: #include <stdio.h> #define MAXL 100 typedef int KeyType; typedef char InforType[10]; typedef struct { KeyType k
橢圓曲線演算法:入門(1)
很多人都聽說過加密演算法,包括ECC、ECDH或者ECDSA。ECC是Elliptic Curve Cryptography的縮寫,就是橢圓加密演算法,ECDH和ECDSA是ECC的不同實現。 橢圓加密演算法的應用範圍很廣,主要的三個技術 TLS、PGP以及SSH 都在使用它,更別提比特幣以及其他加密數字貨幣
整理五道演算法題系列(1)二叉樹相關
背景 最近想整理一些有意思的題目,特別是給力的破題技巧與思想,均為學習筆記,於此做個長期記錄。不多說,進入演算法世界了~~ 說明 => 五道 / 篇 => Java => 二叉樹相關 題目 1、重建二叉樹 輸入某二叉
【Dubbo原始碼學習】負載均衡演算法(1)-隨機演算法
/** * random load balance. * */public class RandomLoadBalance extends AbstractLoadBalance { public static final String NAME = "random"; @Override