2024-04-20 04:37:03 发布
网友
使用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值。你知道吗
对这样的问题使用复杂的优化器(http://docs.scipy.org/doc/scipy/reference/optimize.html)是一个相当糟糕的主意。你知道吗
这看起来是一个很容易在O(n^2)下解决的问题,其中n=max(|x|,|y|),简单地说:
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)
sorted(x)
y
f(y)
x_max,y_max
总的复杂度是二次的,因为第一步是O(nlgn),第二步循环的每次迭代都是O(lgn),所以整个第二步都是O(nlgn),第三步循环是O(n),第三步第一个子步循环是O(n)(但在现实生活中,由于约束,它应该几乎是常数),这使得整个算法O(n^2)(和在大多数情况下,它将表现为O(nlgn))。它也不依赖于f(x,y)的定义(它将其用作黑盒),因此您可以通过这种方式优化任意函数。你知道吗
O(nlgn)
O(lgn)
O(n)
f(x,y)
对这样的问题使用复杂的优化器(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)
这样您就可以在恒定的时间内找到“屏障”,然后使用bin搜索来找到最接近“不等式右侧”的实际数据点)sorted(x)
并针对每个x
:y
和f(y)
的元素,并丢弃(在这个循环中)不在步骤2中找到的borth区间的点。(线性复杂度)x_max,y_max
总的复杂度是二次的,因为第一步是
O(nlgn)
,第二步循环的每次迭代都是O(lgn)
,所以整个第二步都是O(nlgn)
,第三步循环是O(n)
,第三步第一个子步循环是O(n)
(但在现实生活中,由于约束,它应该几乎是常数),这使得整个算法O(n^2)
(和在大多数情况下,它将表现为O(nlgn)
)。它也不依赖于f(x,y)
的定义(它将其用作黑盒),因此您可以通过这种方式优化任意函数。你知道吗相关问题 更多 >
编程相关推荐