使用可选变量搜索策略

时间:2015-10-09 07:43:47

标签: constraint-programming minizinc gecode

我在Minizinc中实施一个简单的模型,在一系列时间段内安排具有不同优先级和持续时间的任务,但并非所有任务都可以安排,所以有些任务将被遗漏,我尝试了最大化计划任务的优先级总和。

我有一个工作版本,其中任务在vars数组中定义,非计划任务有时间0.约束有几个where子句只考虑计划任务(当[i]> 0时)。默认搜索策略非常慢,因此我使用Gecode作为求解器将其更改为效果更好的另一个。

现在我使用可选变量实现不同的版本,以摆脱where子句,检查是否有任何改进。但是,在使用opt var。

时,我似乎无法定义搜索策略int_search()

有什么办法吗?

工作模型如下(带有我想尝试的搜索策略的solve子句被注释掉):

int: numtasks=100;
int: numslots=100;

set of int: TASK=1..numtasks;
set of int: SLOT=1..numslots;
array[TASK] of var opt 1..numslots: when;
array[TASK] of int: duration = [(i mod 3)+1 | i in TASK];
array[TASK] of int: prio = [(i mod 10)+1 | i in TASK]; 

include "globals.mzn";
constraint disjunctive(when, duration);

var int: obj = sum(i in TASK where not absent(when[i]))(prio[i]);
%solve ::int_search(when, input_order, indomain_random, complete) maximize obj;
solve maximize obj;

output [show(obj)," ",show(when)];

1 个答案:

答案 0 :(得分:2)

我不确定这是否是最佳方法,但可以使用"来发生()"在" int_search",即。

 solve ::int_search([occurs(when[t]) | t in TASK], input_order, indomain_random, complete) maximize obj;

此外,我建议您使用除input_order / indomain_random之外的其他标签进行测试,例如first_fail / indomain_split等

/哈坎