当前位置: 首页 > 知识库问答 >
问题:

具有自定义函数的Gekko优化约束

燕扬
2023-03-14

我目前正试图用Gekko的分支来解决一个混合整数非线性问题

以下是我迄今为止的尝试:

m = GEKKO()
m.options.SOLVER = 1  # APOPT is an MINLP solver
# optional solver settings with APOPT
m.solver_options = ['minlp_maximum_iterations 500', \
                    # minlp iterations with integer solution
                    'minlp_max_iter_with_int_sol 10', \
                    # treat minlp as nlp
                    'minlp_as_nlp 0', \
                    # nlp sub-problem max iterations
                    'nlp_maximum_iterations 50', \
                    # 1 = depth first, 2 = breadth first
                    'minlp_branch_method 1', \
                    # maximum deviation from whole number
                    'minlp_integer_tol 0.05', \
                    # covergence tolerance
                    'minlp_gap_tol 0.01']

#Declare x
x = m.Array(m.Var,(65),lb=0,ub=1,integer=True)
for i, xi in enumerate(x[0:65]):
    xi.value = np.random.choice(np.arange(0, 2), 1, p=[0.4, 0.6])[0]
#constr
m = ineq_constraint_new(x, m)
m = eq_constraint_new(x, m)

#target
m = objective(x,m)

#STArt
start_time = time.time()
#m.solve(disp=False)
m.solve()
print('Objective: ' + x)
print('Objective: ' + str(m.options.objfcnval))

# save x
m.x = [x[j].value[0] for j in range(65)]


def eq_constraint_new(x, m):

    mask = np.isin(list_unique, specific_value)
    indices_fixed = np.nonzero(mask)[0]
    m.Equations([x[j] == 1 for j in indices_fixed])

    return m

def ineq_constraint_new(x, m):

    indices_open = [j for j in range(65) if x[j].value == 1]
    # DOes not work
    #indices_open_banks = [m.Intermediate(j) for j in range(65) if x[j].value == 1]
    array_perc, _, _,_ = self_defined_f(indices_open, some_value)

    #convert to gekko variables
    gekko_vec_perc_upper_bound = m.Array(m.Var, (65))
    for i, xi in enumerate(gekko_vec_perc_upper_bound[0:65]):
        xi.value = some_array[i]

    gekko_arr_perc = m.Array(m.Var, (65))
    for i, xi in enumerate(gekko_arr_perc[0:65]):
        xi.value = arr_perc[i]

    diff = gekko_vec_perc_upper_bound - gekko_arr_perc

    m.Equations([diff[j] >= 0 for j in range(65)])
    
    return m

def objective(x,m):

    
    indices_open = [j for j in range(65) if x[j].value == 1]

    
    _, arr_2, arr_3, arr_4 = self_defined_f(indices_open,some_value )

    # intermediates for objective
    res_dist = [None] * self.ds.n_banks
    res_wand = [None] * self.ds.n_banks
    res_wand_er = [None] * self.ds.n_banks
    
    x_closed = np.array([1]*len(x)) - x

    for j in range(self.ds.n_banks):
        res_dist[j] = m.Intermediate(arr_2[j] * some_factor  )
        res_wand[j] = m.Intermediate(arr_3[j] * some_factor)
        res_wand_er[j] = m.Intermediate(arr_4[j] * some_factor)

    res_sach = some_factor * (some_vector * x_closed)

    # Will be added together
    m.Minimize(sum(res_dist))
    m.Minimize(sum(res_wand))
    m.Minimize(sum(res_wand_er))
    m.Maximize(sum(res_sach))

    return m

共有1个答案

贡威
2023-03-14

有一个未定义的函数,阻止代码运行。从代码的快速扫描中,可以看到如下表达式:

indices_open = [j for j in range(65) if x[j].value == 1]

不允许,因为gekko要求在m.solve()命令之前定义所有方程。不允许在Python中回调函数。相反,应该使用二进制变量来打开或关闭优化问题中的某些内容。这可以是一个等式,例如二进制变量b:

b = m.Var(lb=0,ub=1,integer=True)
m.Equation(x*(1-b)<=0)
m.Equation(x*b>=0)

如果x小于零,则b的值等于0,如果x大于零,则b的值等于1。APMonitor留档中有一个关于if3()函数的教程也可能很有用。

 类似资料:
  • 我试图用Python中的GEKKO定义一个优化问题,我想使用一些带有预定义选择列表的设计变量。此外,每个选择都有一个相关的成本,约束条件是总成本应低于指定的限制。 下面是一个常见的壁虎示例(在这里找到),修改后的x1和x2是sos1。此外,利用所选值x1和x2的索引,我从另一个列表中找到了它们的相关成本,它们的总和应该小于某个值(约束)。 注意:我必须在函数中添加一个if块作为的初始值,而似乎为零

  • 我正在解决这个优化问题,我需要计算出我需要打开多少个配送中心,以满足12家公司设施的需求,同时最小化运输成本。运输成本只是配送中心之间的距离乘以每英里成本,然而在这个问题中,每英里成本是一美元。我有5个选择,分别是波士顿、纳舒亚、普罗维登斯、斯普林菲尔德和伍斯特,这5个是12家公司设施的一部分。 我解决了这个问题,得到了正确的答案,但是后来我试图在同一个代码中添加两个约束,我得到的答案是不正确的。

  • 函数“def gekko_obj(x)”适用于任何x值。 但是,当m作为Gekko目标函数调用时,它会失败。Obj(gekko_obj(x))。 文件“/anaconda3/lib/python3.6/site packages/spyder/utils/site/sitecustomize.py”,第710行,在runfile execfile(文件名,命名空间)中 文件“/anaconda3/

  • 我试图用双积分动力学的形式来解决一个简单的最短时间最优控制问题, GEKKO优化框架如下: 我想做的是用梯形积分形成一个等式约束系统,然后用GEKKO求解这个系统的最优控制输入。但是,使用函数定义, 结合平等制约制度, 给了我以下的错误, 我在上面的代码片段中添加了两行注释代码,这将允许程序正确运行,但我希望避免将每个方程分开,因为我想将其扩展到处理更复杂的系统动力学的问题,并使用更复杂的配置方法

  • 问题内容: 如何在Go中创建只能接受有效值的自定义类型?例如,我要创建一个名为“名称”的类型,其基础类型为字符串。但是,它只能接受值“ John”,“ Rob”或“ Paul”。其他任何值都将返回错误。我已经以非常简单的方式创建了以下程序,以表示我想要实现的目标。 http://play.golang.org/p/jzZwALsiXz 编写此代码的最佳方法是什么? 问题答案: 您可以执行以下操作(

  • 这是我得到的错误: 在模板中:“std::priority_queue ,std::vector >”的初始化没有匹配的构造函数,(lambda位于