fmincon:为此的目标函数?

时间:2019-04-03 10:19:33

标签: matlab optimization nonlinear-optimization nonlinear-functions packing

我正在从他的网页https://langorigami.com/wp-content/uploads/2015/09/ODS1e_Algorithms.pdf

编写一个程序,使用Robert Lang的算法来优化包装问题。

这用于设计折纸模型,这是约束和半径不同的圆形填充的问题。

我创建了一个具有5个节点的example,其中4个是终端节点。 查看先前算法中包含的这些definitions,我想使用比例优化(A.3)

根据符号,在我的示例中,我有:

E = {e1, e2, e3, e4,}      ---> Edges
U = {u1, u2. u3, u4, u5}   ---> Vertices (Each one with x and y coordinates)
Ut = {u2, u3, u4, u5}      ---> Terminal Vertices

P = {[u1, u2], [u1, u3], [u1, u4], [u1, u5],
     [u2, u3], [u2, u4], [u2, u5],
     [u3, u4], [u4, u5]}   ---> All paths between vertices from U

Pt = {[u2, u3], [u2, u4], [u2, u5],
     [u3, u4], [u3, u5],
     [u4, u5]}             ---> All paths between terminal vertices Ut

如果我假设σ等于0:

L = {100, 50, 100, 100,
     150, 200, 200,
     150, 150,
     200}                   --> Length of the paths P

Note that the length of each path is in the same position of P.

现在,在定义了所有这些之后,我必须优化比例。 为此,我应该:

在{m,ui∈Ut} s.t .:(A-2)上最小化(-m)

1.- 对于所有ui∈Ut(A-3),0≤ui,x≤w

2.- 对于所有ui∈Ut(A-4)0≤ui,y≤h

我提供的网页上的

3.- (A-5)。

因此,在示例中,合并(A-3)和(A-4),我们可以将 Lb Ub 设置为fmincon函数,例如:

Lb = zeros(1,8)
Ub = [ones(1,4)*w, ones(1,4)*h]

fmincon函数的输入x,由于拒绝矩阵,我使用它的方式是:

X = [x1 x2 x3 x4 y1 y2 y3 y4] ,这就是Lb和Ub具有这种形式的原因。

关于(A-5),我们得到了这组不等式:

m*150 - sqrt((x(2)-x(3))^2 + (y(2)-y(3))^2) <= 0
m*200 - sqrt((x(2)-x(4))^2 + (y(2)-y(4))^2) <= 0
m*200 - sqrt((x(2)-x(5))^2 + (y(2)-y(5))^2) <= 0
m*150 - sqrt((x(3)-x(4))^2 + (y(3)-y(4))^2) <= 0
m*150 - sqrt((x(3)-x(5))^2 + (y(3)-y(5))^2) <= 0
m*200 - sqrt((x(4)-x(5))^2 + (y(4)-y(5))^2) <= 0

我的主程序是 testFmincon.m

[x,fval,exitflag] = Solver(zeros(1,10),zeros(1,10),ones(1,10)*700);
%% w = h = 700

我在文件 Solver.m 中实现了优化程序:

function [x,fval,exitflag,output,lambda,grad,hessian] = Solver(x0, lb, ub)
%% This is an auto generated MATLAB file from Optimization Tool.

%% Start with the default options
options = optimoptions('fmincon');
%% Modify options setting
options = optimoptions(options,'Display', 'off');
options = optimoptions(options,'Algorithm', 'sqp');
[x,fval,exitflag,output,lambda,grad,hessian] = ...
fmincon(@Objs,x0,[],[],[],[],lb,ub,@Objs2,options);

Objs2.m 在哪里:

function [c, ceq] = Objs2(xy)
length = size(xy);
length = length(2);
x = xy(1,1:length/2);
y = xy(1,(length/2)+1:length);

c(1) = sqrt((x(2) - x(3))^2 + (y(2)-y(3))^2) - m*150;
c(2) = sqrt((x(2) - x(4))^2 + (y(2)-y(4))^2) - m*200;
c(3) = sqrt((x(2) - x(5))^2 + (y(2)-y(5))^2) - m*200;
c(4) = sqrt((x(3) - x(4))^2 + (y(3)-y(4))^2) - m*150;
c(5) = sqrt((x(3) - x(5))^2 + (y(3)-y(5))^2) - m*150;
c(6) = sqrt((x(4) - x(5))^2 + (y(4)-y(5))^2) - m*200;

ceq=[x(1) y(1)]; %% x1 and y1 are 0.
end

Objs.m 文件为:

function c = Objs(xy)
length = size(xy);
length = length(2);
x = xy(1,1:length/2);
y = xy(1,(length/2)+1:length);

c(1) = sqrt((x(2) - x(3))^2 + (y(2)-y(3))^2) - m*150;
c(2) = sqrt((x(2) - x(4))^2 + (y(2)-y(4))^2) - m*200;
c(3) = sqrt((x(2) - x(5))^2 + (y(2)-y(5))^2) - m*200;
c(4) = sqrt((x(3) - x(4))^2 + (y(3)-y(4))^2) - m*150;
c(5) = sqrt((x(3) - x(5))^2 + (y(3)-y(5))^2) - m*150;
c(6) = sqrt((x(4) - x(5))^2 + (y(4)-y(5))^2) - m*200;

c = m*sum(c);
end

但是我不能正常工作,我认为我使用了错误的fmincon函数。 我不知道如何优化(-m)...我应该使用syms m之类的东西吗?

edit:不应该这样的输出始终为[0 0 0 0 0 0 0 0 0 0 0]。参见output here

非常感谢您的建议。

1 个答案:

答案 0 :(得分:0)

更多观察结果。

我们可以通过消除平方根来简化一些事情。因此约束看起来像:

composer install --no-dev

其中m2是m的平方。

这确实是非凸的。使用全局求解器可以得到解决方案:

set c = {x,y}
maximize m2
m2 * sqrpathlen(ut,vt) <= sum(c, sqr(pos(ut,c)-pos(vt,c))) for all paths ut->vt

(pos(u2,x)和pos(u2,y)为零)。

使用以0为起点的本地求解器,我们发现根本不动:

----     83 VARIABLE m2.L                  =       12.900  m^2, with m=scale
            PARAMETER m                    =        3.592  

----     83 VARIABLE pos.L  positions

             x           y

u3     700.000     700.000
u4     700.000     161.251
u5     161.251     700.000