【问题标题】:Search strategy with optional variables带有可选变量的搜索策略
【发布时间】:2015-10-09 07:43:46
【问题描述】:

我在 Minizinc 中实现了一个简单的模型,以在一系列时隙中安排具有不同优先级和持续时间的任务,但并非所有任务都可以安排,因此有些任务会被忽略,我正在尝试最大化总和计划任务的优先级。

我有一个工作版本,其中任务在变量数组中定义,非计划任务的时间为 0。约束有几个 where 子句仅考虑计划任务(when[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)];

【问题讨论】:

    标签: constraint-programming minizinc gecode


    【解决方案1】:

    我不确定这是否是最好的方法,但可以在“int_search”中使用“occurs()”进行测试,即

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

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

    /哈坎

    【讨论】:

    • 谢谢。看看occurs 是如何工作的。关于搜索策略,我尝试了几种组合,但这一种似乎是快速获得解决方案并改进它的最佳选择。另一种工作正常的搜索策略(为简单起见,我删除了)是提供数组when,按优先级递减排序并使用 input_order,因为预计高优先级任务比低优先级任务更频繁地调度。如果我增加任务和插槽的数量(1000、1000),我也会遇到问题,它会崩溃或使用我所有的 RAM。我想我会在另一个问题中问这个问题。
    猜你喜欢
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2022-07-27
    • 2013-05-03
    • 1970-01-01
    相关资源
    最近更新 更多