为事件分配时间

Assigning times to events

   include "globals.mzn";
   %Data
   time_ID = [11,12,13,14,15];
   eventId = [0011, 0012, 0013, 0021, 0022, 0031, 0041, 0051, 0061, 0071];
   int:ntime = 5;
   int:nevent = 10;
   set of int: events =1..nevent;
   set of int: time = 1..ntime;
   array[1..nevent] of int:eventId;
   array[1..nevent] of var time:event_time;
   array[1..ntime] of int:time_ID;
   solve satisfy;
   constraint
   forall(event in eventId)(
   exists(t in time_ID)(
   event_time[event] = t ));
   output[ show(event_time) ];

我正在尝试使用上面的代码为事件分配时间。 但是,它不是随机分配时间给事件,而是 returns 一个错误“数组访问越界” 如何从时间数组中随机生成 select ? 谢谢

错误是因为您试图在 "event_time" 数组中分配索引 11(eventId 数组中的第一个元素)。

仅 1 的赋值是正确的,因为您没有对 "event_time" 数组进行任何其他约束。如果您将解决方案的数量设置为 - 比如说 - 3,您将看到其他解决方案。而且,事实上,现在的约束并没有真正意义,因为它只是确保对 "event_time" 中的元素进行了一些分配,但此约束由 "event_time" 的域处理(即所有索引都在 1..ntime 范围内)。