以下这段python代码有什么问题import gurobipy as gp import numpy as np delta = 0.005 S = 10 # 历史数据个数 T = 20 # T个阶段 c_p = 225 tau = 13500 # 预期收益目标 z_bar = 1 # 需求上届 C_re=20 C_se=30 h = 3.25 # 超储成本 zbar = 1 # 需求上届 q = 0.2 # 维修率 z_hat = np.around((1-1*np.random.rand(S, T)) * zbar) # 假设历史数据 i = np.arange(1, T+1) # [1,2,...,n] e_sigma = np.logspace(1,T-1,T,base=np.exp(-sigma)) # 创建模型 model = gp.Model() # 创建变量 x = model.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="x") k = model.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="k") eta1 = model.addVar(20,1, vtype=gp.GRB.BINARY, name="eta1") eta2 = model.addVar(20,1, vtype=gp.GRB.BINARY, name="eta1") y = {} for s in S: y[s] = model.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="y_" + str(s)) e = gp.quicksum([gp.exp(-delta * t) for t in range(1, T+1)]) # 添加约束 for s in S: lhs = eta1[s] @ z_bar + ((C_re * q + C_se) @ e - eta1[s] + eta2[s]) @ z_hat[s] / S model.addConstr(y[s] >= lhs) model.addConstr(gp.norm2((C_re * q + C_se) @ e - eta1[s] + eta2[s]) <= k) model.addConstr(c_p @ x + gp.quicksum([gp.exp(-delta * t) * h @ x for t in range(1, T+1)]) \ + gp.quicksum([y[s] for s in S]) / S <= tau) # 添加目标 model.setObjective(k, sense=gp.GRB.MINIMIZE) # 求解 model.optimize()
时间: 2023-07-15 18:10:05 浏览: 155
python数据分析与可视化 import pandas as pd import numpy as np import m
这段代码中存在以下问题:
1. `eta2` 的名字与定义 `eta1` 相同,应该为 `eta2 = model.addVar(20,1, vtype=gp.GRB.BINARY, name="eta2")`。
2. `y` 的定义中,需要将 `S` 改为 `range(S)`,即 `for s in range(S): y[s] = model.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="y_" + str(s))`。
3. `lhs` 中的 `@` 应该改成 `dot` 函数,即 `lhs = gp.dot(eta1[s], z_bar) + (gp.dot((C_re * q + C_se), e) - eta1[s] + eta2[s]) @ z_hat[s] / S`。
4. 在第三个约束条件中,需要将 `/ S` 移到 `gp.quicksum([y[s] / S for s in range(S)])` 中。
5. 目标函数中的 `k` 应该改为 `gp.abs_(k)`,因为 `k` 的范围是非负实数,而目标函数是要求最小值。
6. 在约束条件和目标函数中,出现了未定义的变量 `C_re`,应该在开头定义 `C_re = 20`。
7. 在约束条件和目标函数中,出现了未定义的变量 `sigma`,应该在开头定义 `sigma = 0.1`。
修改后的代码如下:
```
import gurobipy as gp
import numpy as np
delta = 0.005
S = 10 # 历史数据个数
T = 20 # T个阶段
c_p = 225
tau = 13500 # 预期收益目标
z_bar = 1 # 需求上届
C_re = 20
C_se = 30
h = 3.25 # 超储成本
zbar = 1 # 需求上届
q = 0.2 # 维修率
sigma = 0.1 # 标准差
z_hat = np.around((1 - 1 * np.random.rand(S, T)) * zbar) # 假设历史数据
i = np.arange(1, T + 1) # [1,2,...,n]
e_sigma = np.logspace(1, T - 1, T, base=np.exp(-sigma)) # 创建模型
model = gp.Model() # 创建变量
x = model.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="x")
k = model.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="k")
eta1 = model.addVar(T, vtype=gp.GRB.BINARY, name="eta1")
eta2 = model.addVar(T, vtype=gp.GRB.BINARY, name="eta2")
y = {}
for s in range(S):
y[s] = model.addVar(lb=0, vtype=gp.GRB.CONTINUOUS, name="y_" + str(s))
e = gp.quicksum([gp.exp(-delta * t) for t in range(1, T + 1)])
# 添加约束
for s in range(S):
lhs = gp.dot(eta1[s], z_bar) + (gp.dot((C_re * q + C_se), e) - eta1[s] + eta2[s]) @ z_hat[s] / S
model.addConstr(y[s] >= lhs)
model.addConstr(gp.norm2((C_re * q + C_se) @ e - eta1[s] + eta2[s]) <= k)
model.addConstr(c_p @ x + gp.quicksum([gp.exp(-delta * t) * h @ x for t in range(1, T + 1)])
+ gp.quicksum([y[s] / S for s in range(S)]) <= tau)
# 添加目标
model.setObjective(gp.abs_(k), sense=gp.GRB.MINIMIZE)
# 求解
model.optimize()
```
阅读全文