You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python约束满足问题(CSP):通过数组元素查找字典键与时间约束实现

解决CSP中时间约束的实现方案

你当前的timeDomain结构存在核心问题:它以时间为键、可选人员列表为值,但所有值完全相同,导致无法通过人员反向绑定对应时间。要实现"Amber比Brian早到5分钟"的约束,需要先调整数据结构,把时间转为数值方便计算,再建立人员与可选时间的映射。

步骤1:时间字符串转数值

将"HH:MM"格式的时间转为总分钟数,差值计算会更直观:

def time_to_minutes(time_str):
    hours, minutes = map(int, time_str.split(":"))
    return hours * 60 + minutes

def minutes_to_time(total_minutes):
    hours = total_minutes // 60
    minutes = total_minutes % 60
    return f"{hours}:{minutes:02d}"

步骤2:调整数据结构为人员-时间域映射

提取原时间列表并转为数值后,为每个人员分配可选时间域:

timeDomain = {"4:30" : ["brian", "amber", "chris", "diane"],
              "4:35" : ["brian", "amber", "chris", "diane"],
              "4:40" : ["brian", "amber", "chris", "diane"],
              "4:45" : ["brian", "amber", "chris", "diane"]}

# 提取所有时间并转为分钟数
time_minutes = [time_to_minutes(t) for t in timeDomain.keys()]

# 建立每个人员的可选时间域
person_domains = {
    "amber": time_minutes.copy(),
    "brian": time_minutes.copy(),
    "chris": time_minutes.copy(),
    "diane": time_minutes.copy()
}

步骤3:实现约束判断

约束条件amber的时间 == brian的时间 -5可直接通过数值比较实现:

# 筛选符合约束的Amber和Brian时间组合
valid_combinations = []
for amber_t in person_domains["amber"]:
    for brian_t in person_domains["brian"]:
        if amber_t == brian_t - 5:
            valid_combinations.append(
                (minutes_to_time(amber_t), minutes_to_time(brian_t))
            )

print("符合约束的时间组合:", valid_combinations)

运行后会输出:符合约束的时间组合: [('4:30', '4:35'), ('4:35', '4:40'), ('4:40', '4:45')]

步骤4:在CSP求解中应用约束

如果用回溯法等CSP求解框架,可将约束作为赋值时的检查条件。比如在给Brian分配时间后,过滤Amber的可选时间:

# 假设已给Brian分配时间brian_assigned(分钟数)
brian_assigned = time_to_minutes("4:35")
# 过滤Amber的可选时间,只保留符合约束的选项
person_domains["amber"] = [t for t in person_domains["amber"] if t == brian_assigned -5]

内容的提问来源于stack exchange,提问作者aaaa

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:55:11