拍卖算法的代理项目分配的强力计算

时间:2016-03-24 12:59:14

标签: r algorithm mathematical-optimization combinatorics

我正在与各种auction algorithms合作评估作业 n 项目 n 代理通过出价机制,以便每个代理只分配给一个项目,并且每个项目仅分配给一个代理。我想通过将它们与蛮力方法进行比较来评估我正在测试的算法的性能。比较是 通过价值分配的总和,我试图最大化。

set.seed(1)

#Assume:
n <- 3
agents <- 1:3 # agent IDs
items <-1:3 # item IDs

# each agent has a preference score for each item
# create agent x item matrix w/ cells containing pref score
(m <- matrix(data = round(runif(9, 0, 1),3), nrow = n, ncol = n))

##       [,1]  [,2]  [,3]
## [1,] 0.266 0.908 0.945
## [2,] 0.372 0.202 0.661
## [3,] 0.573 0.898 0.629

# Given these sample data, here is one possible assignment
s <- data.frame(agent = agents, item = NA, score = NA)

# assign item & corresponding score to agent
s[1,"item"] <- 1; s[1,"score"] <- m[1,1]
s[2,"item"] <- 2; s[2,"score"] <- m[2,2]
s[3,"item"] <- 1; s[3,"score"] <- m[3,3]
s
##   agent item score
## 1     1    1 0.266
## 2     2    2 0.202
## 3     3    1 0.629


# The value/score of this particular assignment s
(total_score <- sum(s$score))
## [1] 1.097

我想做的是,给定我的代理和项目向量创建一个数据结构,其中包含成员项目分配的每种可能组合。通过我的计算,应该有阶乘(n)可能的组合。因此,在n <-3的示例中,最终结构应该具有6行。

这是我想要的符号表示。每行对应一个特定的完整赋值,其中代理是列,其对应的项是单元格值:

#     a1    a2    a3 <- cols are agents
#     ______________
# s1 | 1     2     3 <- corresponds to assignment s above
# s2 | 1     3     2
# s3 | 2     1     3
# s4 | 2     3     1
# s5 | 3     2     1
# s6 | 3     1     2

我不清楚实现 n 的任何正值的最佳方法。我试过了expand.grid(),但这似乎并不合适 我希望实现的目标。是否有我可以使用的功能,或者是否有人对我可以为此实现的算法有任何建议?

1 个答案:

答案 0 :(得分:3)

展开网格在这里不起作用,因为它会创建代理和项目的所有可能组合,因此它会产生一个组合,例如所有代理都获得第一个项目。 我建议改用排列。它足以置换物品,让代理商留在同一地点。我正在使用<appender name="PasswordObfuscationAppender" type="Foundation.PasswordObfuscationAppender,Foundation" /> <appender name="MainAppender" type="log4net.Appender.RollingFileAppender"> <file value="..\Logs\File.log" /> </appender> <root> <level value="DEBUG" /> <appender-ref ref="PasswordObfuscationAppender" /> <appender-ref ref="MainAppender" /> </root> 包来生成排列:

combinat

library(combinat)
permn(1:3)

列表的每个元素对应于项目的一种可能的排列。因此,[[1]] [1] 1 2 3 [[2]] [1] 1 3 2 [[3]] [1] 3 1 2 [[4]] [1] 3 2 1 [[5]] [1] 2 3 1 [[6]] [1] 2 1 3 表示第一个代理获得第二个项目,第二个代理获得第一个项目,第三个代理获得第三个项目。 为了找出相应的分数,我们可以使用布尔单位矩阵的排列来对我们的分数矩阵进行子集化:

2 1 3

最后,我们计算所有排列的个人得分和总得分,并将结果存储在一个整洁的#creating scores matrix n=3 m <- matrix(data = round(runif(9, 0, 1),3), nrow = n, ncol = n) #creating boolean identity matrix E=matrix(as.logical(diag(1,n,n)),nrow=n,ncol=n) m[E[,c(1,3,2)]] #this shows the scores of 1 3 2 item combination #[1] 0.472 0.039 0.223 中:

data.table