Я пишу программу для оптимизации проблемы упаковки, используя алгоритм Роберта Ланга со своей веб-страницы: https://langorigami.com/wp-content/uploads/2015/09/ODS1e_Algorithms.pdf
Это используется для разработки моделей оригами, и это проблема упаковки кругов с ограничениями и различными радиусами.
Я создал пример с 5 узлами, где 4 из них являются терминальными.
Глядя на эти определения , включенные в предыдущий алгоритм, я хочу работать с 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]
Ввод x для функции fmincon, из-за отказа матрицы, я использую его следующим образом:
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], когда это не должно быть. Смотрите вывод здесь .
Большое вам спасибо в совете.