fmincon: objective 这个功能?
fmincon: objective function for this?
我正在编写一个程序来使用 Robert Lang 网页上的算法优化打包问题:https://langorigami.com/wp-content/uploads/2015/09/ODS1e_Algorithms.pdf
这是用来设计折纸模型的,这是一个来自具有约束和不同半径的圆包装的问题。
我创建了一个包含 5 个节点的 example,其中 4 个是终端节点。
查看前面算法中包含的这些 definitions,我想使用 Scale Optimization (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) 在 {m,ui ∈ Ut} s.t.: (A-2)
1.- 0 ≤ ui,x ≤ w 对于所有 ui ∈Ut (A-3)
2.- 0 ≤ ui,y ≤ h 对于所有 ui ∈Ut (A-4)
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 还是类似的东西?
编辑:这样的输出总是 [0 0 0 0 0 0 0 0 0 0] 而它不应该。见 output here.
非常感谢您的建议。
更多观察。
我们可以通过去掉平方根来稍微简化一下。所以约束看起来像:
set c = {x,y}
maximize m2
m2 * sqrpathlen(ut,vt) <= sum(c, sqr(pos(ut,c)-pos(vt,c))) for all paths ut->vt
其中 m2 是 m 的平方。
这确实是非凸的。使用全局求解器,我得到了解决方案:
---- 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) 和 pos(u2,y) 为零)。
使用 0 作为起点的局部求解器,我们发现我们根本没有移动:
---- 83 VARIABLE m2.L = 0.000 m^2, with m=scale
PARAMETER m = 0.000
---- 83 VARIABLE pos.L positions
( ALL 0.000 )
我正在编写一个程序来使用 Robert Lang 网页上的算法优化打包问题:https://langorigami.com/wp-content/uploads/2015/09/ODS1e_Algorithms.pdf
这是用来设计折纸模型的,这是一个来自具有约束和不同半径的圆包装的问题。
我创建了一个包含 5 个节点的 example,其中 4 个是终端节点。 查看前面算法中包含的这些 definitions,我想使用 Scale Optimization (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) 在 {m,ui ∈ Ut} s.t.: (A-2)
1.- 0 ≤ ui,x ≤ w 对于所有 ui ∈Ut (A-3)
2.- 0 ≤ ui,y ≤ h 对于所有 ui ∈Ut (A-4)
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 还是类似的东西?
编辑:这样的输出总是 [0 0 0 0 0 0 0 0 0 0] 而它不应该。见 output here.
非常感谢您的建议。
更多观察。
我们可以通过去掉平方根来稍微简化一下。所以约束看起来像:
set c = {x,y}
maximize m2
m2 * sqrpathlen(ut,vt) <= sum(c, sqr(pos(ut,c)-pos(vt,c))) for all paths ut->vt
其中 m2 是 m 的平方。
这确实是非凸的。使用全局求解器,我得到了解决方案:
---- 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) 和 pos(u2,y) 为零)。
使用 0 作为起点的局部求解器,我们发现我们根本没有移动:
---- 83 VARIABLE m2.L = 0.000 m^2, with m=scale
PARAMETER m = 0.000
---- 83 VARIABLE pos.L positions
( ALL 0.000 )