我正在编写一个护士-患者匹配算法,我想在目标函数中加入一些东西,以鼓励护士和患者之间的语言匹配。目标是将每位患者分配给一名护士,同时最大限度地减少不均衡的工作量分布、房间之间的距离、护理的连续性、语言匹配等。为了简单起见,我只展示了语言匹配元素。
套
model.PatientIDs = {0, 1, 2}
model.NurseIDs = {a, b}
Patient Language-索引参数(按患者索引(
model.PATIENT_LANGUAGE = {(0: English), (1: Spanish), (2: English)}
护士语言-索引参数(由护士索引(
model.NURSE_LANGUAGE = {(a: English), (b: Spanish)}
索引参数(按患者、护士索引(-跟踪护士语言是否与患者语言匹配,根据患者语言和护士语言预先计算
model.LANGUAGES_MATCH = {(0, a): 1, (0, b): 0, (1, a) : 0, (1, b) : 1, (2, a) : 1, (2, b) : 0}
决策变量(由(患者、护士(索引(
model.ASSIGNMENTS = {(0, a): 0, (0, b): 1, (1, a) : 1, (1, b) : 1, (2, a) : 0, (2, b) : 0}
虚拟决策变量(由(患者、护士(索引(
model.DUMMY_LANGUAGE = {(0, a): 1, (0, b): 0, (1, a) : 0, (1, b) : 1, (2, a) : 1, (2, b) : 0}
这就是我构建的约束:
def matches_language(self, patient, nurse): # LANGUAGE
return model.LANGUAGE_DUMMY[patient, nurse] <= model.ASSIGNMENTS[patient, nurse] * model.LANGUAGE_MATCH[patient, nurse]
model.LANG_MATCH = pe.Constraint(model.P, model.N, rule = matches_language)
因此,ASSIGNMENTS(p1,n1(充当了我们是否需要关心p1和n1是否具有匹配语言的选择器。我在目标函数中最大化lang_match,这反过来也应该最大化约束的RHS,从而促进语言匹配的分配。然而,我得到了这个错误:
ValueError: Solver unable to handle quadratic expressions. Constraint at issue: 'LANG_MATCH[1]'
我不认为这会是二次的,因为模型。LANGUAGES_MATCH是一个参数(用标量填充(,而不是一个变量。有人能帮我理解为什么会出现这个错误吗?
从伪代码和代码的混合来看,这里发生了什么并不清楚。但如果你已经计算出一些";奖励积分";用于匹配患者CCD_ 1和护士CCD_。(旁白:你可以随心所欲地制作这个查找表……但这与pyomo
是分开的(
所以,你有这个积分表,比如:{(n1, p1): 0, (n1, p2): 5, ...}
如果你有一个决策变量x[n, p]
,那么你不需要任何约束或伪变量,只需要让它成为目标函数的一个组成部分。
obj = <some other stuff> + w * sum(m.x[n, p] * m.language_bonus[n, p] for n in N for p in P)
其中CCD_ 6是该分数相对于其余部分可能需要的部分权重。
你可能会得到";二次型";警告,因为您正在将变量相乘,这是不必要的。