Re: [問題] 非線性規劃 主副程式變數使用問題已回收

看板MATLAB作者 (放空ing)時間15年前 (2010/08/17 09:19), 編輯推噓2(204)
留言6則, 2人參與, 最新討論串3/5 (看更多)
※ 引述《sindyddd ()》之銘言: : 整個問題阿.... : 目標函數 為線性, 限制式為線性(4條)與非線性混合(2條) : max 0.5*bet_B + 0.5* bet_d : bet_B,bet_d ,u, z_B ,z_F ^^^^^^^^^^^^^^^^^^^^^^^ [K*1] 你要使用 fmincon 做最佳化計算時, 他會搜尋目標函數(objfun)的最小值 因此你需要修改一下你在 fmincon 中所使用的目標函數(objfun)輸出的結果 確認當一組未知變數 [x], 能得到目標函數(objfun)的最小值 同時也能得到你原本問題中目標函數的最大值 : subject to X_B * z_B + X_B(:,i) * bet_B 小於等於 X_B(:,i) ^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^ ^^^^^^^^^ [v*K] + [v*1]*[K*1] ?!? <= [v*1] ?!?!? : Y_I * z_F 小於等於 Y_I(:,i) ^^^^^^^^^ ^^^^^^^^ [r*K] <= [r*1] ?!?!??! : 由限制式可以看到 X_B 和 Y_I和 u 都有部分的值特別拿出來做處理 : 因此當初用迴圈的概念 每一次做完 都有一個結果跑出來 : 從整個結果來看的話 : 未知數: bet_B,bet_d 都是 K*1 的矩陣 ; u是c*K ; z_B ,z_F 是 K*K : 已知數: X_B 是 v*K ; X_BF 是 c*K ; Y_I 是 r*K : 每個矩陣大小都不一樣.... : 在執行檔的部分 先寫上限制式為線性的程式 最後再寫上這個: : [result(i,:),fval(i)]=fmincon(@DMNDEA,x0,A,B,Aeq,Beq,lb,ub,@DMN_confun); : 目標函數 和非線性限制式 就另外寫 : 可是後來w大說 fmincon只能用於單變數 : 那請問是要 令成這樣嗎? x=[ bet_B,bet_d ,u, z_B ,z_F ]; : x好像可以是x(1) x(2).... 請問他可以用成矩陣表示嗎? from help : fmincon attempts to find a constrained minimum of a scalar function several variables starting at an initial estimate. This is generally referred to as constrained nonlinear optimization or nonlinear programming. 應該是說 y = objfun(xi) i = 1 ~ n y 需為一個純數, xi 變數可以有很多個 當你要將 xi 輸入你的 objective function 計算時 依你的問題以單一變數, 一個向量, 或是一個矩陣的方式整理所有未知數的元素 的初始猜值, 之後輸入 fmincon 計算結果應該也會依照你輸入 [xi] 的形式輸出 在目標函數(objfun)內計算時, 將輸入的 [xi] 重新組成 bet_B, bet_d, z_B, z_F 矩陣, 以及 u 向量 經過計算之後得到一個目標函數純數 (y) 回傳給 fmincon : 接下來可能要把那些變數拼湊在一起 成一個x矩陣了 這樣對嗎? : 所以上面這個動作 是在執行檔做嗎 目標函數和非線性限制式就都用x表示? 看完你的文章, 感覺你要進行很多個最佳化計算 請先確認一下你每一個最佳化計算中 目標函數計算的正確性 當你使用 fmincon 進行一次最佳化計算時 限制式的條件在你呼叫 fmincon 時就要給定了 當他在計算的時候, 你要更改限制條件的話 可能需要修改到 fmincon 的程式碼 : 那關於線性限制式的迴圈 如果先在迴圈前那些變數弄成x後 : 迴圈內皆用x表示 會不會有影響? : 還是厲害的大家有甚麼建議? (感覺整個要重寫>"< 天阿...) (X)通常加入不等式限制條件會增加計算上的時間, 修改為 : 加入不等式限制條件會減少計算上的時間, 看了你的問題之後我有三個想法 如果你的目標函數的計算結果是正確的 !! 想法1. 先不考慮拘束條件, 使用 fmincon 並改變多個 [xi] 的初始猜值, 以及求解的邊界範圍, 求得數個區域性最佳解, 之後利用拘束條件挑選結果 想法2. 更改 fmincon 在使用 SQP 方法求解最佳化問題時, 在每個 QP 子計算工作中 使用更節省計算資源的演算方法, 如 ex : options = optimset('Algorithm', 'interior-point'); 其中 Algorithm 可選擇的有 'active-set' | 'interior-point' | {'trust-region-reflective'} ^^^^^^^^^^^^^^^^^^^^^^^^^ 預設 當你使用 fmincon 時, 請輸入設定好的 options, 如 x = fmincon(fun,x0,A,b,Aeq,beq,lb,ub,nonlcon,options); 其他 options 的設定, 你可以查詢 help-> optimset (Optimization Toolbox) 想法3. 更改計算 Hessian Matrix (目標函數對各個未知變數的2次偏微分矩陣) 的方法 或自行給定計算 Heissan Matrix 的方法 這個在你未知變數數目很多, 且計算一次目標函數的時間很久的時候 才有需要做這樣的設定.. 沒做更改的話 fmincon 會使用數值方法, 預估計算 Hessian Matrix help-> optimset (Optimization Toolbox) 有關 Hessian : 謝謝大家了!!! 加油~~ -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.123.123.158

08/17 12:05, , 1F
想問一下,如果fmincon找不到符合的解,會有回傳值可以判斷嗎?
08/17 12:05, 1F

08/17 13:08, , 2F
[x,fval,exitflag,output] = fmincon(...)
08/17 13:08, 2F

08/17 13:09, , 3F
留意 output 裡面的訊息, 說明他輸出的 x 跟 fval 的準則
08/17 13:09, 3F

08/17 15:07, , 4F
了解,不過有辦法寫在code裡作if判斷?應該是constrviolation這
08/17 15:07, 4F

08/17 15:09, , 5F
項顯示吧? 最近也在使用這個tool,運算速度真的滿慢的
08/17 15:09, 5F

08/17 15:23, , 6F
問題解決了,可以用exitflag作判斷 回傳值-2 就是找不到符合值
08/17 15:23, 6F
※ 編輯: hilosi 來自: 140.123.123.158 (09/07 20:29)
文章代碼(AID): #1CQUEkYc (MATLAB)
討論串 (同標題文章)
文章代碼(AID): #1CQUEkYc (MATLAB)