案例求下列函數的最小值:
約束條件如下:
,
的取值範圍為(wei) :-100~100
,
的取值範圍為(wei) :0~10
MATLAB代碼
1.首先創建函數optimization.m
%首先要先不等式轉換為(wei) 標準形式
%f:目標函數
%A,b:線性不等式約束
%lb,ub:決(jue) 策變量上下界
%c,ceq:非線性不等式約束與(yu) 非線性等式約束
%目標函數一定要轉換為(wei) min類型的
%如果是max類型,需要把係數全部取負,並且將最後的結果*-1,得到正確的結果
functionf=optimization(x)
f=(x(1)-2)^2+(x(2)-1)^2+(x(3)-7)^2 +(x(4)-9)^2
end
%保存一下
2.開始編寫(xie) 約束條件變量
%%看看A和b
%min f(x) = (x1-2)^2+(x2-1)^2+(x4-9)^2
%x1-2x2+x3-x4+1>=0
%2x1+x2-2x3+x4+5>=0
%x1^2/4-x2^2+x3-x4^2+1>=0
%x1^2+x2-x3+x4=99
%x1,x2的取值範圍為(wei) -100~100
%x3,x4的取值範圍為(wei) 0~10
A= [-1 2 -1 1;-2 1 2 -1]; % 因為(wei) 原式是>=,同樣也需要轉換成<=的形式
b= [-1;5]; % b是線性不等式約束的右側(ce) 的值,因為(wei) 移過去再乘以-1,所以相當於(yu) 沒變
%%Aeq和beq
%本約束條件中未出現線性等式約束,所以可賦值為(wei) 空
Aeq= [];
beq= [];
%%lb和ub
%決(jue) 策變量的上下界
lb= [-100 -100 0 0]; % 表示x1~x4的最小值分別為(wei) -100-100 0 0
ub= [100 100 10 10];
%%c和ceq
%非線性不等式約束和非線性等式約束我們(men) 也要放進一個(ge) 專(zhuan) 門的函數裏麵
3.編寫(xie) 非線性不等式約束和非線性等式約束代碼函數myfun
function[c,ceq] = myfun(x)
%c是非線性不等式約束
c= -1*(1/4*x(1)^2-x(2)^2+x(3)-x(4)^2+1); % 轉換成小於(yu) 等於(yu)
%ceq是非線性等式約束
ceq= x(1)^2+x(2)-x(3)+x(4)-99;
%如果c和ceq不止一個(ge) ,那麽(me) 可以寫(xie) 成矩陣的形式:類似A= [-1 2 -1 1;-2 1 2 -1];
End
4.執行一下約束條件變量,如下圖:
5.在命令行中輸入optimtool打開遺傳(chuan) 算法工具箱。
遺傳(chuan) 算法工具箱操作
- 首先選擇遺傳算法
- fitness function是目標函數
- Number of variables:變量的個數
- Integer variable indices:可取整數的變量的下標,這裏沒有可以取變量的整數
在工具箱中輸入內(nei) 容如下:
- 作圖可以勾選前三個,把display to command window 改為迭代
然後點擊Start:
點擊start之後會(hui) 出現下麵這個(ge) 圖:
在這裏由於(yu) 迭代次數太少導致從(cong) 圖中看不出什麽(me) 明顯的結果。然後在start下麵的表格內(nei) ,有最優(you) 值和各個(ge) 變量的值。
然後最優(you) 值和其變量的值已經解出來了,可以多求幾次求平均值,都是可以的。
遺傳(chuan) 算法工具箱不允許規劃類方程中,同時出現線性約束和整型約束的,否則特別容易得到無解,甚至不能運行。
評論已經被關(guan) 閉。