Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 求解MILP的Pyomo中的非固定界误差_Python_Pyomo - Fatal编程技术网

Python 求解MILP的Pyomo中的非固定界误差

Python 求解MILP的Pyomo中的非固定界误差,python,pyomo,Python,Pyomo,我是新来的。我正在尝试解决以下MILP问题: 我尝试了以下脚本: import numpy as np from pyomo.environ import * from pyomo.gdp import * import pyomo.environ as aml OMEGA = ['Bus 01','Bus 06','Bus 32'] K = ['G 03','Line 15-16'] MARGINS = { 'G 03' : 0.28, 'Line

我是新来的。我正在尝试解决以下MILP问题:

我尝试了以下脚本:

import numpy as np
from pyomo.environ import *
from pyomo.gdp import *
import pyomo.environ as aml

OMEGA = ['Bus 01','Bus 06','Bus 32']

K = ['G 03','Line 15-16']

MARGINS = {
         'G 03' : 0.28,
         'Line 15-16': 0.30,
         }

BMAX = {
        'Bus 01':3,
        'Bus 06':3,
        'Bus 32':3,
        }

BMIN = {
        'Bus 01':0.001,
        'Bus 06':0.001,
        'Bus 32':0.001,
        }

SENSITIVITIES = {
    ('Bus 01','G 03') : {'S': 0.001},
    ('Bus 06','G 03') : {'S': 0.016},
    ('Bus 32','G 03') : {'S': 0.008},
    ('Bus 01','Line 15-16') : {'S': 0.004},
    ('Bus 06','Line 15-16') : {'S': 0.010},
    ('Bus 32','Line 15-16') : {'S': 0.015},
    }
Cv = 0.41
Cf = 1.3
Mr = 0.35

model = ConcreteModel()

model.Omega = Set(initialize = (i for i in OMEGA))
model.K = Set(initialize = (i for i in K))

model.M = Param(model.K,initialize = MARGINS)

model.b = Var(model.Omega, within = NonNegativeReals)
model.q = Var(model.Omega, within = Binary)
model.b_k = Var(model.Omega,model.K, within = NonNegativeReals)

model.Bmax = Param(model.Omega, initialize=BMAX)
model.Bmin = Param(model.Omega, initialize=BMIN)

def obj_rule(model):
    return sum(Cv*model.b[i] + Cf*model.q[i] for i in model.Omega)
model.obj = Objective(rule = obj_rule, sense = minimize)

def margin_rule(model,k):
    value = sum(SENSITIVITIES[(i,k)]['S']*model.b_k[i,k] for i in model.Omega) + model.M[k]
    return value >= Mr
model.margin = Constraint(model.K,rule=margin_rule)

def minmargin_rule(model,i,k):
    return aml.inequality(model.Bmin[i],model.b_k[i,k],model.b[i])
model.minmargin = Constraint(model.Omega,model.K, rule=minmargin_rule)

def powerlimits_rule(model,i):
    return  aml.inequality(model.Bmin[i]*model.q[i],model.b[i],model.Bmax[i]*model.q[i])
model.powerlimits = Constraint(model.Omega,rule=powerlimits_rule)

results = SolverFactory('glpk').solve(model)
results.write()

但对于“minmargin”约束返回“ValueError:non fixed bound or weight:b[Bus 01]”,对于“powerlimits”约束返回“ValueError:non value for uninitialized NumericValue object q[Bus 01]”。我希望能得到一些帮助或建议来解决这些问题。

出于某种原因,pyomo似乎不喜欢有多个变量引用的链式不等式约束。我只是做了些修补

解决此问题时将失败,正如您的模型所做的那样:

from pyomo.environ import *

m = ConcreteModel()

m.A = Set(initialize = [1,2,3])

m.X = Var(m.A, domain=NonNegativeReals)
m.Y = Var(m.A, domain=NonNegativeReals)

def x_sandwich(m, a):
    return inequality(5, m.X[a], m.Y[a])
m.c2 = Constraint(m.A, rule=x_sandwich)
但是,这很管用:

def x_sandwich(m, a):
    return inequality(5, m.X[a], 10)
m.c2 = Constraint(m.A, rule=x_sandwich)
也许有人知道连锁不平等功能的本质,可以发表评论。我在快速搜索中没有发现任何东西会说这两种都是酸的

我能够通过将链式不等式分解为独立的约束来处理/求解您的模型(您可能需要对
功率限制
约束执行相同的操作,我已将其注释掉):

def minmargin\u rule\u lower(型号,i,k):

出于某种原因,pyomo似乎不喜欢有多个变量引用的链式不等式约束。我只是做了些修补

解决此问题时将失败,正如您的模型所做的那样:

from pyomo.environ import *

m = ConcreteModel()

m.A = Set(initialize = [1,2,3])

m.X = Var(m.A, domain=NonNegativeReals)
m.Y = Var(m.A, domain=NonNegativeReals)

def x_sandwich(m, a):
    return inequality(5, m.X[a], m.Y[a])
m.c2 = Constraint(m.A, rule=x_sandwich)
但是,这很管用:

def x_sandwich(m, a):
    return inequality(5, m.X[a], 10)
m.c2 = Constraint(m.A, rule=x_sandwich)
也许有人知道连锁不平等功能的本质,可以发表评论。我在快速搜索中没有发现任何东西会说这两种都是酸的

我能够通过将链式不等式分解为独立的约束来处理/求解您的模型(您可能需要对
功率限制
约束执行相同的操作,我已将其注释掉):

def minmargin\u rule\u lower(型号,i,k):
返回模型Bmin[i]