使用python优化一组数据。
以下数据集可用 x,y,f(x),f(y)。
要优化的功能(最大化): f(x,y)= f(x)* y - f(y)* x
基于以下约束:
V> = sqrt(f(x)^ 2 + f(y)^ 2)
I> = sqrt(x ^ 2 + y2)
其中V和I是常数。
任何人都可以让我知道我需要使用哪种优化模块?根据我的理解,我需要执行离散优化,因为我已经为x,y,f(x)和f(y)设置了f值。
答案 0 :(得分:1)
使用复杂的优化器(http://docs.scipy.org/doc/scipy/reference/optimize.html)来解决这个问题是个不错的主意。
这看起来像一个问题,可以在O(n^2)
n=max(|x|,|y|)
下轻松解决,只需:
x,y,f(x),f(y)
创建sorted(x), sorted(y), sorted(f(x)), sorted(f(y))
x
找到sorted(y)
中I^2 >= x^2+y^2
占有的位置,f(x)
和sorted(f(y))
以及V^2 >= f(x)^2 + f(y)^2
的位置(两个二进制)搜索,I^2 >= x^2+y^2 <=> |y| <= sqrt(I^2-x^2)
,以便您可以在恒定时间内找到&#34;屏障&#34;然后使用bin搜索来查找最接近的实际数据点&#34;在不平等的右侧&#34; 34)sorted(x)
和每个x
:
y
和f(y)
的元素并丢弃(在此循环中)不在步骤2中找到的borth间隔的点。(线性复杂度)x_max,y_max
最大化的参数对f(x_max,y_max)
x_max,y_max
总复杂度低于二次,因为步骤1需要O(nlgn)
,步骤2中的每次循环迭代都是O(lgn)
所以整个步骤2需要O(nlgn)
,步骤3中的循环是{ {1}}和第3步的第一个子步骤中的循环是O(n)
(但在现实生活中它应该由于约束而几乎不变),这使得整个算法O(n)
(并且在大多数情况下它将表现为O(n^2)
)。它也不依赖于O(nlgn)
的定义(它将它用作黑盒子),因此您可以通过这种方式优化任意函数。