Я пытаюсь понять ограничение MiniZincs geost
, которое описано в раздел ограничений упаковки в документации. Я пытаюсь реализовать 2D-упаковку прямоугольников с вращением: поэтому я хотел бы разместить прямоугольники на пластине заданной длины и ширины, но мне трудно понять ожидаемый формат ввода. .
У меня есть следующая модель, где я читаю количество частей или прямоугольников, которые нужно поместить в nParts
. nShapes
- количество форм, которые могут принимать эти прямоугольники.
include "globals.mzn";
int: nParts;
set of int: PARTS = 1..nParts;
int: nShapes;
set of int: SHAPES = 1..nShapes;
int: plateLength;
int: plateWidth;
set of int: LEN = 0..plateLength;
set of int: WID = 0..plateWidth;
int: k = 2;
set of int: DIM = 1..k;
array[SHAPES,DIM] of int: rect_size;
array[SHAPES,DIM] of 0..0: rect_offset;
array[PARTS] of set of SHAPES: shape;
array[PARTS,DIM] of var int: xy;
array[PARTS] of var SHAPES: kind;
constraint geost(k, rect_size, rect_offset, shape, xy, kind);
constraint forall(i in PARTS)(kind[i] in shape[i]);
constraint forall(i in PARTS)(xy[i,1] in LEN);
constraint forall(i in PARTS)(xy[i,1] + rect_size[kind[i], 1] in LEN);
constraint forall(i in PARTS)(xy[i,2] in WID);
constraint forall(i in PARTS)(xy[i,2] + rect_size[kind[i], 2] in WID);
Данная модель, кажется, работает для этих чрезвычайно простых данных (размещение только одного прямоугольника с двумя возможными формами):
plateLength = 4000;
plateWidth = 4000;
nParts = 1;
nShapes = 2;
rect_size = [|4000, 2000|
2000, 4000|];
rect_offset = [|0, 0|
0, 0|];
shape = [{1,2}];
Тем не менее, для более сложных данных я сталкиваюсь с ошибками, что приводит к выводу, что мое понимание формата ввода может быть неправильным. В следующем примере я хочу разместить 5 частей на пластине и ожидать такого результата: первый прямоугольник может принимать форму [4000, 2000] или [2000, 4000] и поэтому индексируется через {1, 2}, второй прямоугольник может иметь форму [2000, 2000] и индексируется через {3}.
plateLength = 4000;
plateWidth = 4000;
nParts = 5;
nShapes = 7;
rect_size = [|4000, 2000|
2000, 4000|
2000, 2000|
1000, 2000|
2000, 1000|
500, 1000|
1000, 500|];
rect_offset = [|0, 0|
0, 0|
0, 0|
0, 0|
0, 0|
0, 0|
0, 0|];
shape = [{1,2}, {3}, {4,5}, {6,7}, {6,7}];
Эта спецификация верна? Если нет, как я могу правильно указать ввод для ограничения геостационизма? Также поможет простой пример, я нашел только довольно сложные здесь и здесь.