【问题标题】:Solve optimization using fmincon MATLAB when objective function is in constraints当目标函数受约束时,使用 fmincon MATLAB 求解优化
【发布时间】:2016-02-21 01:04:54
【问题描述】:

我要解决:

我使用以下 MATLAB 代码,但它不起作用。

有人可以指导我吗?

function f=objfun

f=-f;

function [c1,c2,c3]=constraint(x)
a1=1.1; a2=1.1; a3=1.1;
c1=f-log(a1)-log(x(1)/(x(1)+1)); 
c2=f-log(a2)-log(x(2)/(x(2)+1))-log(1-x(1)); 
c3=f-log(a3)-log(1-x(1))-log(1-x(2));


x0=[0.01;0.01]; 
[x,fval]=fmincon('objfun',x0,[],[],[],[],[0;0],[1;1],'constraint')

【问题讨论】:

  • 你对 objfun 的定义对我来说没有任何意义......
  • 不工作意味着什么。具体有什么问题?
  • 如何定义obtfun' since it is not function of x'?这就是我苦苦挣扎的地方。
  • 将 T 替换为 x3,它应该是有意义的。 T 只是另一个选择变量。

标签: matlab optimization minimization


【解决方案1】:

也可以在convex optimization package CVX 中使用以下 MATLAB 代码解决这个问题:

cvx_begin
 variables T(1);
 variables x1(1);
 variables x2(1);

 maximize(T)
 subject to:
  log(a1) + x1 - log_sum_exp([0, x1]) >= T;
  log(a2) + x2 - log_sum_exp([0, x2]) + log(1 - exp(x1)) >= T;
  log(a3) +  log(1 - exp(x1)) +  log(1 - exp(x2)) >= T;
  x1 <= 0;
  x2 <= 0;
cvx_end
l1 = exp(x1); l2 = exp(x2);

要使用 CVX,每个约束和目标函数都必须使用 CVX 的规则集以可证明凸的方式编写。进行替换 x1 = log(l1)x2 = log(l2) 允许这样做。注意:log_sum_exp([0,x1]) = log(exp(0) + exp(x1)) = log(1 + l1)

这也会返回答案:l1 = .3383, l2 = .6180, T = -1.2800

【讨论】:

    【解决方案2】:

    您需要稍微翻转一下这个问题。您正试图找到使 3 个 LHS 函数中的最小值最大的点 x(即 (l_1,l_2))。所以,你可以用伪代码重写你的问题,

    maximise, by varying x in [0,1] X [0,1]
           min([log(a1)+log(x(1)/(x(1)+1)) ...
                log(a2)+log(x(2)/(x(2)+1))+log(1-x(1)) ...
                log(a3)+log(1-x(1))+log(1-x(2))])
    

    由于Matlab有fmincon,把这个改写成最小化问题,

    minimise, by varying x in [0,1] X [0,1]
           max(-[log(a1)+log(x(1)/(x(1)+1)) ...
                 log(a2)+log(x(2)/(x(2)+1))+log(1-x(1)) ...
                 log(a3)+log(1-x(1))+log(1-x(2))])
    

    所以实际的代码是

    F=@(x) max(-[log(a1)+log(x(1)/(x(1)+1)) ...
                 log(a2)+log(x(2)/(x(2)+1))+log(1-x(1)) ...
                 log(a3)+log(1-x(1))+log(1-x(2))])
    [L,fval]=fmincon(F,[0.5 0.5])
    

    返回

    L =
        0.3383    0.6180
    fval =
        1.2800
    

    【讨论】:

    • 谢谢@David !!!当我运行你的代码时,它说FMINCON requires at least four input arguments. 你的代码中缺少什么?
    • 这很奇怪,我只有a1=1.1;a2=1.1;a3=1.1;这一行。
    • 你一定有不同版本的Matlab,我这里有2015a。 fmincon 应该接受超过 2 个参数,它会进行约束优化,所以我猜它应该需要约束。试试这个:[L,fval]=fmincon(F,[0.5 0.5],[],[],[],[],[0 0],[1 1]).
    • 谢谢@David !!!它真的很有帮助,我实际上需要这个问题来处理任何 N 个约束。我已经尝试了三个,并且有效:[x,fval]=fmincon(F,[0.5 0.5 0.5],[],[],[],[],[0;0;0],[1;1;1])。祝你有美好的一天 !!!顺便说一句,您是否有任何想法修改我的方法,只是好奇,但没有必要:)
    • 是的,这是获得更多 L 的正确方法,对于更多约束,您只需通过为新约束添加新行来更改 F
    猜你喜欢
    • 2013-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多