首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Pyomo KeyError:“访问索引组件的错误:索引”(‘学生_5’,'company_3',‘meetingtime_1’)对数组组件‘var_X’无效

Pyomo KeyError:“访问索引组件的错误:索引”(‘学生_5’,'company_3',‘meetingtime_1’)对数组组件‘var_X’无效
EN

Stack Overflow用户
提问于 2018-07-08 16:26:19
回答 1查看 979关注 0票数 0

我有一个Pyomo模型,它试图最大限度地满足学生和公司之间的会议要求。我用一个三维变量来描述学生-公司-会面时间组合。我是一个使用pyomo的初学者,我在SolverStudio中使用它。只要我列出了model.var_X范围内所有可能的组合,模型就能正常工作。如果我没有列出所有可能的组合,则会收到以下错误消息:

错误:当使用索引('company_3',‘meetingtime_1’)为约束meetingtime_1生成表达式时,规则失败: KeyError:“访问索引组件的错误:索引”(‘学生_5’,'company_3',‘meetingtime_1’)对数组组件‘var_X’无效。

我不想包含所有可能的组合,因为这个数字太高,无法用excel处理,而且并不是所有的组合都是可行的。

有没有办法不列出所有的组合,但仍然能够解决它?

代码语言:javascript
运行
复制
from pyomo.environ import * # For Pyomo 4.0 & later

model = AbstractModel()

## Define sets
model.idx_students = Set()
model.idx_companies = Set()
model.idx_meetingtimes = Set()
model.idx_s_c = Set(within=model.idx_students*model.idx_companies)
model.idx_s_m = Set(within=model.idx_students*model.idx_meetingtimes)
model.idx_c_m = Set(within=model.idx_companies*model.idx_meetingtimes)
model.idx_s_c_m =      
    Set(within=model.idx_students*model.idx_companies*model.idx_meetingtimes)

## Define parameters
model.prm_studentsMin = Param(model.idx_students) 
model.prm_studentsMax = Param(model.idx_students)
model.prm_company_meetingtime_capa = Param(model.idx_c_m, default=0)
model.prm_student_meetingtime = Param(model.idx_s_m, within=Binary, 
    default=0) 
model.prm_fit = Param(model.idx_s_c, default=0)
model.prm_s_c_m_locked = Param(model.idx_s_c_m, within=Binary, default=0)

## Define variables
model.var_X = Var(model.idx_s_c_m, within=Binary)

## Define objective function
def maxFit(model):
    return sum(model.var_X[n]*model.prm_fit[m]
        for (n) in model.idx_s_c_m
        for (m) in model.idx_s_c)
model.SolverResults = Objective(rule=maxFit, sense=maximize)

## Capacity for companies during meeting-times
def company_meetingtime_capa_rule(model,c,m):
    return sum(model.var_X[s,c,m] for s in model.idx_students) <=     
        model.prm_company_meetingtime_capa[c,m]
model.company_meetingtime_capa_constraint = Constraint(model.idx_c_m, rule = 
company_meetingtime_capa_rule)

## Number of meetings for students and companies
def TerminstudentscompaniesRule(model, s, c):
    return sum(model.var_X[s,c,m] for m in model.idx_meetingtimes) <= 1
model.TerminstudentscompaniesConstraint = Constraint(model.idx_s_c,     
    rule=TerminstudentscompaniesRule)

## meetingtime availability of students
def studentsmeetingtimeRule(model, s,m):
    return sum(model.var_X[s,c,m] for c in model.idx_companies) <=     
        model.prm_student_meetingtime[s,m]
model.studentsmeetingtimeConstraint = Constraint(model.idx_s_m,     
    rule=studentsmeetingtimeRule)

## locked meetings
def lockedeTermineRule(model, s,c,m):
    return (model.var_X[s,c,m]) >= model.prm_s_c_m_locked[s,c,m]
model.lockedeTermineConstraint = Constraint(model.idx_s_c_m,     
    rule=lockedeTermineRule)

## Min number of meetings for students
def minTerminestudentsRule(model,s):
    return sum(model.var_X[s,c,m] for c in model.idx_companies for m in     
        model.idx_meetingtimes) >= model.prm_studentsMin[s]
model.minTerminestudentsConstraint = Constraint(model.idx_students,     
    rule=minTerminestudentsRule)

## Max number of meeting for students
def maxTerminestudentsRule(model,s):
    return sum(model.var_X[s,c,m] for c in model.idx_companies for m in 
        model.idx_meetingtimes) <= model.prm_studentsMax[s]
model.maxTerminestudentsConstraint = Constraint(model.idx_students,     
    rule=maxTerminestudentsRule)

真的很感谢你的帮助!

EN

回答 1

Stack Overflow用户

发布于 2018-07-11 18:53:19

最简单的解决方案是对Var中确实存在的变量进行求和,如下所示:

代码语言:javascript
运行
复制
model.var_X = Var(model.idx_s_c_m, within=Binary)

## Capacity for companies during meeting-times
def company_meetingtime_capa_rule(model,c,m):
    return sum(model.var_X[s,c,m] for s in model.idx_students
        if (s,c,m) in model.idx_s_c_m) \
        <= model.prm_company_meetingtime_capa[c,m]
model.company_meetingtime_capa_constraint = Constraint(
    model.idx_c_m, rule = company_meetingtime_capa_rule)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51233958

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档