简体   繁体   中英

fmincon: objective function for this?

I'm writing a program to optimize a packing problem using Robert Lang's algorithm from his webpage: https://langorigami.com/wp-content/uploads/2015/09/ODS1e_Algorithms.pdf

This is used to design origami models and it's a problem from circle packing with constraints and different radius.

I have created an example with 5 nodes, where 4 of them are terminal. Looking at these definitions included in the previous algorithm, I want to work with the Scale Optimization (A.3) .

According to the notation, in my example I have:

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

And if I assume that σ is equal to 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.

So now, with all this defined, I have to optimize the scale. For that, I should:

Minimize (-m) over {m,ui ∈ Ut} st: (A-2)

1.- 0 ≤ ui,x ≤ w for all ui ∈Ut (A-3)

2.- 0 ≤ ui,y ≤ h for all ui ∈Ut (A-4)

3.- (A-5) from webpage I provided.

So, in the example, merging (A-3) and (A-4) we can set the Lb and Ub for the fmincon function such as:

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

The input x for the fmincon function, due to refusing matrix, I'm using it like:

X = [x1 x2 x3 x4 y1 y2 y3 y4] , that's why Lb and Ub has that form.

About the (A-5) , we get this set of inequalities:

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

My main program is testFmincon.m :

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

I implemented the optimizer in the file 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);

Where Objs2.m is:

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

And Objs.m file is:

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

But I doesn't work correctly, I think I'm using wrong the fmincon function. I don't know neither how to optimize (-m) ... should I use syms m or something like that?

edit: The output like this is always [0 0 0 0 0 0 0 0 0 0] when it shouldn't. See the output here .

Thank you so much in advice.

Some more observations.

We can simplify things a little bit by getting rid of the square root. So the constraints look like:

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

where m2 is the square of m.

This is indeed non-convex. With a global solver I get as solution:

----     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

(pos(u2,x) and pos(u2,y) are zero).

With a local solver using 0 as starting point, we see we don't move at all:

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

----     83 VARIABLE pos.L  positions

                      ( ALL       0.000 )

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM