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

如何无错误实现Gurobi中同频率不相邻城市约束?

修正后的相邻城市频率约束实现

你的代码存在核心逻辑错误:限制了非相邻城市使用同一频率,同时因原连接关系存在重复条目、循环逻辑不当,导致生成无效/重复约束。以下是修正方案:

修正步骤

  1. 先对城市连接关系edges去重并统一顺序,避免重复生成约束
  2. 针对每个频率,为每一对相邻城市添加约束:同一频率不能同时被两个相邻城市使用

完整修正代码

import gurobipy as gp
from gurobipy import GRB
m = gp.Model("Problem 2")
freq_cost = 500000
city = ['c1','c2','c3','c4','c5','c6']
edges = [
('c1','c2'), ('c1','c3'), ('c1','c5'),
('c2','c3'), ('c2','c4'), ('c2','c5'), ('c2','c5'),
('c3','c4'), ('c3','c6'),
('c4','c6'),
('c5','c6')]
frequency = ['f1','f2','f3','f4','f5','f6']
# Profit to broadcast in city I:
profit = {
"c1": 300000,
"c2": 300000,
"c3": 450000,
"c4": 100000,
"c5": 100000,
"c6": 400000,
}
# Create Variables
x = m.addVars(frequency, city , name='x', vtype=GRB.BINARY) # x[i,j] = 1 if frequency i is used in city j
y = m.addVars(frequency , name='y', vtype=GRB.BINARY) # y[i] = 1 if frequency i is activated
m.update() # Update the model

# 处理edges:去重并统一城市对顺序,避免重复约束
unique_edges = []
seen_pairs = set()
for u, v in edges:
    # 统一城市对顺序,确保(u, v)中u的名称小于v,避免重复处理(c1,c2)和(c2,c1)
    if u > v:
        u, v = v, u
    if (u, v) not in seen_pairs:
        seen_pairs.add((u, v))
        unique_edges.append((u, v))

# 添加正确的相邻频率约束
for freq in frequency:
    for (city_j, city_k) in unique_edges:
        # 约束逻辑:同一频率不能被相邻的两个城市同时使用
        m.addConstr(x[freq, city_j] + x[freq, city_k] <= 1, 
                    name=f"adjacent_freq_{freq}_{city_j}_{city_k}")

关键说明

  • 去重处理:通过seen_pairs集合和统一城市对顺序,彻底避免重复添加相同约束
  • 约束逻辑:二进制变量相加≤1,确保同一频率不会被两个相邻城市同时启用
  • 命名规范:给每个约束设置唯一名称,方便后续调试和模型检查

内容的提问来源于stack exchange,提问作者DJ-coding

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 01:05:24