Python 使用Gekko划分楼层

Python 使用Gekko划分楼层,python,mathematical-optimization,gekko,Python,Mathematical Optimization,Gekko,在这个优化问题(我的单变量简化版)中,我有一个变量,我试图最大化目标。答案应该是x=4,objfcnval等于2,因为随着x的增加,这些将是计算0-0,1-2=-1,2-2=0,3-2=1,4-2=2,5-4=1 代码如下: def my_天花板(标高1、标高2): 如果(elem1//elem2)==(elem1/elem2): 返回elem1/elem2 其他: 返回(elem1//elem2)+1 m=gekko.gekko(remote=False) m、 options.SOLVER=

在这个优化问题(我的单变量简化版)中,我有一个变量,我试图最大化目标。答案应该是x=4,objfcnval等于2,因为随着x的增加,这些将是计算0-0,1-2=-1,2-2=0,3-2=1,4-2=2,5-4=1

代码如下:

def my_天花板(标高1、标高2):
如果(elem1//elem2)==(elem1/elem2):
返回elem1/elem2
其他:
返回(elem1//elem2)+1
m=gekko.gekko(remote=False)
m、 options.SOLVER=1
x=m.Var(值=0,lb=0,ub=5,整数=True)
m、 Obj((-1)*(x-2*my_天花板(x,4)))
m、 求解(disp=False)
打印('Objective:'+str(-1)*m.options.objfcnval))
if(elem1//elem2)=(elem1/elem2):
TypeError:/:“GKVariable”和“int”的操作数类型不受支持
问题是这种操作显然不受支持。我将如何使用Gekko解决此类问题?

从中得到启发,实现floor函数的一种方法是创建一个新的整数变量
y
,该变量以
x/4>y>=x/4+1e-8
为界

导入壁虎
m=gekko.gekko(remote=False)
m、 options.SOLVER=1
x=m.Var(值=0,lb=0,ub=5,整数=True)
y=m.Var(lb=0,ub=5,integer=True)
m、 方程([y=x/4+1e-8])
m、 最大化((x-2*y))
m、 求解(disp=False)
打印(x值[0],y值[0])
打印('Objective:'+str(-1)*m.options.objfcnval))
这将为
x
y
和目标函数生成一个解决方案:

4.0 1.0
Objective: 2.0
如果
x
不是整数变量,但Gekko给出了一个稍微不同的答案,则此策略也有效:

3.99999996 1.0
Objective: 1.99999996

如果有可靠的方法,也许我们应该在gekko中添加一个
floor
ceil
函数,该函数类似于中的一些其他函数。您能告诉我们您的测试最新情况以及哪种方法最有效吗?

谢谢您的回复。不过,我一直在考虑如何将您的答案应用于我的实际问题,我不知道如何做到这一点。在我的代码中有27个变量,其中x[0]到x[2]受x[11]到x[26]的影响。例如,如果x[11]到x[27]的和是9,我需要x[0]或x[1]或x[3]乘以上限(9,2),所以5,如果和是15,我需要它乘以8。在上下文中,假设x[0]、x[1]、x[3]是不同类型的生成器,它们为2块中的改进提供功率,而x[11]到x[26]是需要功率的改进。也许管理这一点的最简单方法是在每次需要评估变量上限时创建一个附加变量。gekko函数,例如
y=m.ceil(x/2)
对于在复杂模型中管理这些函数可能更好。如果您希望看到添加此功能,是否可以在Github上向gekko添加功能请求?