- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试在 Python 中使用 GEKKO 定义优化问题,并且我想使用一些具有预定义选择列表的设计变量。此外,每个选择都有相关的成本,并且约束条件是总成本应低于指定限制。
下面是一个常见的 gekko 示例(找到 here ),修改为 x1
和 x2
为 sos1
。同样根据 x1
和 x2
的选定值的索引,我从另一个列表中找到它们的相关成本,并且它们的总和应该小于某个值(约束)。
from gekko import GEKKO
def test(x1,x2,x3,x4):
res = x1*x4*(x1+x2+x3)+x3
return res
def check(x1,x2):
tt = [1,2,3,4,5]
cost = [10,10,10,2,1]
if x1.value in tt:
y1 = tt.index(x1.value)
y2 = tt.index(x2.value)
C = cost[y1]+cost[y2]
return C
return 10
m = GEKKO() # Initialize 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']
# Integer constraints for x3 and x4
x3 = m.Var(value=1,lb=1,ub=5,integer=True)
x4 = m.Var(value=2,lb=1,ub=5,integer=True)
x1 = m.sos1([1,2,3,4,5])
x2 = m.sos1([1,2,3,4,5])
# Equations
m.Equation(x1*x2*x3*x4>=25)
m.Equation(x1**2+x2**2+x3**2+x4**2==40)
m.Equation(check(x1,x2)<=5)
m.Obj(test(x1,x2,x3,x4)) # Objective
m.solve(disp=False) # Solve
print('Results')
print('x1: ' + str(x1.value))
print('x2: ' + str(x2.value))
print('x3: ' + str(x3.value))
print('x4: ' + str(x4.value))
print('Objective: ' + str(m.options.objfcnval))
注意:我必须在 check
函数中添加一个 if block ,因为 x1
和 x2
的初始值似乎为零。
此代码不起作用,我收到以下错误。
> Exception has occurred: Exception
@error: Equation Definition
Equation without an equality (=) or inequality (>,<)
true
STOPPING...
我不知道是什么导致了这个错误。我应该如何重新制定我的模型以获得预期的结果?
编辑:此示例代码只是我尝试重现错误。我的实际应用是设计一个工程系统。例如,假设系统有 2 个组件 - 电池和灯泡。我有两种电池可供选择,电池 A 重 10kg,可靠性为 0.97,电池 B 重 6kg,可靠性为 0.75。同样,灯泡也有不同的选择。我需要为电池和灯泡选择一个选项,以使整个系统的可靠性尽可能高(目标)并且总重量小于“x”千克(约束)。在上面的代码中,将 x1
和 x2
值视为组件的选定选项,我找到它们的索引以获得相关的重量/成本(如果电池 A 和灯泡 B被选中,我得到他们的重量来检查总重量是否小于允许的限制)。现在我的实际系统有 n
个组件和每个组件的 m
个选项。每个选择都有相关的重量、成本、可靠性等。我试图找到最佳组合,以在系统重量、成本等限制条件下最大限度地提高系统可靠性
最佳答案
我根据您的示例描述构建了一个简单的模型。
from gekko import GEKKO
import numpy as np
m = GEKKO() # Initialize 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']
x1 = m.Array(m.Var, 5, **{'value':0,'lb':0,'ub':1, 'integer': True}) # battery options
print(f'x1_initial: {x1}')
x2 = m.Array(m.Var, 5, **{'value':0,'lb':0,'ub':1, 'integer': True}) # bulb options
print(f'x2_initial: {x2}')
bat_cost = np.array([ 10, 2, 3, 4, 5]) # battery costs
bat_weigh = np.array([ 1, 25, 20, 19, 20]) # battery weighs
bulb_cost = np.array([ 2, 5, 33, 24, 5]) # bulb costs
bulb_weigh = np.array([ 6, 10, 2, 10, 20]) # bulb weighs
m.Equation( sum(bat_weigh * x1) + sum(bulb_weigh * x2) <= 25) # limit total weigh
m.Equation(m.sum(x1) == 1) # restrict choice to a single battery
m.Equation(m.sum(x2) == 1) # restrict choice to a single bulb
m.Obj( sum(bat_cost * x1) + sum(bulb_cost * x2) ) # Objective
m.solve(disp=False) # Solve
print('Results:')
print(f'x1: {x1}')
print(f'x2: {x2}')
print(f'battery cost: {sum(np.array([i[0] for i in x1]) * bat_cost)}')
print(f'battery weigh: {sum(np.array([i[0] for i in x1]) * bat_weigh)}')
print(f'bulb cost: {sum(np.array([i[0] for i in x2]) * bulb_cost)}')
print(f'bulb weigh: {sum(np.array([i[0] for i in x2]) * bulb_weigh)}')
print('Objective value: ' + str(m.options.objfcnval))
结果如下:
x1_initial: [0 0 0 0 0]
x2_initial: [0 0 0 0 0]
Results:
x1: [[0.0] [0.0] [0.0] [1.0] [0.0]]
x2: [[1.0] [0.0] [0.0] [0.0] [0.0]]
battery cost: 4.0
battery weigh: 19.0
bulb cost: 2.0
bulb weigh: 6.0
Objective value: 6.0
这是一个非常简单的例子,展示了如何表示电池和灯泡信息。它可以变得更复杂,但我需要更多细节并理解为什么你有多项式方程,它们代表什么。
重申一下,您遇到的错误与行有关:
m.Equation(check(x1,x2)<=5)
关于python - 离散优化(SOS1 约束)- GEKKO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61395557/
如何在 Flutter 中使 slider 离散看起来像上图? slider discrete 最佳答案 使用 divisions Slider 的属性(property)小部件将其分成相等的部分,然
我正在创建一个带有颜色条的散点图 plt.scatter(X, Y, c=Z) plt.colorbar() plt.show() plt.close() 其中 X 和 Y 是 float 组,Z 是
我刚刚在 android studio 中发现了 seekbar 离散小部件,我发现它非常有用,但我不知道如何删除步骤指示器,或者用更合适的可绘制对象更改它们。 有人设法做到了吗? 这是我当前搜索栏的
问题 请注意以下问题:巫师可以创建和销毁 rune 。创建一个新的 rune 需要消耗与先前创建的 rune 数量成比例的法力。摧毁 rune 会恢复创建 rune 所用的法力。下面,我提出一个可能的
我正在尝试使用 ggplot2 中的 sf 和 geom_sf 制作 map ,其中一组点数据使用连续颜色比例(-1 到 1),一组线数据使用离散比例(a、b、c、d)着色。但是,当我在同一张 map
我正在尝试在具有连续状态(dim.= 20)和离散操作(3 个可能的操作)的环境中找到最佳策略。并且有一个特定的时刻:对于最佳策略,一个操作(称为“操作 0”)的选择频率应比其他两个操作高得多(频率约
仅使用 x-y 位置移动绘制圆弧的最佳方法是什么?例如,假设我想在点 (4,4) 处绘制一个半径为 4 的圆。让我们看看我的“抽屉”从 (4,0) 开始,每个方向的分辨率为 0.1 步。我将如何创建一
我正在使用一个使用广义加法模型的随机站点级效应来拟合一个模型,该模型在 mgcv 中实现。 R 包。我一直在使用函数 gam() 执行此操作但是,为了加快速度,我需要转到 bam()框架,与gam()
这个问题在这里已经有了答案: Make a line separated by group in bar chart (3 个答案) 关闭上个月。 我正在尝试使用 ggplot2 在条形图的每个条上
这个问题在这里已经有了答案: Make a line separated by group in bar chart (3 个答案) 关闭上个月。 我正在尝试使用 ggplot2 在条形图的每个条上
是否可以同时使用 Intel HD 4000 集成显卡和独立 GPU,OpenCL(或 CUDA)作为设备,CPU 作为主机?我想要一些代码在集成显卡上运行,而其他代码同时在我的 GPU 上运行。 最
我是一名优秀的程序员,十分优秀!