我正在查看别人的代码(使用 Gurobi 进行优化),我很困惑:
x = model.addVars(A, vtype=GRB.BINARY, name=['x_'+str(i)+'_'+str(j) for i in V for j in V if i != j])
u1 = model.addVars(N, vtype=GRB.CONTINUOUS, name=["Dummy_Quantity_"+str(i) for i in N])
u2 = model.addVars(N, vtype=GRB.CONTINUOUS, name=["Dummy_Time_U2_"+str(i) for i in N])
u3 = model.addVars(N, vtype=GRB.CONTINUOUS, name=["Dummy_Time_U3_"+str(i) for i in N])
u4 = model.addVars(N, vtype=GRB.CONTINUOUS, name=["Dummy_Time_U4_"+str(i) for i in N])
model.setObjective(sum(x[i, j]*dist[i, j] for i, j in A), GRB.MINIMIZE)
# If the truck goes from i to j points then the truck's current garbage volume is given by the garbage
# collected until point i + garbage produced at j'th neighborhood:
for i, j in A:
if i != 0 and j != 0:
model.addConstr((x[i, j] == 1) >> (u1[i]+q[j] == u1[j]))
“>>”在这里做什么?通常,“>>”用于按位运算。是不是出错了(代码编译没问题——没有错误)
这里的意思是,如果一辆卡车从站点 I 行驶到站点 j(二元变量=1),那么垃圾量就会增加,如评论中所述
有没有比使用 >> 更好的方法?
做真值表。
A B A >> B
--------------
0 0 0
1 0 1
0 1 0
1 1 0
因此,对于布尔值,(A >> B) 相当于(A 而不是 B),但会产生整数结果。我认为这过于聪明,并且会在代码审查中指出这一点。我会这样写,以使意图更清楚:
int((x[i, j] == 1) and not (u1[i]+q[j] == u1[j]))
这是一个指标约束,如下所述:Model.addGenConstrIndicator
这些约束用于根据另一个二进制变量的值来模拟是否需要满足某个条件。例如,这对于模拟新工厂或存储位置的开业非常有用。