설명
공식에서 자원 제약이 있는 프로젝트 일정 문제(RCPSP) 이진 종료 시간 표시 변수를 사용하여 일정을 인코딩합니다. Pritsker가 처음 제안한대로. 다음을 기반으로 한 문제 및 모델 공식화: 프리츠커, A. 앨런 B., 로렌스 J. 웨이터스, 필립 M. 울프. "다중 프로젝트 제한된 리소스를 사용한 예약: 제로원 프로그래밍 접근 방식입니다." 경영과학 16.1(1969): 93-108. 클래식에서 인스턴스 데이터를 구문 분석하기 위한 내장 Python 코드가 포함되어 있습니다. Kolisch 및 Sprecher의 문제 라이브러리 PSPLIB. 인스턴스 라이브러리, 생성기 및 파일 형식: 콜리쉬(Kolisch), 라이너(Rainer), 아르노 슈프레허(Arno Sprecher). "PSPLIB-프로젝트 일정 문제 라이브러리: OR 소프트웨어-ORSEP 운영 연구 소프트웨어 교환 프로그램." 유럽 운영 연구 저널 96.1(1997): 205-216.http://www.om-db.wi.tum.de/psplib/main.html기본적으로 30개 프로젝트가 있는 PSPLIB 하위 집합의 첫 번째 인스턴스는 최적으로 해결됩니다(makespan=43). 작은 값을 명시적으로 사용하려면 다음 달러 세트 문을 주석 처리하세요. PSPLIB의 인스턴스 대신 지정된 예제 프로젝트 기본 프로젝트 정보(주요 매개변수)
대형 모델 유형 :MIP
카테고리 : 무료 슬롯 게임 모델 라이브러리
메인 파일 : rcpsp.gms 포함: j301_1.sm
$title 자원이 제한된 프로젝트 일정 문제(RCPSP,SEQ=429)
$onText
공식화에서 자원 제약이 있는 프로젝트 일정 문제(RCPSP)
이진 종료 시간 표시 변수를 사용하여 일정을 인코딩합니다.
Pritsker가 처음 제안한대로.
다음을 기반으로 한 문제 및 모델 공식화:
프리츠커, A. 앨런 B., 로렌스 J. 웨이터스, 필립 M. 울프. "다중 프로젝트
제한된 리소스를 사용한 예약: 제로원 프로그래밍 접근 방식입니다."
경영과학 16.1(1969): 93-108.
클래식에서 인스턴스 데이터를 구문 분석하기 위한 내장 Python 코드가 포함되어 있습니다.
Kolisch 및 Sprecher의 문제 라이브러리 PSPLIB.
인스턴스 라이브러리, 생성기 및 파일 형식:
콜리쉬(Kolisch), 라이너(Rainer), 아르노 슈프레허(Arno Sprecher). "PSPLIB-프로젝트 일정 문제
라이브러리: OR 소프트웨어-ORSEP 운영 연구 소프트웨어 교환 프로그램."
유럽 운영 연구 저널 96.1(1997): 205-216.
http://www.om-db.wi.tum.de/psplib/main.html
기본적으로 30개 프로젝트가 있는 PSPLIB 하위 집합의 첫 번째 인스턴스는 최적성(makespan=43)으로 해결됩니다.
$offText
* 작은 값을 명시적으로 사용하려면 다음 달러 세트 문을 주석 처리하세요.
* PSPLIB의 인스턴스 대신 지정된 예제 프로젝트
$set 인스턴스 이름 j301_1.sm
* 기본 프로젝트 정보(1차 매개변수)
세트
j '작업(위상적으로 순서가 지정되어야 함, 즉 i<j는 j가 i의 선행 작업이 아님을 의미함)'
t '기간'
r '재생 가능한 자원';
별칭 (j,i), (t,tau);
set pred(i,j) 'i가 j(순서 관계)의 선행인 경우에만 '예'입니다.
매개변수
capacities(r) '모든 기간에 사용 가능한 재생 가능한 자원 용량'
Duration(j) '작업 기간(처리 시간)'
요구(j,r) '활성 상태에서 작업 j가 요구/점유하는 r의 자원 단위 수';
* 파생 매개변수(위 매개변수에서 제공한 데이터로부터 무료 슬롯 게임에 의해 파생됨)
매개변수
efts(j) '가장 빠른 종료 시간'
lfts(j) '최근 종료 시간';
세트
tw(j, t) '예, t가 작업 j의 완료 시간 창에 있는 경우에만 (efts(j)<=t<=lfts(j))'
Actual(j) '실제 작업 집합(j는 더미 작업 없음)'
lastJob(j) '마지막 더미 작업만 포함하는 싱글톤 세트'
fw(j,t,tau) '예, 작업 j(기간 t에 활성)가 기간 tau에 완료될 수 있는 경우에만 가능합니다.';
바이너리 변수
x(j,t) '1 작업 j가 기간 t에 끝나는 경우에만';
변수
makespan '총 프로젝트 기간';
방정식
'마지막 작업이 끝나는 시간을 통해 임시 기간을 결정'하는 것이 목표입니다.
우선순위 '작업 우선순위 시행'
재사용 '재생 가능한 자원의 소비를 제한'
한 번 '각 작업은 정확히 한 번만 예약되어야 합니다.';
목표.. makespan =e= sum(j$lastJob(j), sum(t$tw(j,t), x(j,t)*(ord(t)-1)));
우선 순위(pred(i,j)).. sum(tw(i,t), ord(t)*x(i,t)) =l= sum(t$tw(j,t), ord(t)*x(j,t)) - 기간(j);
재사용(r,t).. sum(actual(j), 요구 사항(j,r)*sum(fw(j,t,tau), x(j,tau))) =l= 용량(r);
한 번(j).. sum(tw(j,t), x(j,t)) =e= 1;
모델 rcpsp /all/;
$ifThenE 인스턴스 이름 설정
$onEmbeddedCode Python: %instanceName%
# 유틸리티 기능
def ints(strs): [ strs의 s에 대한 int(s)]를 반환합니다.
def myset(접두사, 카디널리티):
범위(카디널리티)에 있는 i에 대해 [f'접두사i+1'을 반환합니다.
def index_of_line(라인, 하위 문자열):
return next(i의 경우 i, line in enumerate(lines) if substr in line)
def rhs_part(라인, 접두사):
반환 라인[index_of_line(lines, prefix)].split(':')[1]
def succs_from_line(line): return [ f'jj' for j in line.split()[3:] ]
def 열(라인, 열, rowStart, rowCount):
범위(rowStart, rowStart+rowCount)]의 rowIx에 대해 [int(lines[rowIx].split()[col])을 반환합니다.
# 텍스트 파일에서 데이터를 구문 분석합니다.
open(str(무료 슬롯 게임arguments))를 fp로 사용: line = fp.readlines()
njobs = int(rhs_part(lines, '작업(수퍼소스 포함'))
nres = int(rhs_part(lines, '- 재생 가능').split()[0])
n기간 = int(rhs_part(lines, 'horizon'))
prec_offset = index_of_line(lines, '선행 관계:')+2
attrs_offset = index_of_line(라인, '요청/기간')+3
caps_offset = index_of_line(라인, 'RESOURCEAVAILABILITIES')+2
작업, res, 기간 = myset('j', njobs), myset('r', nres), myset('t', n기간)
succs = j: succs_from_line(lines[prec_offset+ix]) for ix,j in enumerate(jobs)