A = model.getA().toarray() #
b = np.array(model.RHS)
sense = np.array(model.sense)
f = np.array(model.obj)
Aineq = np.vstack((-Ale, Age)) # 把所有的<=和>=组合在一起
bineq = np.append(-ble, bge) # 这里用append使bineq为一个一维矩阵,而不是2行1列的二维矩阵,避免后面的运行错误
?
?
for row in np.arange(Aineq.shape[0]):
# 第一阶段变量
if not np.all(Aineq[row][num_1:] == 0): #第一阶段独有约束
E.append(Aineq[row][:num_1]) #x
G.append(Aineq[row][num_1:num_1+num_2]) #y
M.append(Aineq[row][num_1+num_2:]) #u
h.append(bineq[row]) #b
根据您的代码片段,循环遍历了Aineq矩阵的每一行,并根据条件将其拆分成不同的部分,并将它们存储在不同的列表中。
E, G, M, h = [], [], [], []:这几行代码初始化了四个空列表,用于存储拆分后的约束部分。
for row in np.arange(Aineq.shape[0]):这行代码用于构建一个循环,在Aineq矩阵的每一行上进行迭代。
if not np.all(Aineq[row][num_1:] == 0):这行代码检查当前行是否包含第一阶段独有的约束。如果当前行的(num_1+1)列及以后的列都为0,则说明该行不包含第一阶段独有的约束。
E.append(Aineq[row][:num_1])、G.append(Aineq[row][num_1:num_1+num_2])、M.append(Aineq[row][num_1+num_2:])、h.append(bineq[row]):这几行代码将当前行的适当部分添加到相应的列表中。 E存储当前行从第一列到第num_1列的元素(第一阶段变量x的部分),G存储当前行从第num_1列到第num_1+num_2列的元素(第二阶段变量y的部分),M存储当前行从第num_1+num_2列之后的元素(辅助变量u的部分),h存储当前行的右侧约束值。
综合来说,这些代码片段的作用是将Aineq矩阵的每一行根据条件拆分成不同的部分,并将这些部分分别存储在列表E、G、M和h中,以便在后续处理中使用。
?
?下面是一个简单的示例,演示了如何将非紧凑形式的约束转换为紧凑形式的约束,使用 Python 和 Gurobi 进行实现:
import gurobipy as gp from gurobipy import GRB # 创建模型 m = gp.Model("example") # 创建变量 x = m.addVar(name="x") y = m.addVar(name="y") # 创建系数 a = 1 b = 2 c = 3 # 非紧凑形式的约束 m.addConstr(a * x + b * y >= c, "c1") # 紧凑形式的约束 # 创建系数矩阵和变量向量 coefficients = [a, b] variables = [x, y] # 创建约束 m.addConstr(gp.LinExpr(coefficients, variables) >= c, "c2") # 设置优化目标 m.setObjective(x + y, GRB.MAXIMIZE) # 求解模型 m.optimize()
?非紧凑形式的约束到紧凑形式的约束python基于gurobi的代码实现:
import numpy as np import cvxpy as cp # 创建变量 x = cp.Variable() y = cp.Variable() # 创建系数 a = 1 b = 2 c = 3 # 非紧凑形式的约束 constraints = [a * x + b * y >= c] # 紧凑形式的约束 # 创建系数向量和变量向量 coefficients = np.array([a, b]) variables = np.array([x, y]) # 创建约束 compact_constraint = coefficients @ variables >= c # 创建问题 problem = cp.Problem(cp.Maximize(x + y), constraints + [compact_constraint]) # 求解问题 problem.solve()