如何在具有多个 indices/arrays 的变量中仅循环字典的某些元素?

How do I loop over only certain elements of a dictionary in a variable with multiple indices/arrays?

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

本质上,我正在尝试为使用目标程序优化的运动计划创建约束。我想写一个约束,以便在 1 月份的 8:00 只有一场比赛,对于城市 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

我希望在我的最终结果中限制每个词典中的某些元素。

首先,我会使用 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" 在第一次迭代时会 return "Mon",而不是 0。 所以,我会说 z[i,1,k,0,m] 实际上是 z[i,"8:00", k, "Jan", m].

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

从您的代码中不清楚什么是模型,什么是 z。 None 其中看起来像字典(您在 header 中引用字典)。您是指 header 中的列表吗?或者有一些隐藏的字典?