Python 使用纸浆优化团队分配

Python 使用纸浆优化团队分配,python,django,pulp,integer-programming,Python,Django,Pulp,Integer Programming,背景:我试图将学生分配到团队中,每个学生都会对团队中的其他学生有一系列偏好。我有一个我想最小化的目标函数,以及函数的3个约束条件(如下图所示)。在我的数据库中,我有一组学生及其偏好(例如,学生I将学生j评为他们的第三选择) 如果学生A将学生B评为他们的第一选择,则该偏好的权重为1,这就是目标函数设置为最小化的原因 数学公式: 问题:我不确定我是否在纸浆中正确地编写了约束和变量,并且我找不到任何使用偏好进行团队分配的密切资源。我是一个非常新的纸浆和挣扎,如果我写的是正确的语法,感谢任何帮助 以下

背景:我试图将学生分配到团队中,每个学生都会对团队中的其他学生有一系列偏好。我有一个我想最小化的目标函数,以及函数的3个约束条件(如下图所示)。在我的数据库中,我有一组学生及其偏好(例如,学生I将学生j评为他们的第三选择)

如果学生A将学生B评为他们的第一选择,则该偏好的权重为1,这就是目标函数设置为最小化的原因

数学公式:

问题:我不确定我是否在纸浆中正确地编写了约束和变量,并且我找不到任何使用偏好进行团队分配的密切资源。我是一个非常新的纸浆和挣扎,如果我写的是正确的语法,感谢任何帮助

以下是我在文件中编写的代码:

from pulp import *

model = LpProblem("Team Allocation Problem", LpMinimize)

############ VARIABLES ############

students = [1,...,20]
n = 20
# this will be imported from the database
r = [[...],...,[...]]
team_sizes = [5,5,5,5] 
num_teams = len(z)

# x(ik) = 1 if student i in team k
x_vars = [[LpVariable("x%d%d" % (i,k), cat='Binary') 
        for k in range(num_teams)] 
        for i in range(num_students)]
# y(ijk) = 1 if student i and j are in team k
y_vars = [[[LpVariable("y%d%d%d" % (i,j,k), cat='Binary') 
        for k in range(num_teams)] 
        for j in range(num_students)] 
        for i in range(num_students)]


############ OBJECTIVE FUNCTION ############

for i in range(num_students):
    for j in range(num_students):
        if i!=j:
            for k in range(num_teams):
                model += r[i][j] * y_vars[i][j][k], "Minimize the sum of rank points in the team"

############ CONSTRAINTS ############

# C1: Every student is on exactly one team
for i in range(num_students):
    for k in range(num_teams):
        model += lpSum(x_vars[i][k]) == 1


# C2: Every team has the right size
for k in range(num_teams):
    for i in range(num_students):
        model += lpSum(x_vars[i][k]) == team_sizes[k]

# C3: 
for i in range(num_students):
  for j in range(num_students):
      if i != j:
          for k in range(num_teams):
              model += 1 + y_vars[i][j][k] >= x_vars[i][k] + x_vars[j][k]

# Solve and Print
model.solve()
print("Status:", model.status)
(1) 确保目标的意义是正确的。我看你的问题的方式,你应该最大化

(2) 正确线性化

  y(i,j,k) = x(i,k)*x(j,k)


y(i,j,k)欢迎来到堆栈溢出!现在我们无法运行您的代码,因为它不包含任何示例数据。请将此更新为一个玩具示例(希望只有几个学生和几个团队),以便本网站上的其他人可以使用您的代码。谢谢再加上@josliber的评论——如果你能提供一个让回答更有趣的答案——这样你就更有可能得到好的答案。祝你好运!在这种情况下,我想将目标最小化,如果有人将某人作为他们的第一选择,他们基本上会得到1分,第二名得2分,第三名得3分等。这应该包括在原始问题中。模型会认为0分更好。刻度必须是线性的。要详细说明这一点:在公式中不能有
0=无点1=最佳2=次优,
。我建议重新编码你的分数:
0=没有分数,1=正常,2=更好,3=最好
。(只是数据的预处理)。然后最大化而不是最小化。如果需要,您可以为不喜欢添加
-1,-2
  y(i,j,k) <= x(i,k)
  y(i,j,k) <= x(j,k)
  y(i,j,k) >= x(i,k)+x(j,k)-1