AMPL 的多种解决方案
Multiple solutions with AMPL
我正在尝试使用 AMPL 对问题建模,我希望能够看到备选方案或多个 "optimal or near optimal" 解决方案。
我在这个网站上读到:http://orinanobworld.blogspot.com/2011/02/finding-multiple-solutions-in-binary.html
我试过将这种东西适合我自己的模型
并尝试实现如下内容:
set RECORDS; # items available to choose from
var Picked {RECORDS} binary; # the variables that were set to 1 for "picked"
#other conditions and model constraints....
# we now create some structure to record multiple solutions
param want := 5; # number of solutions we want
param nfound default 0; # number of solutions found
set ALTS {1..100} in {RECORDS}; # records which items were packed (and where) in each solution
# we add constraints to the previous model to exclude solutions we've already seen
s.t. Exclude {s in 1..nfound}:
sum {i in ALTS[s]} (1 - Picked[i]) + sum {j in {RECORDS} diff ALTS[s]} Picked[j] >= 1;
# solve until either the problem becomes infeasible or the right number of solutions have been found
for {s in 1..want} {
solve; # solve the model
if solve_result = 'infeasible' then break; # if the model has become infeasible, give up
#packed is getting the value of players that are in a lineup that have a "1" (>.5)
let ALTS[s] := {i in RECORDS : Picked[i] > 0.5};
let nfound := s; # bump the counter for solutions found
display s;
display ALTS[s];
}
当我 运行 我的模型使用这段代码时,它给了我 5 个完全相同的解决方案。我究竟做错了什么?作为一个单独的问题,似乎 Picked
也设置了一些非二进制值(例如 0.7235),尽管我认为将其设置为二进制会将其限制为 1 或 0。
您获得分数解的事实表明您正在解决松弛问题而不是 MIP 问题。例如,如果您使用不支持 MIP 的求解器(例如 MINOS),通常会出现这样的警告:
MINOS 5.51: ignoring integrality of 5 variables
并且您得到相同的解,因为约束 Exclude
仅适用于二元解。如果您使用 CPLEX 或 Gurobi 等 MIP 求解器,您应该得到不同的二元解法。
我正在尝试使用 AMPL 对问题建模,我希望能够看到备选方案或多个 "optimal or near optimal" 解决方案。
我在这个网站上读到:http://orinanobworld.blogspot.com/2011/02/finding-multiple-solutions-in-binary.html
我试过将这种东西适合我自己的模型
并尝试实现如下内容:
set RECORDS; # items available to choose from
var Picked {RECORDS} binary; # the variables that were set to 1 for "picked"
#other conditions and model constraints....
# we now create some structure to record multiple solutions
param want := 5; # number of solutions we want
param nfound default 0; # number of solutions found
set ALTS {1..100} in {RECORDS}; # records which items were packed (and where) in each solution
# we add constraints to the previous model to exclude solutions we've already seen
s.t. Exclude {s in 1..nfound}:
sum {i in ALTS[s]} (1 - Picked[i]) + sum {j in {RECORDS} diff ALTS[s]} Picked[j] >= 1;
# solve until either the problem becomes infeasible or the right number of solutions have been found
for {s in 1..want} {
solve; # solve the model
if solve_result = 'infeasible' then break; # if the model has become infeasible, give up
#packed is getting the value of players that are in a lineup that have a "1" (>.5)
let ALTS[s] := {i in RECORDS : Picked[i] > 0.5};
let nfound := s; # bump the counter for solutions found
display s;
display ALTS[s];
}
当我 运行 我的模型使用这段代码时,它给了我 5 个完全相同的解决方案。我究竟做错了什么?作为一个单独的问题,似乎 Picked
也设置了一些非二进制值(例如 0.7235),尽管我认为将其设置为二进制会将其限制为 1 或 0。
您获得分数解的事实表明您正在解决松弛问题而不是 MIP 问题。例如,如果您使用不支持 MIP 的求解器(例如 MINOS),通常会出现这样的警告:
MINOS 5.51: ignoring integrality of 5 variables
并且您得到相同的解,因为约束 Exclude
仅适用于二元解。如果您使用 CPLEX 或 Gurobi 等 MIP 求解器,您应该得到不同的二元解法。