日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

整数线性规划实现(matlab分枝界定法)

發布時間:2025/3/15 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 整数线性规划实现(matlab分枝界定法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

一、本次問題

1.利用第一天所學知識求解:

2.本題理解:

(1)分支界定法

背景:

基本理論(解題步驟):

求解實現1:

1.第一步

2.第二步

3.第三步

4.第四步

結論:綜上,最優解:x1 = 4 ,x2 = 2 ;最優值:340?

求解實現2:

結果2:最優解:x1 = 4 ,x2 = 2 ;最優值:340?

?求解實現3:

結果3:最優解:x1 = 4 ,x2 = 2 ;最優值:340?

總結:


一、本次問題

1.利用第一天所學知識求解:

建模學習打卡第一天_菜菜笨小孩的博客-CSDN博客

代碼如下:

%打卡第一天 clear all clc c=[40 90];%用目標函數系數來確定 a=[9 7 ;7 20];%不等式約束條件左邊約束 b=[56 70];%不等式約束條件右邊系數 aeq=[];%沒有等式約束,因此aeq,beq都為空 beq=[]; lb=[0;0];%沒有下限 ub=[inf;inf];%沒有上限 [x,fval]=linprog(-c,a,b,aeq,beq,lb,ub); x %獲取對應x1,x2 best=c*x%計算最優值

2.本題理解:

由于問題要求求解結果都為整數,所以第一問結果錯誤,那么我們該如何求得想要得整數解呢?

(1)分支界定法

背景:

今天利用matlab來實現求解完全整數規劃問題的分支定界法。這里求解的模型為目標函數最小化模型:

基本理論(解題步驟):

  • 分支定界法:用以求解整數規劃問題的一種方法。
  • 求解步驟
    首先我們規定求解的整數規劃問題為A,相應的線性規劃問題為B
  • 對問題B進行求解
    1. 若B無可行解,則A也無可行解,停止計算
    2. 若B有最優解,且符合整數條件,該最優解為A的最優解,停止計算
    3. 若B有最優解,但不符合整數條件,記它的目標函數值為z*,作為最優值的下界
  • 找出問題A的一個整數可行解,其目標函數值作為最優解的上界
  • 進行迭代
  • 分支,在B的最優解中任選一個不符合整數條件的變量x j x_jxj?,其值為b j b_jbj?,構造兩個約束條件,,分別加入到問題B中,形成兩個子問題B1?、B2?。不考慮整數條件求解這兩個子問題。即分支
  • 定界。對每個后繼問題表明其求解的結果,與其他問題進行比較,將最優目標函數值最小者(不包括問題B)作為新的下界,在已符合整數條件的各分支中,找出目標函數值最小者作為新的上界。
  • 剪枝,將目標函數值不在上界、下界中的分支剪去
  • 重復1 2 3,直到得到最優解
    注意事項:在對兩分支進行分解時,優先選擇目標函數值最小的分支進行分解。
  • 分支定界法中,通過定界進而進行剪枝,對分支進行了篩選,使我們僅在一部分可行解中尋求最優解,而不是全部窮舉出來再尋找,其求解效率更高。

    求解實現1:

    linprog函數及其參數的意義請看建模學習打卡第一天_菜菜笨小孩的博客-CSDN博客

    簡單介紹下,首先MATLAB中求解的是目標函數是最小值的問題,但如果我們的目標函數是求最大值,可以通過對目標函數中每一項中乘以-1,將求最大值問題轉化為求最小值問題;A,b分別為不等式約束中的系數矩陣。Aeq和beq分別為等式約束中的系數矩陣,lb,和ub分別為每個變量的上下區間;最后c為目標函數中各變量的系數矩陣。

    1.第一步

    根據上面給出的結果,知道結果不符合題意。

    于是我們可以暫定z的上限(最大值)為356,又因為當x1,x2全為0時,z也為0,所以可以暫定z的范圍為 0<= z <= 356;并且將對x1值的范圍兩種情況定為問題A和問題B,并分別為枝干求解


    2.第二步

    首先,我們對A問題進行分支,改變x1的約束條件,不改變x2的約束條件,即對x1分支得兩個子集

    x1 =<[4.8092] = 4 , x1 >= [4.8092] +1 = 5

    約束條件變為:

    9*x1+7*x2<=56 7*x1+20*x2<=70 0<x1<4或x1>5 x2>0

    先對0<x1<4求解??代碼如下:

    clc clear allc=[40 90];%用目標函數系數來確定 a=[9 7 ;7 20];%約束條件左邊約束 b=[56 70];%約束條件右邊系數aeq=[];%沒有等式約束,因此aeq,beq都為空 beq=[];lb=[0;0];%下限依然都為0 ub=[4;inf];%x1上限為4,x2沒有上限[x,y]=linprog(-c,a,b,aeq,beq,lb,ub); %這里沒有等式約束,對應的矩陣為空矩陣 x %獲取對應x1,x2 best=c*x%計算最優值

    結果為:此時的最優解 x1=4 , x2=2.1 ; 最優值為 349。也不符合題意,所以舍

    再對 x1 > 5求解 代碼如下:

    clc clear allc=[40 90];%用目標函數系數來確定 a=[9 7 ;7 20];%約束條件左邊約束 b=[56 70];%約束條件右邊系數aeq=[];%沒有等式約束,因此aeq,beq都為空 beq=[];lb=[5;0];% x1的下限變成5,x2下限依然都為0 ub=[inf;inf];%x1,x2沒有上限 1 [x,y]=linprog(-c,a,b,aeq,beq,lb,ub); %這里沒有等式約束,對應的矩陣為空矩陣 x %獲取對應x1,x2 best=c*x%計算最優值

    結果為:此時的最優解 x1=5?, x2=1.5714?; 最優值為 341.4286。也不符合題意,所以舍


    3.第三步

    通過第二部對問題A的分支,我們可以進一步暫定 z 的范圍為 0<= z <= 249,又因為第二步中只有x2的為小數,因此我們也就對問題B x2的范圍進行限定為 (同上) :

    0=<x2<[2.1]=2,x2>[2.1]+1=3

    此時約束條件:

    9*x1+7*x2<=56 7*x1+20*x2<=70 0<=x1<=4 2>x2>0 或 x2>3

    先對約束條件 0<=x1<=4,0<=x2<=2求解? 代碼如下:

    clc clear allc=[40 90];%用目標函數系數來確定 a=[9 7 ;7 20];%約束條件左邊約束 b=[56 70];%約束條件右邊系數aeq=[];%沒有等式約束,因此aeq,beq都為空 beq=[];lb=[0;0];%下限依然都為0 ub=[4;2];%x1上限為4,x2上限為2[x,y]=linprog(-c,a,b,aeq,beq,lb,ub); %這里沒有等式約束,對應的矩陣為空矩陣 x %獲取對應x1,x2 best=c*x%計算最優值

    結果:此時的最優解 x1=4?, x2=2?; 最優值為 340。符合題意,所以暫時留著

    ?再對約束條件 0<=x1<=4,x2>=3求解? 代碼如下:

    clc clear allc=[40 90];%用目標函數系數來確定 a=[9 7 ;7 20];%約束條件左邊約束 b=[56 70];%約束條件右邊系數aeq=[];%沒有等式約束,因此aeq,beq都為空 beq=[];lb=[0;3];% x1下限依然都為0,x2下限為3 ub=[4;inf];%x1上限為4,x2無上限[x,y]=linprog(-c,a,b,aeq,beq,lb,ub); %這里沒有等式約束,對應的矩陣為空矩陣 x %獲取對應x1,x2 best=c*x%計算最優值

    結果:此時的最優解 x1=1.4286?, x2=3?; 最優值為 327.1429。不符合題意,所以舍


    4.第四步

    通過上前的,我們可以進一步確定z的范圍:0<= z <=241,此時我們已對問題A完成了完美分支,接下來我需對問題B再進行分支

    根據上面的結果,x2=1.5714為小數,因此我們對B中的x2進行分支。

    0=<x2<[1.5714]=1,x2>[1.5714]+1=2

    ?此時條件約束:

    9*x1+7*x2<=56 7*x1+20*x2<=70 x1>=5 1>x2>0 或 x2>2

    ?先對x1>=5,1>x2>0求解,代碼如下:

    clc clear allc=[40 90];%用目標函數系數來確定 a=[9 7 ;7 20];%約束條件左邊約束 b=[56 70];%約束條件右邊系數aeq=[];%沒有等式約束,因此aeq,beq都為空 beq=[];lb=[5;0];% x1下限為5,x2下限為0 ub=[inf;1];%x1無上限,x2上限為1[x,y]=linprog(-c,a,b,aeq,beq,lb,ub); %這里沒有等式約束,對應的矩陣為空矩陣 x %獲取對應x1,x2 best=c*x%計算最優值

    結果為:此時的最優解 x1=5.4444?, x2=1?; 最優值為 307.7778。不符合題意,所以舍

    ?再對x1>=5,x2>2求解,代碼如下:

    clc clear allc=[40 90];%用目標函數系數來確定 a=[9 7 ;7 20];%約束條件左邊約束 b=[56 70];%約束條件右邊系數aeq=[];%沒有等式約束,因此aeq,beq都為空 beq=[];lb=[5;2];% x1下限為5,x2下限為2 ub=[inf;inf];%x1無上限,x2無上限[x,y]=linprog(-c,a,b,aeq,beq,lb,ub); %這里沒有等式約束,對應的矩陣為空矩陣 x %獲取對應x1,x2 best=c*x%計算最優值

    結果:此時無解

    ?

    結論:綜上,最優解:x1 = 4 ,x2 = 2 ;最優值:340?

    至于結果為負是因為matlab求解線性規劃轉化為求最小值


    求解實現2:

    ?linprog函數及其參數的意義請看建模學習打卡第一天_菜菜笨小孩的博客-CSDN博客

    簡單介紹下,首先MATLAB中求解的是目標函數是最小值的問題,但如果我們的目標函數是求最大值,可以通過對目標函數中每一項中乘以-1,將求最大值問題轉化為求最小值問題;A,b分別為不等式約束中的系數矩陣。Aeq和beq分別為等式約束中的系數矩陣,lb,和ub分別為每個變量的上下區間;最后c為目標函數中各變量的系數矩陣。

    但線性規范有兩種比較特殊的情況,即整數規劃和0-1整數規劃。在之前(不知MATLAB幾之前……),MATLAB是不能直接求解這兩種規劃的,bintprog函數可以用來求0-1整數規劃,但求解過程比較麻煩,而且最新版的MATLAB已經遺棄了這個函數,同時提供了一個比較新的、專用于求解整數規劃和0-1整數規劃的函數——intlinprog。intlinprog的一個原型為:

    [x,fval,exitflag]= intlinprog(f,intcon,A,b,Aeq,beq,lb,ub)

    該函數的使用和linprog函數的使用十分相似,其僅僅在linprog函數的基礎上多了一個參數——intcon。在函數intlinprog中,intcon的意義為整數約束變量的位置。在本題中整數變量為x1,x2,所以intcon=[1,2]fval為最優化的值,一般是一個標量,exitflag意為函數的退出標志。

    本題代碼如下:

    clear all clcc=[-40 -90];%用目標函數系數來確定 A=[9 7;7 20];%約束條件左邊約束 b=[56 70];%約束條件右邊系數 %lb=zeros(2,1);% 生成一個2行1列的全0矩陣,很顯示,上面例子中的x,y的最小值為0 %intcon=[1,2];%整數約束變量的位置 %[x,fval,exitflag]=intlinprog(c,intcon,A,b,[],[],lb,[]) %用矩陣lb求不用設置上限lb=[0;0];%下限依然都為0 ub=[inf;inf];%x1沒有上限,x2沒有上限 intcon=[1,2];%整數約束變量的位置 [x,fval,exitflag]=intlinprog(c,intcon,A,b,[],[],lb,ub) %此時需要設置上下限

    結果2:最優解:x1 = 4 ,x2 = 2 ;最優值:340?

    至于結果為負是因為matlab求解線性規劃轉化為求最小值


    ?求解實現3:

    linprog函數及其參數的意義請看建模學習打卡第一天_菜菜笨小孩的博客-CSDN博客

    簡單介紹下,首先MATLAB中求解的是目標函數是最小值的問題,但如果我們的目標函數是求最大值,可以通過對目標函數中每一項中乘以-1,將求最大值問題轉化為求最小值問題;A,b分別為不等式約束中的系數矩陣。Aeq和beq分別為等式約束中的系數矩陣,lb,和ub分別為每個變量的上下區間;最后c為目標函數中各變量的系數矩陣。

    1.首先我們需要定義一個滿足分支定理條件的函數:

    %A,b,c分別對應此題的不等式約束系數矩陣,不等式約束常數向量,目標函數系數向量 %Aeq 等式約束系數矩陣, Beq 等式約束常數向量 %vlb 定義域的下界 vub 定義域的上界 %optXin 每次迭代的最優x optF 每次迭代最優的f值 iter迭代次數function [xstar, fxstar, flagOut, iter] = BranchBound1(c,A, b, Aeq, Beq, vlb, vub, optXin, optF, iter)global optX optVal optFlag;%將最優解定義為全局變量iter = iter + 1;optX = optXin; optVal = optF;%更新迭代得到的值% options = optimoptions("linprog", 'Algorithm', 'interior-point-legacy', 'display', 'none');[x, fit, status] = linprog(c,A, b, Aeq, Beq, vlb, vub, []);%status返回算法迭代停止原因%status = 1 算法收斂于解x,即x是線性規劃的最優解if status ~= 1%沒有找到最優解,此分支不用繼續迭代下去,返回xstar = x;fxstar = fit;flagOut = status;return;endif max(abs(round(x) - x)) > 1e-3%找到的函數最優解仍不是整數解if fit > optVal %此題求解的是max,此時的函數值大于之前解得的值xstar = x;fxstar = fit;flagOut = -100;return;endelse%此時解得的函數解為整數解,此分支求解結束,不再繼續向下求解,返回if fit > optVal %此題求解的是max,此時的函數值大于之前解得的值xstar = x;fxstar = fit;flagOut = -101;return;else %解出的值<之前解得的值,先放入全局變量中暫時存放optVal = fit;optX = x;optFlag = status;xstar = x;fxstar = fit;flagOut = status;return;endendmidX = abs(round(x) - x);%得到x對應的小數部分notIntV = find(midX > 1e-3);%得到非整數的x的索引值,find()函數返回非0的索引值pXidx = notIntV(1);%得到第一個非整數x的下標索引tempVlb = vlb;%臨時拷貝一份tempVub = vub;%fix(x) 函數將x中元素零方向取整if vub(pXidx) >= fix(x(pXidx)) + 1%原上界大于此時找到的分界的位置值tempVlb(pXidx) = fix(x(pXidx)) + 1;%將這個分界位置值作為新的下界參數傳入,進一步遞歸[~, ~, ~] = BranchBound1(c,A, b, Aeq, Beq, tempVlb, vub, optX, optVal, iter + 1);endif vlb(pXidx) <= fix(x(pXidx))%原下界小于此時找到的分界的位置值tempVub(pXidx) = fix(x(pXidx));%將這個分界位置值作為新的上界參數傳入,進一步遞歸[~, ~, ~] = BranchBound1(c,A, b, Aeq, Beq, vlb, tempVub, optX, optVal, iter + 1);endxstar = optX;fxstar = optVal;flagOut = optFlag; end

    2.調用上面函數對問題進行求解:

    %A,b,c分別對應此題的不等式約束系數矩陣,不等式約束常數向量,目標函數系數向量 %Aeq 等式約束系數矩陣, Beq 等式約束常數向量 %lb 定義域的下界 ub 定義域的上界clear all clcA = [9 7;7 20]; b = [56 70]; c = [-40,-90];%標準格式是求min,此題為max,需要轉換一下lb = [0; 0];%x值的初始范圍下界 ub=[inf;inf];%x值的初始范圍上界optX = [0; 0];%存放最優解的x,初始迭代點(0,0) optVal = 0;%最優解 [x, fit, exitF, iter] = BranchBound1(c,A, b,[], [], lb, ub, optX, optVal, 0)

    結果3:最優解:x1 = 4 ,x2 = 2 ;最優值:340?

    至于結果為負是因為matlab求解線性規劃轉化為求最小值

    總結:

    綜上所述:最優解:x1 = 4 ,x2 = 2 ;最優值:340? 為正解;本次通過學習分支界定法求整數線性規劃,學了很長時間,最終功夫不負有心人啊!!如果本文章有錯誤問題,請大家指出!!感謝!

    總結

    以上是生活随笔為你收集整理的整数线性规划实现(matlab分枝界定法)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。