我正在研究Matlab中的优化问题,但不幸的是,我被困住了。 我想使用函数fmincon最大化\ theta,但是这个特殊问题取决于$ n $,$ n $可以变得非常大。有$ n-1 $不等式约束,所有约束都用以下关系定义:
For all i \neq j \leq n : \theta - (x_i - x_j)^2 - (y_i - y_j)^2 \leq 0.
所以$ c(x)$是一个(n-1)x1 - 向量。
我正在寻找实现此方法的方法,因此我不必为每个不同的$ n $编写新的matlab文件。 (正如你可以想象的那样,当n变大时,那将是一个工作)
任何帮助都会非常感激。 干杯!
编辑:我现在已经创建了一个额外的m.file,仅用于此约束:
function constraint(n)
%this is a function which creates the constraints of the distance.
for i= 1: n
for j= 1:n
if j==i
continue;
end
(x(i)-x(j))^2 + (y(i)-y(j))^2;
end
end
但现在的问题是matlab逐个遍历这些元素。例如:它不计算(x(1) - x(4))^ 2 +(y(1) - y(4))^ 2。
关于如何解决这个问题的任何想法? 再次感谢!
答案 0 :(得分:0)
我没有看到你的功能在某些时候不会计算出这个值(当i = 1且j = 4时)。主要问题似乎是您的函数没有返回任何内容,或接受x
。根据{{3}},约束函数应该返回两件事:
非线性约束函数必须同时返回c和ceq 不平等和平等约束函数,即使它们不兼而有之 存在。返回空[]表示不存在的约束。
首先,我们需要确保将约束保存到输出向量c
中,返回c
并返回空ceq
,并且我们的函数同时采用{ {1}}和x
。可能有更漂亮的方法,但
n
下一个问题:此函数需要两个输入,但function [c, ceq] = constraint(x,n)
%this is a function which creates the constraints of the distance.
counter = 1;
for i= 1: n
for j= 1:n
if j==i
continue;
end
c(counter)=(x(i)-x(j))^2 + (y(i)-y(j))^2;
c = c+1;
end
end
ceq = [];
end
作为nonlcon
的输入只需要一个fmincon
。我们通过将此函数包装在匿名函数中来解决此问题(x
需要预定义),因此在实际的n
调用中,您将其设置为fmincon