蒙特卡洛法 解 非線性整數規划問題


簡介

假設目標函數落在高值區的概率分別為0.01,0.00001,則當計算\(10^6\)個點之后至少有一個點能落在高值區的概率分別是

\[1 - 0.99^{1000000} = 0.9999999(100+)99 \]

\[1 - 0.99999^{1000000} = 0.999954602 \]


上面就是蒙特卡洛解整數規划的重點。如果不是整數那幾乎不能枚舉。

code

rand('state', sum(clock)); % 初始化隨機數發生器
p0 = 0;
tic % 計時開始
for i=1:10^6
    x = randi([0,99],1,5); % 產生一行五列的區間[0,99]上的隨機整數
    [f,g] = mente(x);
    if all(g <= 0)
        if p0 < f
            x0=x;p0 = f; %記錄下當前較好的值
        end
    end
end
disp('最優位置 & 最優值')
x0, p0
toc % 計時結束
function[f,g] = mente(x);
f=x(1)^2 + x(2)^2 + 3 * x(3)^2 + 4 * x(4)^2 + 2*x(5)^2-8*x(1) - 2* x(2) - 3*x(3) -x(4) - 2 * x(5); % 求f 的最大值 同時 g 中所有元素要滿足小於0
g = [
sum(x) - 400
x(1) + 2 * x(2) + 2 * x(3) + x(4) + 6 * x(5) - 800
2 * x(1) + x(2) + 6 * x(3) - 200
x(3) + x(4) + 5 * x(5) - 200
];


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM