1. 程式人生 > >數學建模演算法 一 簡述(1)蒙特卡洛演算法

數學建模演算法 一 簡述(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採用順序儲存結構,請寫一個時間複雜度為On、空間複雜度為O1演算法,該演算法可刪除線性表中所有值為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

大一的時候就開始看吳軍博士第一版的《數學之美》,苦於那時年少無知不懂事,加上自身數學知識的體系不健全,翻著翻著也就沒有了後文。現在讀了研究僧,也許是換了個視野,看到書的開頭“中國教育最失敗的就是學生從上課的第一天到考試結束,都不知道學的東西能幹什麼。”,果然是大

第十四周專案11-驗證演算法

問題及程式碼: #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