如何在LPSolve中实现所有不同的约束?

时间:2013-04-16 23:03:23

标签: r mathematical-optimization lpsolve

我遇到一个问题,其解决方案必须在每个变量中包含唯一值。例如,24名战斗机飞行员必须在一天的不同时间内离开。因此,根据订单的一些约束,解决方案必须按某种顺序包含integerse 1:24。

我尝试使用特殊有序集在LPSolve中执行此操作,但我无法理解如何使用它。在任何情况下,我的试验都花了这么长时间来执行,我不敢相信我正确地设置了这个。我可以使用蛮力在1/1000的时间内解决它。

使用LPSolve / integer编程来优化一组唯一的相邻整数是否可行?如果是这样,在R(或Python)中添加约束来表达x1!= x2!= x3!= xN的最佳方法是什么?如果没有,我应该考虑哪种算法进行这种优化?

这是我到目前为止的代码:

library('lpSolveAPI')

people <- c('Joe', 'Bob', 'Dave', 'Mike')
number_of_people = length(people)

model <- make.lp(0, number_of_people)
set.type(model, 1:number_of_people, 'integer')
set.bounds(model, lower=rep(1, number_of_people), 
      upper=rep(number_of_people, number_of_people))

constraint_names <- c('Bob < Mike')
add.constraint(model, c(0, 1, 0, -1), '<=', -0.1)
constraint_names <- append(constraint_names, 'Mike > Joe')
add.constraint(model, c(-1, 0, 0, 1), '>=', 0.1)
dimnames(model) <- list(constraint_names, people)

#not sure about this
#add.SOS(model, 'different positions', type=2, 
#priority=1,columns=1:number_of_people, weights=rep(1, number_of_people))

set.objfn(model, rep(1, length(people)))
lp.control(model, sense='min')
write.lp(model,'model.lp',type='lp')

solve(model)
get.variables(model)

1 个答案:

答案 0 :(得分:3)

不是求解x1, x2, ..., xN,而是求解布尔方Y[i, j]的方阵,其中Y[i, j] == 1表示xi位于j

您需要将每个xi分配给一个j

sum(Y[i, j]) == 1           # sum over j, for each i

每个xi分配给不同j的约束写入:

sum(Y[i, j]) == 1           # sum over i, for each j

在将每个x1, x2, ..., xN定义为虚拟整数变量后,仍可以xi表示原始约束和目标(如果需要):

xi = sum(j * Y[i,j])  # sum over j, for each i