与分段函数相关的Python优化算法

与分段函数相关的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=[

我有一类分段函数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=[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的索引)。这提高了性能,但使代码更冗长,更不容易理解。我现在正在寻找性能和优雅的东西。