решить нелинейное программирование на жаргоне - PullRequest
0 голосов
/ 04 декабря 2018

предположим, что есть три прямоугольника, которые мы должны поместить в большой прямоугольник шириной 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, я получаю следующие результаты, и я рисую его следующим образом:

введите описание изображения здесь

результат не удовлетворен первые ограничения, я проверилкод весь день, но я не могу найти никаких ошибок.Любая помощь будет оценена, спасибо!

...