предположим, что есть три прямоугольника, которые мы должны поместить в большой прямоугольник шириной a, каждый прямоугольник имеет вес a_i и высоту b_i, положение каждого прямоугольника равно (x_i, y_i).первое ограничение означает, что все прямоугольники не могут перекрываться.
Нелинейное программирование сформулировано следующим образом: введите описание изображения здесь КОД ЕСТЬ:
MODEL:
SETS:
RECTANGLES/1,2,3/:XPOS,YPOS,WIDTH,HEIGHT;
BBB/1,2,3,4,5,6,7,8,9,10,11,12/:B,M;
ENDSETS
MIN=A^2;
@FOR(RECTANGLES(I):XPOS(I)>=0);
@FOR(RECTANGLES(I):YPOS(I)>=0);
@FOR(RECTANGLES(I):XPOS(I)+WIDTH(I)<=A);
@FOR(RECTANGLES(I):YPOS(I)+HEIGHT(I)<=3*A/4);
@FOR(RECTANGLES(I):1.584*HEIGHT(I)<=WIDTH(I));
@FOR(RECTANGLES(I):WIDTH(I)<=1.936*HEIGHT(I));
@FOR(RECTANGLES(I):WIDTH(I)>=100);
@FOR(RECTANGLES(I):HEIGHT(I)>=100);
A>0;
0.99*WIDTH(1)<=WIDTH(2);
WIDTH(2)<=1.21*WIDTH(1);
2*WIDTH(1)<=WIDTH(3);
WIDTH(3)<=2.3*WIDTH(1);
!(XPOS(1)+WIDTH(1)#LT#XPOS(2))#OR#(XPOS(2)+WIDTH(2)#LT#XPOS(1))#OR#(YPOS(1)+HEIGHT(1)#LT#YPOS(2))#OR#(YPOS(2)+HEIGHT(2)#LT#YPOS(1))=1;
!(XPOS(3)+WIDTH(3)#LT#XPOS(2))#OR#(XPOS(2)+WIDTH(2)#LT#XPOS(3))#OR#(YPOS(3)+HEIGHT(3)#LT#YPOS(2))#OR#(YPOS(2)+HEIGHT(2)#LT#YPOS(3))=1;
!(XPOS(1)+WIDTH(1)#LT#XPOS(3))#OR#(XPOS(3)+WIDTH(3)#LT#XPOS(1))#OR#(YPOS(1)+HEIGHT(1)#LT#YPOS(3))#OR#(YPOS(3)+HEIGHT(3)#LT#YPOS(1))=1;
!@for(BBB(I):M(I)>10000;!);
M(1)=a;
M(2)=a;
M(5)=a;
M(6)=a;
M(9)=a;
M(10)=a;
M(3)=3*A/4;
M(4)=3*A/4;
M(7)=3*A/4;
M(8)=3*A/4;
M(11)=3*A/4;
M(12)=3*A/4;
XPOS(1)+WIDTH(1)<=XPOS(2) + M(1)*b(1);
XPOS(2)+WIDTH(2)<=XPOS(1) + M(2)*b(2);
YPOS(1)+HEIGHT(1)<=YPOS(2) + M(3)*b(3);
YPOS(2)+HEIGHT(2)<=YPOS(1) + M(4)*b(4);
XPOS(1)+WIDTH(1)<=XPOS(3) + M(5)*b(5);
XPOS(3)+WIDTH(3)<=XPOS(1) + M(6)*b(6);
YPOS(1)+HEIGHT(1)<=YPOS(3) + M(7)*b(7);
YPOS(3)+HEIGHT(3)<=YPOS(1) + M(8)*b(8);
XPOS(2)+WIDTH(2)<=XPOS(3) + M(9)*b(9);
XPOS(3)+WIDTH(3)<=XPOS(2) + M(10)*b(10);
YPOS(2)+HEIGHT(2)<=YPOS(3) + M(11)*b(11);
YPOS(3)+HEIGHT(3)<=YPOS(2) + M(12)*b(12);
B(1)+B(2)+B(3)+B(4)<=3;
B(5)+B(6)+B(7)+B(8)<=3;
B(9)+B(10)+B(11)+B(12)<=3;
@for(BBB(I):@BIN(B(I)););
!@for(rectangles(I)| i#ge#1:
!@for(rectangles(j)| j#gt#I:
!(XPOS(i)+WIDTH(i)#LT#XPOS(j))#OR#(XPOS(j)+WIDTH(j)#LT#XPOS(i))#OR#(YPOS(i)+HEIGHT(i)#LT#YPOS(j))#OR#(YPOS(j)+HEIGHT(j)#LT#YPOS(i))=1;
!);
!);
END
ByLingo Solver, я получаю следующие результаты, и я рисую его следующим образом:
введите описание изображения здесь
результат не удовлетворен первые ограничения, я проверилкод весь день, но я не могу найти никаких ошибок.Любая помощь будет оценена, спасибо!