binpacking.gms : 빈 수를 추정하는 다양한 방법으로 인한 빈 포장 문제

설명

이 모델은 빈 패킹 문제에 대한 간단한 바이너리 최적화 모델을 구현합니다.
내장 코드 Python을 사용하여 J.E. Beasley ORLib 인스턴스에서 데이터를 읽습니다.
https://people.brunel.ac.uk/~mastjjb/jeb/orlib/binpackinfo.html에서 수집하세요.
또한 다양한 방법을 사용하여 필요한 빈 수를 결정합니다. 수
bins는 슬롯 나라 컴파일 타임에 필요합니다(set j). 기본적으로 실행 시간 슬롯 나라 코드는
임베디드 코드 슬롯 나라 섹션은 bin 수를 추정합니다.

대형 모델 유형 :MIP


카테고리 : 슬롯 나라 모델 라이브러리


메인 파일 : binpacking.gms   포함: binpack5.txt

$title 빈 수를 추정하는 다양한 방법으로 빈 포장 문제 (binpack,SEQ=433)

$onText
이 모델은 빈 패킹 문제에 대한 간단한 이진 최적화 모델을 구현합니다.
내장 코드 Python을 사용하여 J.E. Beasley ORLib 인스턴스에서 데이터를 읽습니다.
https://people.brunel.ac.uk/~mastjjb/jeb/orlib/binpackinfo.html에서 수집하세요.
또한 다양한 방법을 사용하여 필요한 빈 수를 결정합니다. 수
bins는 슬롯 나라 컴파일 타임에 필요합니다(set j). 기본적으로 실행 시간 슬롯 나라 코드는
임베디드 코드 슬롯 나라 섹션은 빈 수를 추정합니다.
$offText

'항목'을 설정합니다.
매개변수 s(i<) '항목 크기';
스칼라 B '빈 용량';

$인스턴스를 설정하지 않은 경우 $set 인스턴스 binpack5.txt
$onEmbeddedCode 파이썬:
open('%instance%')을 fp로 사용:
   s = []
   i의 경우 enumerate(fp)의 줄:
      내가 == 2인 경우:
         B = float(line.split()[0])
         I = int(line.split()[1])
         슬롯 나라set('B',[B])
      elif i >= 3:
         s.append((str(i-2),float(line)))
         i-2 == I인 경우: 중단
   슬롯 나라set('s',s)
$offEmbeddedCodes b

* 항목 크기를 무작위로 지정
s(i) = 균일(0.9,1.1)*s(i);

$설정되지 않은 경우 방법 $set 방법 ecgams
$ifThenI %method%==ecgams
* 빈에 대한 간단한 경계를 위해 실행 시간 루프를 사용하려면 내장된 슬롯 나라를 사용하세요.
Scalar nj '모든 품목을 포장하는 데 필요한 상자 수';
$save.keepCode bp
$onEmbeddedCode 슬롯 나라: 재시작=bp
* 필요한 bin 수에 대한 간단한 바인딩을 구현합니다.
스칼라 크기 '활성 Bin의 크기' /0/;
nj = 1;
loop(i, 크기 = 크기+s(i); if (크기>B, nj = nj+1; 크기 = s(i)));
$offEmbeddedCode nj
$eval 뉴저지 뉴저지
$elseIfI %method%==크기i
* 필요한 상자 수에 따라 항목 수를 사용하십시오.
$eval NJ 카드(i)
$elseIfI %method%==수정됨
* 상자 수에 따라 항목 비율을 사용하십시오(너무 작을 수 있음).
$eval NJ 라운드(카드(i)/3)
$elseIfI %method%==명시적
* 사용자가 제공한 빈 수 사용(너무 작을 수 있음)
$설정되지 않은 경우 NJ $set NJ 10
$else
$error '빈 수를 추정하기 위해 선택된 유효한 방법이 없습니다'
$endIf

$log --- 이 모델은 %NJ% 저장소에서 작동합니다.

j 'bin' 설정 / b1*b%NJ% /;

* 빈 수를 최소화하는 간단한 최적화 모델:
이진 변수 y(i,j) 'bin에 항목 할당', z(j) 'bin open';
변수 open_bins '열린 상자 수';

방정식
    defopen(j) '열린 상자에만 항목 허용'
    defone(i) '각 항목을 하나의 저장소에 할당'
    defobj '열린 빈 개수 계산';

defopen(j).. sum(i, s(i)*y(i,j)) =l= z(j)*B;
defone(i)..sum(j, y(i,j)) =e= 1;
defobj.. open_bins =e= sum(j, z(j));

모델 bp '빈 패킹' /all/;

bp.resLim=10; mip를 사용하여 bp min open_bins를 해결합니다.
abort$(bp.modelStat <> %modelStat.integerSolution% 및
       bp.modelStat <> %modelStat.feasibleSolution% 및
       bp.modelStat <> %modelStat.optimal%) '정수 솔루션이 없습니다. 아마도 j(bins)를 너무 작게 설정했을 것입니다.';