晕,我发现一个问题
我有护士人数21的数据,但是方程中使用的是从护士5号开始的,n=1,2,3,...,N,序列为1,2 ,3,4是高级护士(T)。如果 i=n-T (i=5,6,...,21),则护士长的数据被排除在方差计算之外,即 |T|表示集合 T 的基数。
perawat=np.genfromtxt("Jumlah Perawat.txt", dtype='str')
shift=np.genfromtxt("Shift.txt", dtype='str')
hari=np.genfromtxt ("Jumlah Hari.txt", dtype='str')
p=np.genfromtxt("Jadwal.txt", dtype='str')
i=np.genfromtxt("tanpa_kepalajaga.txt", dtype='str')
T = np.loadtxt("Kepala jaga.txt")
###
D = hari.shape[0] #Jumlah Hari
print('D:',D)
N = perawat.shape[0] #Jumlah perawat
print('N:',N)
S = shift.shape[0] #Shift
print('S:',S)
I = i.shape[0] #tanpa kepala jaga
print('I:', I)
# Model
m = gp.Model("BnB")
# Decision variable
x = m.addVars(N,D,S, vtype=GRB.BINARY, name="x")
# Obj Function
m.setObjective(((sum(sum(x[n,d,1]) ** 2) / (21-4)) - (sum(sum(x[n,d,1])/(21-4)) ** 2) for n in range(5,N) for d in range (D)) + ((sum(sum(x[n,d,2]) ** 2) / (21-4)) - (sum(sum(x[n,d,2])/(21-4)) ** 2) for n in range(5,N) for d in range (D)) + ((sum(sum(x[n,d,3]) ** 2) / (21-4)) - (sum(sum(x[n,d,3])/(21-4)) ** 2) for n in range(5,N) for d in range (D)) + ((sum(sum(x[n,d,4]) ** 2) / (21-4)) - (sum(sum(x[n,d,4])/(21-4)) ** 2) for n in range(5,N) for d in range (D)) , GRB.MINIMIZE)
图像 O[id] 中目标函数的公式 显示 shift(s)=1
导致错误的原因是什么?和 问题是我不知道如何在 Gurobi Python 中编写这个表达式!
谢谢!
此代码中出现“TypeError: unsupported operand type(s) for +: 'generator' and 'generator'”错误是因为在
m.setObjective
中将多个生成器表达式使用
+
运算符连接起来。在 Python 中,不能直接将生成器表达式相加。
以下是如何解决此问题并正确编写 Gurobi 模型的步骤:
1. 使用
quicksum
函数
Gurobi 提供了
quicksum
函数,可以有效地对生成器表达式求和。可以使用它来替换目标函数中的
sum
函数。
2. 将所有表达式组合到一个生成器表达式中
与其创建多个生成器表达式并将它们相加,不如将所有内容组合到一个生成器表达式中,并使用
quicksum
对其求和。
以下代码展示了如何修改的目标函数:
from gurobipy import quicksum
m.setObjective(
quicksum(
(x[n, d, s] ** 2) / (N - len(T)) - (x[n, d, s] / (N - len(T))) ** 2
for n in range(len(T), N)
for d in range(D)
for s in range(1, S + 1)
),
GRB.MINIMIZE,
)
解释:
-
我们使用
quicksum
函数对整个表达式求和。 -
外层循环迭代
n
,从len(T)
开始,表示从护士长之后开始计算。 -
内层循环迭代
d
和s
,分别表示天数和班次。 -
表达式
(x[n, d, s] ** 2) / (N - len(T)) - (x[n, d, s] / (N - len(T))) ** 2
计算每个护士在每个班次每一天的方差贡献。
其他建议:
-
使用更具描述性的变量名,例如
num_nurses
,num_days
,num_shifts
。 -
将常量值(如
21
和4
)替换为变量或从数据中获取,以提高代码的可读性和可维护性。
通过这些更改,的代码应该可以正常运行并解决优化问题。
标签:python,gurobi From: 78810657