Python 基于二进制选择器GEKKO的有界求和函数优化

Python 基于二进制选择器GEKKO的有界求和函数优化,python,optimization,gekko,Python,Optimization,Gekko,我试图优化求和函数。从一个类似的例子中,我找到了我问题的一半答案(我已经将我的目标函数与那个问题中的目标函数相似) 问题: 尝试: 从gekko导入gekko 将numpy作为np导入 来自scipy.special import factorial m=GEKKO(远程=False) x=m.sos1([1,2,3]) yb=m.Array(m.Var,3,lb=0,ub=1,integer=True) m、 方程(m.sum(yb)==1) y=m.sum([yb[i]*(i+1)表示范围

我试图优化求和函数。从一个类似的例子中,我找到了我问题的一半答案(我已经将我的目标函数与那个问题中的目标函数相似)

问题:

尝试:

从gekko导入gekko
将numpy作为np导入
来自scipy.special import factorial
m=GEKKO(远程=False)
x=m.sos1([1,2,3])
yb=m.Array(m.Var,3,lb=0,ub=1,integer=True)
m、 方程(m.sum(yb)==1)
y=m.sum([yb[i]*(i+1)表示范围(3)内的i)])
m、 方程(m.sum([yb[i]*(i+1)对于范围(3)中的i)]
y=2
,求和界限将是i=0到2。但我无法获得此行为。我无法使用
range(y)
运行for循环,因为它是一个变量,并且随着变量值的变化,它也会改变方程的大小

obj=m.exp(x)+x**0/yf[0]
对于范围(1,len(yb)+1)内的j:
obj+=x**j/yf[j]*yb[j-1]#只有当yb[j-1]=1时,它才是非零的,并且忽略了之前的值。
#没有它,我每次都在计算整个边界,改变yb没有影响。
m、 最大化(obj)
在工作解决方案中,Gekko如何给我正确的结果?当函数是以下约束时,如何重现此行为(即在for循环中不使用
m.maximize
)?谢谢

编辑: (修改了上面的Python代码)。下面的图说明了问题。考虑<代码> yb= [0,1,0] <代码> = >代码> y=2 < /code >。因此求和应该停止在<代码> i=0到1
< /p>。

如果
x
yb
是正常的列表,我可以很容易地做到这一点,那么我可以从下面得到预期的结果

将numpy导入为np
来自scipy.special import factorial
x=3
yb=[0,1,0]
y=np.sum([yb[i]*(i+1)表示范围(3)内的i)
yf=阶乘(np.linspace(0,len(yb),len(yb)+1))
obj=np.exp(x)
对于范围(0,y)内的j:
obj+=x**j/yf[j]
打印(obj)
如果我不希望最终方程的大小随变量而改变,我可以做以下操作

x=3
yb=[0,1,0]
y=np.sum([yb[i]*(i+1)表示范围(3)内的i)
yf=阶乘(np.linspace(0,len(yb),len(yb)+1))
obj=np.exp(x)
对于范围(0,y)内的i:
yb[i]=1
对于范围(0,len(yb))内的j:
obj+=(x**j/yf[j])*yb[j]
打印(obj)

我不能对Gekko同时执行这两个选项,因为
x
yb
是GK变量(设计变量),不能解释为整数(即
范围(y)
不起作用。有什么解决办法吗?谢谢。

由于没有任何回应,我将分享我提出的解决办法。这可能不是一种有效的方法,但很有效

m=GEKKO(remote=False)
x=m.sos1([1,2,3])
yb=m.Array(m.Var,3,lb=0,ub=1,integer=True)
m、 方程(m.sum(yb)==1)
y=m.sum([yb[i]*(i+1)表示范围(3)内的i)])
#m、 方程(范围(3)内i的m.sum([yb[i]*(i+1)])