如何无错误实现Gurobi中同频率不相邻城市约束?
修正后的相邻城市频率约束实现
你的代码存在核心逻辑错误:限制了非相邻城市使用同一频率,同时因原连接关系存在重复条目、循环逻辑不当,导致生成无效/重复约束。以下是修正方案:
修正步骤
- 先对城市连接关系
edges去重并统一顺序,避免重复生成约束 - 针对每个频率,为每一对相邻城市添加约束:同一频率不能同时被两个相邻城市使用
完整修正代码
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
相关产品推荐
相关产品推荐

