數模常用算法系列--整數線性規划(分枝定界法)、整數非線性規划(蒙特卡洛法)


整數線性規划求解----分枝定界法

什么是整數規划?

​ 線性規划中的變量(部分或全部)限制為整數時,稱為整數規划。若在線性規划模型中,變量限制為整數,則稱為整數線性規划。目前所流行的求解整數規划的方法,往往只適用於整數線性規划。目前還沒有一種方法能有效地求解一切整數規划。

整數規划的分類

    - 變量全限制為整數時,稱(完全)整數規划

    - 變量部分限制為整數時,稱混合整數規划			

什么是分枝定界法

​ 原理如下:

​ 設有最大化的整數規划問題A,與它相應的線性規划為問題B,從解問題B開始,若其最優解不符合A的整數條件,那么B的最優目標函數必是A的最優目標函數\(z^*\)的上界\(\overline{z}\);而A的任意可行解的目標函數值將是 \(z^*\)的一個下界\(\underline z\) ,分枝定界法就是將B的可行域分成子區域的方法。逐步減小\(\overline z\)和增大\(\underline z\)最終求到\(z^*\)

​ 本質就是個分治回溯,逼近最大值的算法。Matlab算法如下:(強烈警告,(不會驗證)由於比較懶,並未對算法正確性驗證,思路上驗證了一下沒問題就碼上來了,如果有錯,請一定聯系~~)

	% c,A,Aeq,Beq,LB,UB,是linprog函數的相關參數,知道了它們就可以求出對應的線性規划最優解,
	% now是目前已經知道的整數解的最大值
	function y = control(c,A,Aeq,Beq,LB,UB,now)
    	ret = 0; 
    	[x,fval] = linprog(c,A,Aeq,Beq,LB,UB); % x是最優解的解向量,fval是對應的函數值
    	if fval < now  
        	 y = fval;
        	 return;
    	end   % 如果得到的當前最優解fval小於已知的now,那說明最優整數解不在這個區間,則剪枝返回。
    	for i = 1 : length(x)
        	if rem(x(i),1) ~= 0  % rem(x,1)如果返回值不為0,則表示是小數。遍歷x,找到第一個小數xi.
          	 NUB = UB; 
          	 NLB = LB;
          	 NUB(i) = floor(x(i)); % 把xi對應的上界更新為xi的向下取整。
          	 NLB(i) = ceil(x(i)); % 把xi對應的下界更新為xi的向上取整。
           	 fval1 = control(c,A,Aeq,Beq,LB,NUB,now);  %分成了兩個區間, 原來下界~向下取整
            now = max(fval1,now);
          	 fval2 = control(c,A,Aeq,Beq,NLB,UB,now);  % 向上取整~原來上屆
           	 ret = max(ret,fval1); % 更新得到整數最優解,並退出。
             ret = max(ret,fval2); 
             break
            end
            if  i == length(x)  %如果每個xi都是整數,直接退出
                y = ret;
                return ;
            end
        end
        if j == length(x)+1   %如果當前已經是整數最優,返回fval,否則返回ret。
             y = fval;
        end
    
   end

非線性整數規划--蒙特卡洛算法(隨機取樣法)

什么是非線性規划?

​ 就是自變量不再是線性的規划。沒錯就是這個。

蒙特卡洛算法

​ 對於非線 性整數規划目前尚未有一種成熟而准確的求解方法,那么找到一個相對滿意的解就成了主要需求。

​ 蒙特卡洛算法是一種大量隨機取樣枚舉解,以達到存在一種解,其函數值落在了我們期望的高值區不要問我什么是高值區)。

​ 那么具體多少次枚舉合適呢?這是相對於問題而言的,舉個例子:

\(0\leq x_i \leq 99 ,1 \leq i \leq 5, y = x_1^2 + x_2^2+3x_3^2+4x_4^2+2x_5^2-8x_1-2x_2-3x_3-x_4-2x_5\) ,

​ 解空間大小為\(100^5 = 10^{10}\),太大了,枚舉不了

​ 如果選擇隨機采樣1e6,假設最優點不是孤立的奇點,並設目標函數落在可以接受的高值區的概率是0.00001,那么存在一個點落在高值區的概率為 1-\(0.99999^{1000000}\) \(\approx\) 0.999954602,顯然這個概率是可以接受的,也即是我們認為通過隨機采樣1e6,是能夠得到滿足期望的解。

​ 隨機采樣的算法就不寫了,因為太懶了(因為不會)。

今日感觸:matlab的庫函數是真的多,基礎語法還是不行啊,以及數模的算法還挺有意思的,雖然高大上,其實也就那樣。

-----9.10 更新
~~

規划問題還是用lingo吧,太方便了。


免責聲明!

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



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