簡介
假設目標函數落在高值區的概率分別為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
];