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

我是 gekko 的新手,想在我的线性规划问题中使用它。


我在单独的字典(my_vars、Cost、Min 和 Max)中有变量名称、成本、最小和最大界限,以变量名称作为键,目标是通过确定满足约束的变量数量来最小化总成本。


我做了如下;


LP = GEKKO(remote=False)

vars = LP.Array(LP.Var, (len(my_vars)))

i=0

for 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 循环构建方程。


我不知道该怎么做?


慕码人8056858
浏览 83回答 1
1回答

尚方宝剑之说

这是使用字典值构建问题的一种方法:from gekko import GEKKO# stored as listmy_vars = ['x1','x2']# stored as dictionariesCost = {'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)))  # arrayvd = {}                                # dictionaryfor i,xi in enumerate(my_vars):    vd[xi] = va[i]    vd[xi].lower = Min[xi]    vd[xi].upper = Max[xi]# Cost functionLP.Minimize(LP.sum([Cost[xi]*vd[xi] for xi in my_vars])) # Summation as an arrayLP.Equation(LP.sum(va)==100)# This also works as a dictionaryLP.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.999932174x2 30.0000682Cost: 10750.001742
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python