与分段函数相关的Python优化算法
我有一类分段函数f(p,q,x),它由列表q和p决定。与分段函数相关的Python优化算法,python,algorithm,optimization,Python,Algorithm,Optimization,我有一类分段函数f(p,q,x),它由列表q和p决定。 例如,当x在[0,3]之间时,以下平均值f为100,当x在(3,5)之间时,以下平均值f为95。 p q 1003 952 906 def f(p,q,x): y=0 for i in range(len(p)): y+=q[i] if y>=x: return p[i] return p[len(p)-1] pa=[92,94,104] qa=[4,2,3] pb=[100,95,90] qb=[
例如,当x在[0,3]之间时,以下平均值f为100,当x在(3,5)之间时,以下平均值f为95。
p q
1003
952
906
def f(p,q,x):
y=0
for i in range(len(p)):
y+=q[i]
if y>=x:
return p[i]
return p[len(p)-1]
pa=[92,94,104]
qa=[4,2,3]
pb=[100,95,90]
qb=[3,2,6]
x=0
for i in range(min(sum(qa),sum(qb))):
if f(pa,qa,i)<f(pb,qb,i):
x=i
else:
break
print(x)
我的问题是找到满足f(pa,qa,x)
def f(p,q,x):
y=0
for i in range(len(p)):
y+=q[i]
if y>=x:
return p[i]
return p[len(p)-1]
pa=[92,94,104]
qa=[4,2,3]
pb=[100,95,90]
qb=[3,2,6]
x=0
for i in range(min(sum(qa),sum(qb))):
if f(pa,qa,i)<f(pb,qb,i):
x=i
else:
break
print(x)
我可以想出下面这样一个天真的解决方案
def f(p,q,x):
y=0
for i in range(len(p)):
y+=q[i]
if y>=x:
return p[i]
return p[len(p)-1]
pa=[92,94,104]
qa=[4,2,3]
pb=[100,95,90]
qb=[3,2,6]
x=0
for i in range(min(sum(qa),sum(qb))):
if f(pa,qa,i)<f(pb,qb,i):
x=i
else:
break
print(x)
定义f(p,q,x):
y=0
对于范围内的i(len(p)):
y+=q[i]
如果y>=x:
返回p[i]
返回p[len(p)-1]
pa=[92,94104]
qa=[4,2,3]
pb=[100,95,90]
qb=[3,2,6]
x=0
对于范围内的i(最小值(总和(qa),总和(qb)):
如果f(pa,qa,i),因为这两个函数有不同的步骤,您可能无法使用范围。您需要查看qa/qb以确定下一个x,并且只计算不同的值。执行f(x+1)没有意义如果您知道任何函数都不会在该范围内更改。并且因为您想要最大的x,您可能希望从高端开始,然后再返回。浮点的问题是您需要为范围函数指定一个整数。快速解决方法就是int()或math.ceil()。然后,只要fa增加而fb减少,您的解决方案就可以工作。但我认为这对于任意输入是不正确的,但您说您对它们进行排序以强制执行该条件,所以没有问题。这意味着您也可以在该范围内进行二进制搜索,尽管这可能会较慢,除非您为步骤建立查找表。(建立查找表的工作可能与实际解决整个问题的工作相同)感谢您的建议。事实上,范围内i的部分(min(sum(qa),sum(qb))还有改进的余地。还有f(p,q,x)的编写方式(每次都从第一项开始计算)。因此我尝试将两者合并到一个循环中(使用a和b的指数)。这提高了性能,但使代码更加冗长,不易理解。我现在正在寻找性能和优雅的东西。由于这两个函数有不同的步骤,您可能无法使用范围。您需要查看qa/qb以确定下一个x,并且只计算不同的值。没有意义使用f(x+1)如果您知道任何函数都不会在该范围内更改。并且因为您想要最大的x,您可能希望从高端开始,然后再返回。浮点的问题是您需要为范围函数指定一个整数。快速解决方法就是int()或math.ceil()。然后,只要fa增加而fb减少,您的解决方案就可以工作。但我认为这对于任意输入是不正确的,但您说您对它们进行排序以强制执行该条件,所以没有问题。这意味着您也可以在该范围内进行二进制搜索,尽管这可能会较慢,除非您为步骤建立查找表。(建立查找表的工作可能与实际解决整个问题的工作相同)感谢您的建议。事实上,范围内i的部分(min(sum(qa),sum(qb))还有改进的余地。还有f(p,q,x)的编写方式(每次都从第一项开始计算)。因此我尝试将两者合并到一个循环中(使用a和b的索引)。这提高了性能,但使代码更冗长,更不容易理解。我现在正在寻找性能和优雅的东西。