- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在 gekko-python 中定义 max 函数时遇到问题。
sum 函数工作正常但是当我创建另一个函数只是用 max 替换 sum 然后它抛出以下错误:
这是我使用的脚本的描述(包括模型、一些数据和结果)
#Model
import numpy as np
from gekko import GEKKO
import numpy as np
import pandas as pd
from pandas import ExcelWriter
from pandas import ExcelFile
m = GEKKO() # Initialize gekko
m.options.SOLVER = 3 # IPOPT is an NLP solver
m.options.MAX_ITER = 10000 # maximum number of iterations
m.options.MAX_MEMORY = 6 # (2-10) memory allocation
R_sect_bin = {'W1': {'S1': 1}, 'W2': {'S1': 1, 'S2': 1, 'S4': 1}, 'W3': {'S1': 1, 'S2': 1, 'S3': 1, 'S4': 1, 'S5': 1, 'S6': 1}, 'W4': {'S4': 1}, 'W5': {'S4': 1, 'S5': 1, 'S6': 1}, 'W6': {'S6': 1}}
Input_Services_nonZero = {'S1': {'L1': 1, 'L3': 1}, 'S2': {'L2': 1}, 'S3': {'L4': 1}, 'S4': {'L1': 1}, 'S5': {'L3': 1}, 'S6': {'L1': 1, 'L2': 1}}
V = {}
for w in R_sect_bin:
V[w] = {}
for s in R_sect_bin[w]:
V[w][s] = {}
for l in Input_Services_nonZero[s]:
V[w][s][l] = m.Var(value=10, lb=0, ub=100)
#functions:
sum_Vws1 = {}
def VWS1():
global sum_Vws1
for w in R_sect_bin:
sum_Vws1[w] = {}
for s in R_sect_bin[w]:
sum_Vws1[w][s] = m.Intermediate(sum([V[w][s][l] for l in Input_Services_nonZero[s]]))
return sum_Vws1
vws1 = VWS1()
sum_Vws2 = {}
def VWS2():
global sum_Vws2
for w in R_sect_bin:
sum_Vws2[w] = {}
for s in R_sect_bin[w]:
sum_Vws2[w][s] = m.Intermediate(max([V[w][s][l] for l in Input_Services_nonZero[s]]))
return sum_Vws2
vws2 = VWS2()
TypeError Traceback (most recent call last)
<ipython-input-225-b48377242060> in <module>
89 sum_Vws2[w][s] = m.Intermediate(max([V[w][s][l] for l in Input_Services_nonZero[s]]))
90 return sum_Vws2
---> 91 vws2 = VWS2()
92
93 #sum_Vws = {}
<ipython-input-225-b48377242060> in VWS2()
87 sum_Vws2[w] = {}
88 for s in R_sect_bin[w]:
---> 89 sum_Vws2[w][s] = m.Intermediate(max([V[w][s][l] for l in Input_Services_nonZero[s]]))
90 return sum_Vws2
91 vws2 = VWS2()
~\Anaconda3\lib\site-packages\gekko\gk_operators.py in __len__(self)
23 return self.name
24 def __len__(self):
---> 25 return len(self.value)
26 def __getitem__(self,key):
27 return self.value[key]
~\Anaconda3\lib\site-packages\gekko\gk_operators.py in __len__(self)
132
133 def __len__(self):
--> 134 return len(self.value)
135
136 def __getitem__(self,key):
TypeError: object of type 'int' has no len()
最佳答案
何登仁教授的回答:
您需要使用内置的 GEKKO max2
或 max3
函数。否则,Python 函数会创建一个不具有连续一阶或二阶导数的表达式,并且基于梯度的求解器可能无法找到解。
您需要使用 pip install gekko==0.2rc6 升级到最新的 gekko 版本 (>0.2rc5) 以使用 max2
或 max3
Gekko 函数。
下面是 max2
或 max3
的源代码,您也可以在 Gekko source 中找到它们.
def max2(self,x1,x2):
""" Generates the maximum value with continuous first and
second derivatives. The traditional method for max value (max) is not
continuously differentiable and can cause a gradient-based optimizer
to fail to converge.
Usage: y = m.max2(x1,x2)
Input: GEKKO variable, parameter, or expression
Output: GEKKO variable
"""
# verify that x1 and x2 are valid GEKKO variables or parameters
if isinstance(x1,(GKVariable,GKParameter)):
xin1 = x1
else:
# create input variable if it is an expression
xin1 = self.Var()
self.Equation(xin1==x1)
if isinstance(x2,(GKVariable,GKParameter)):
xin2 = x2
else:
# create input variable if it is an expression
xin2 = self.Var()
self.Equation(xin2==x2)
# build max object with unique object name
max_name = 'max2_' + str(len(self._objects) + 1)
self._objects.append(max_name + ' = max')
# add connections between x and max object attribute x
self._connections.append(xin1.name + ' = ' + max_name+'.x[1]')
self._connections.append(xin2.name + ' = ' + max_name+'.x[2]')
# add connections between y and max object attribute y
y = self.Var()
self._connections.append(y.name + ' = ' + max_name+'.y')
return y
def max3(self,x1,x2):
""" Generates the maximum value with a binary switch variable.
The traditional method for max value (max) is not continuously
differentiable and can cause a gradient-based optimizer to fail
to converge.
Usage: y = m.max3(x1,x2)
Input: GEKKO variable, parameter, or expression
Output: GEKKO variable
"""
# add binary (intb) and output (y) variable
intb = self.Var(0,lb=0,ub=1,integer=True)
y = self.Var()
# add equations for switching conditions
# intb=0 when x1>x2 and y=x1
# intb=1 when x2>x1 and y=x2
self.Equation((1-intb)*(x2-x1) <= 0)
self.Equation(intb*(x1-x2) <= 0)
self.Equation(y==(1-intb)*x1+intb*x2)
# change default solver to APOPT (MINLP)
self.options.SOLVER = 1
return y
max2 函数使用 MPCC,而 max3 使用二进制变量。这些函数仅通过使用函数调用就可以帮助使用这些更复杂的建模形式。您只能将两个值与 max2 或 max3 进行比较,因此如果您有一个列表,那么您需要执行以下操作:
y[0] = m.max3(x[0],x[1])
y[1] = m.max3(x[2],y[0])
y[2] = m.max3(x[3],y[1])
等等
这里是关于 why you need to use MPCCs or binary variables 的附加信息.还有一个 additional example here .
关于python - 在gekko中定义最大函数时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55825065/
在complier.h中有一个宏定义如下: # define __cond_lock(x,c) ((c) ? ({ __acquire(x); 1; }) : 0) 但是这里我有一个问题,就是哪里
curl_easy_setopt 的选项在哪里?定义?我试图寻找 CURLOPT_VERBOSE 和其他一些整数值,但这些似乎没有在 curl.h 中明确定义。 最佳答案 第 792 行: #ifde
我确实有一个如下所示的类(class): //.h file class __declspec(dllimport) MyClass { public: //stuff pri
作者: zhuwenzhuang, 2024.05.08. 阅读前假设读者熟悉数据库使用,了解 SQL 的语法和关系算子的大概含义, 能通过 EXPLAIN 命令查看数据库执行计划. 0 前言
我似乎无法找到是否可以声明一个 header 对象以便在响应 header 中重用它,有一些示例定义了响应模式的对象,但它不会转置为响应 header 。我只设法制作了一个可重用的响应对象,如下所示:
css 选择器 * + * 实际上是什么意思?当您执行检查元素时,您可以在谷歌浏览器的控制台中看到它。在我看来,这似乎是对 "Every second child"应用一种风格,但仍然想确定。谁能帮我
我试图弄清楚基本的IO Haskell 函数是定义好的,所以我使用了this reference我到了putChar函数定义: putChar :: Char -> IO () putChar
我得到了一个自动生成的文件,该文件定义了程序集属性,我正在尝试理解内容。 [assembly: global::System.Runtime.Versioning.TargetFrameworkAtt
This文档演示了如何检查变量是否先前已在 gnuplot 脚本中定义。 文档中的示例: a = 10 if (exists("a")) print "a is defined" if (!exist
好吧,这是一个相当基本的问题:我正在关注 SICP 视频,我对 define、let 和 之间的区别有点困惑设置!. 1) 根据 Sussman 在视频中的说法,define 只允许为变量附加一个值一
我一直在尝试定义一个包含只能具有以下三个值之一的字段的 XSD: 绿色 红色 蓝色 本质上,我想在架构级别定义严格的枚举。 我的第一次尝试似乎是错误的,我不确定修复它的“正确”方法。
有人可以定义“POCO”到底是什么意思吗?我越来越频繁地遇到这个术语,我想知道它是否仅与普通类有关还是意味着更多? 最佳答案 “普通旧式 C# 对象” 只是一个普通的类,没有描述基础结构问题或域对象不
在我经常看到的一些django模型中 myfield = models.CharField(_('myfield')) class_name = models.CharField(_('Type'),
每当 BOOL 数据类型不容易预定义时,我都会使用以下定义进行 boolean 运算, typedef unsigned char BOOL; (由于内存使用)。 我意识到出于性能原因,使用本地总线宽
l_ABC_BEANVector = utilRemote.fnGetVector("ABC_COVBEANVector"); 编码的含义是什么?任何帮助,我真的很感激。谢谢 最佳答案 唯一可以肯定地
我正在使用 javacc 开发一个项目,我遇到问题并需要一些帮助,我的文件中有这样的内容: STRING COPYRIGHT (C) 2003, 2004 SYNOPSYS, INC.; 我为单词 S
我想弄清楚基本的 IO定义了 Haskell 函数,所以我使用了 this reference然后我到了 putChar函数定义: putChar :: Char -> IO () putCha
我在具体类中使用 @property 定义 getter 时遇到问题。这是Python代码: from abc import ABCMeta, abstractproperty class abstr
我正在为大学用 C 语言编写一个小游戏,但我陷入了困境。我(在头文件中)有这个结构: typedef struct{ game_element field[MAX_ROWS][MAX_COLU
我一直在 .l 文件中创建标记定义。由于数据集数量庞大,它变得有点乏味。有没有办法读取文件中的所有单词,例如包含所有名词的 noun.txt 并给所有名词一个标记。 基本上,我想自动化这部分: %%
我是一名优秀的程序员,十分优秀!