如何在具有多个索引/数组的变量中仅循环字典的某些元素?

问题描述 投票:0回答:1

我有一个二元决策变量,它从5个词典(日,时间,团队,月,体育场)中获取一个元素,为运动团队创建最佳时间表。如何指定每个字典中的某些值在约束中始终等于1?

基本上我正在尝试为体育赛程创建约束,这是使用目标计划优化的。我想编写一个约束,以便在1月8:00只有1个游戏,适用于城市x和y日的所有团队。

day = ["Mon", "Tue", "Wed"]
time = ["7:00", "8:00", "9:00"]
team = ["Lakers", "Warriors", "Kings"]
month = ["Jan", "Feb", "Mar"]
city = ["LA", "SF", "Sac"]

for i in day:
  for j in time:
    for k in team:
      for l in month:
        for m in city:
          model += z[i,1,k,0,m] <= 1

我希望在最终结果中约束每个字典中的某些元素。

python linear-programming pulp
1个回答
0
投票

首先,我会使用itertools来避免我的循环过于嵌套。然后,我用需要的较小子集替换我正在迭代的原始数组。这是一个例子:

import itertools

day = ["Mon", "Tue", "Wed"]
time = ["7:00", "8:00", "9:00"]
team = ["Lakers", "Warriors", "Kings"]
month = ["Jan", "Feb", "Mar"]
city = ["LA", "SF", "Sac"]

time_filtered = ["8:00", ]
month_filtered = ["Jan", ]

for i, j, k, l, m in itertools.product(
                        day, time_filtered, team, month_filtered, city):
    model += z[i,j,k,l,m] <= 0

您的代码存在问题。当你使用“for x in iterable”时,你会得到x中可迭代的元素。例如,“for i in day”将在第一次迭代时返回“Mon”,而不是0.所以,我会说z [i,1,k,0,m]实际上是z [i,“8:00”, k,“Jan”,m]。

如果您确实想要索引而不是值,则可以使用range(len(iterable))。和[1,],[0,]用于过滤值。

什么是模型,什么是z从你的代码中不清楚。它们都不像字典(你在标题中引用字典)。你的意思是标题中的列表?还是有一些隐藏的词典?

© www.soinside.com 2019 - 2024. All rights reserved.