为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 gekko 中动态构建约束?

如何在 gekko 中动态构建约束?

慕码人8056858 2024-01-16 10:35:32
我是 gekko 的新手,想在我的线性规划问题中使用它。我在单独的字典(my_vars、Cost、Min 和 Max)中有变量名称、成本、最小和最大界限,以变量名称作为键,目标是通过确定满足约束的变量数量来最小化总成本。我做了如下;LP = GEKKO(remote=False)vars = LP.Array(LP.Var, (len(my_vars)))i=0for xi in vars:    xi.lower = Min[list(my_vars)[i]]    xi.upper = Max[list(my_vars)[i]]    i += 1这里我想使用变量原始名称而不是xi,有什么办法吗?它继续为;LP.Minimize(sum(float(Cost[list(my_vars)[i]])*vars[i] for i in range(len(my_vars))))LP.Equation(sum(vars) == 100)另外,我在两个 pandas 数据帧文件中都有约束的左侧(LHS)(变量系数)和右侧(RHS)数字,并且喜欢使用 for 循环构建方程。我不知道该怎么做?
查看完整描述

1 回答

?
尚方宝剑之说

TA贡献1788条经验 获得超4个赞

这是使用字典值构建问题的一种方法:


from gekko import GEKKO


# stored as list

my_vars = ['x1','x2']

# stored as dictionaries

Cost = {'x1':100,'x2':125}

Min = {'x1':0,'x2':0}

Max = {'x1':70,'x2':40}


LP = GEKKO(remote=False)

va = LP.Array(LP.Var, (len(my_vars)))  # array

vd = {}                                # dictionary

for i,xi in enumerate(my_vars):

    vd[xi] = va[i]

    vd[xi].lower = Min[xi]

    vd[xi].upper = Max[xi]


# Cost function

LP.Minimize(LP.sum([Cost[xi]*vd[xi] for xi in my_vars])) 

# Summation as an array

LP.Equation(LP.sum(va)==100)

# This also works as a dictionary

LP.Equation(LP.sum([vd[xi] for xi in my_vars])==100)

LP.solve(disp=True)


for xi in my_vars:

    print(xi,vd[xi].value[0])

print ('Cost: ' + str(LP.options.OBJFCNVAL))

这产生了一个解决方案:


EXIT: Optimal Solution Found.


 The solution was found.


 The final value of the objective function is  10750.00174236579

 

 ---------------------------------------------------

 Solver         :  IPOPT (v3.12)

 Solution time  :  0.012199999999999996 sec

 Objective      :  10750.00174236579

 Successful solution

 ---------------------------------------------------

 


x1 69.999932174

x2 30.0000682

Cost: 10750.001742


查看完整回答
反对 回复 2024-01-16
  • 1 回答
  • 0 关注
  • 29 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信