2010-06-06 6 views
7

작업과 작업의 두 가지 데이터 유형이 있습니다. 작업은 완료하는 데 일정한 시간이 걸리며이 작업으로 구성된 작업 집합이 필요합니다. 작업에는 일련의 작업이 있으며 작업은 그 중 하나를 선택하는 것입니다. 따라서 :작업을 수행하기위한 작업을 최적으로 선택하기위한 알고리즘

class Task { Set<Action> choices; } 
class Action { float time; Set<Task> dependencies; } 

예를 들어 기본 작업은 "집을 얻으십시오"일 수 있습니다. 이 작업의 가능한 작업 : "집 구입"또는 "집 만들기". "주택 건설"작업은 10 시간이 걸리고 "벽돌 가져 오기"(6 시간 소요) 및 "시멘트 가져 오기"(9 시간 소요) 등의 종속성이 있습니다.

총 시간은 수행해야 할 작업 (이 경우 10 + 6 + 9 시간)의 모든 시간의 합계입니다. 우리는 총 시간이 최소가되도록 조치를 선택하려고합니다.

종속성은 다이아몬드 모양 일 수 있습니다. 예를 들어 "벽돌 가져 오기"에는 "자동차 가져 오기"(벽돌 운반)가 필요하고 "시멘트 가져 오기"에는 자동차가 필요합니다. "벽돌 가져 오기"와 "시멘트 가져 오기"를 할지라도 차를 가져 오는 데 걸리는 시간은 단지 입니다.

종속성은 순환 될 수 있습니다. 예 : "돈"-> "직업"-> "자동차"-> "돈". 이것은 우리에게 아무런 문제가되지 않으며 단순히 "돈", "직업"및 "자동차"모두를 선택합니다. 총 시간은 단순히이 3 가지 시간의 합계입니다.

수학 설명 :

하자가 선택한 행동이 될 actions.

valid(task) = ∃action ∈ task.choices. (action ∈ actions ∧ ∀tasks ∈ action.dependencies. valid(task)) 
time = sum {action.time | action ∈ actions} 
minimize time subject to valid(primaryTask) 

나는 최적의 솔루션뿐만 아니라 대략적인 솔루션에도 관심이 있습니다. 아마도 일종의 역동적 인 프로그래밍이 도움이 될까요? 문제가 트리 구조라면 다이나믹 프로그래밍은 다항식 시간에 최적의 솔루션을 제공 할 수 있지만 다이아몬드 구조는 문제를 훨씬 더 어렵게 만듭니다. 알고리즘이 있지만 사이클이있는 경우 작동하지 않으면 게시하십시오! 나는 아직도 많은 것을 배울 수 있습니다.

alt text

상자는 작업을 대표하고 원 (작업이 원에 수행 할 수있는 시간을) 작업을 나타냅니다. 해당 작업이 작업에 대한 종속성 인 경우 작업에는 작업에 대한 줄이 있습니다. 그림의 관점에서 다시 문제에 대한 설명이 있습니다 : 사각형 (= 작업)이 선택되면 내부의 원 (= 동작) 중 하나를 선택해야합니다. 원이 선택되면 모든 연결된 사각형의을 선택해야합니다. 목표는 선택한 서클의 숫자 합계를 최소화하는 것입니다.

이 경우 최적의 솔루션은 맨 위 작업에서 시간이 2 인 작업을 선택하고 맨 아래 작업에서 시간이 1 인 작업을 선택하는 것입니다. 총 시간은 2 + 1 + 1 = 4입니다. 이 경우에는 2 가지 최적 해법이 있습니다. 두 번째 해결책은 맨 위 작업에서 시간이 3 인 작업을 선택하고 맨 아래 오른쪽 작업에서 시간이 1 인 작업을 선택하는 것입니다. 총 시간은 다시 3 + 1 = 4입니다. 시간이 3 인 작업을 최상위 작업에서 선택하면 왼쪽 작업을 수행 할 필요가 없습니다. 시간이 3 인 작업과 왼쪽 작업 사이에 선이 없기 때문입니다.나는 시시한 도면에 대해 사과

)) 그리고 두 더 많은 예제는 (각각에 대한 최적의 솔루션은 파란색으로 표시하고 있으며, 기본 작업은 회색으로 표시되었습니다 이 alt text

+0

작업이 일정 시간 (Action.time)을 어떻게 잡을 수 있습니까? 액션의 시간은 Action.dependencies의 각 태스크를 수행하는 데 걸리는 시간에 의존해서는 안됩니까? – mbeckish

+0

네가 맞다. 용어는 불행하다. 작업이 수행하는 총 시간은 실제로 action.time + 모든 종속성의 총 시간입니다. action.time은 종속성 시간을 제외하고 해당 작업에 대한 시간입니다. – Jules

+1

질문에서, 필요할 때마다 수행해야 할 작업이 있다고 가정하면서 ("Get a car") 한 번만 수행해야하는 작업 ("벽돌 가져 오기")을 수행해야한다는 요구 사항을 암시합니다. 데이터 구조에 표시된 Task의이 속성은 어떻게됩니까? – mbeckish

답변

1

당신은 부분 순서 계획 알고리즘을 검색 될 수있다 : http://blackcat.brynmawr.edu/~dkumar/UGAI/planning.html#algorithms

+0

정확히 같은 문제는 아니지만 사용할 수있는 좋은 아이디어가 있습니다. mathoverflow의 사람들은 내 문제가 NP 하드라고 지적했기 때문에 다항식 시간 솔루션은 아마도 너무 많이 묻습니다.) – Jules

4

당신은으로이 모델 수 그래프를 만들고 shortest path algorithm을 사용하여 솔루션을 찾으십시오. 각 작업은 노드가되며 작업은 그래프의 가장자리가됩니다.

실제로 노드간에 상태를 전환하는 데 필요한 동작으로 노드를 상태 및 가장자리로 나타내는 것이 더 쉬울 것입니다.

작업을 단순히 작업 집계로 간주하고 노드를 상태로 모델링하고 작업을 해당 작업 간의 전환으로 모델링하는 경우. "집을 얻으십시오"를 기본 작업으로 생각하는 대신 "시작"과 "집을"두 노드로 간주하고 "집을 얻으십시오"는 전환을 고려하십시오. '하우스 가져 오기'전환 액션은 중간 상태 및 액션 (즉 노드 및 가장자리)을 나타내는 그래프로 분해 할 수 있습니다. 필요한만큼 문제를 분해하고 결과 그래프에서 최단 경로를 계산할 수 있어야합니다.

+0

고마워요. 노드 간 최단 경로? 기본 과제와 ... 사이에 있다고 생각하니? – Jules

+0

일반적으로 경로뿐만 아니라 그래프의 하위 그래프를 선택해야하기 때문에 어떻게 작동하는지 알 수 없습니다. – Jules

+3

이것은 그래프로 모델링 할 수있는 문제처럼 들리지만 모델은 이보다 더 복잡해야합니다. 당신은 "and"요구 사항 (벽돌과 시멘트가 필요한 집을 짓기 위해)과 "또는"(집을 짓거나 집으로 지을 집을 갖기 위해) 요구 사항이 있다는 것을 고려해야한다. 다르게 표현해야합니다. – sepp2k

0
+0

자세히 설명해주십시오. 토폴로지 정렬은 실제로 이것과 관련이 없다고 나는 생각하지 않는다. 하나는 그래프가 주기적 일 수 있고 위상 정렬은 아무 것도 최적화하지 않습니다. – Jules

+0

안녕하세요. 주기적인 그래프를 가지고 있다면, 경쟁 할 수없는 과제 (1)가 있습니다. 왜냐하면 다른 과제 (2)가 복잡해지기 전에 (1)을 복잡하게하기 위해서입니다 ... 그래프가 비순환 당신이 최적의 결과를 얻는 것보다 더 중요한 결과를 얻을 것입니다. 왜냐하면 당신이 다른 업무를 방해하지 않는 업무를 수행하기로 결정했기 때문에 "중요한 업무"의 순서가 가장 좋습니다. 알고리즘을 향상 시키려면 들어오는 가장자리가없는 모든 노드 집합에서 항상 최소의 확장 동작을 선택할 수 있습니다. 도움이 되길 바랍니다. – tsinik

1

은 내가 PERT 차트의 맥락에서이 연령대 전에했던 생각합니다.

이 네트워크의 크기는 얼마나되며 얼마나 자주 해결해야합니까? 실제로 성능 문제가있는 것은 아닙니다.

동적 프로그래밍을 사용합니다. 나는 그들이 경험에서 깨달을 때까지 공유 하위 작업이 문제가 될 것이라고는 생각하지 않을 것이다.

+0

구조는 때로 작고 때로는 수천, 때로는 수백만 개의 노드가 있지만 구조가 "쉽다"(예 : 대부분 나무 같다) 일 수 있습니다. 공유 하위 작업은 여전히 ​​흔한 일이기 때문에 알고리즘은이를 고려해야합니다. 작은 인스턴스에서 사용할 수있는 최적의 알고리즘을 알고 싶습니다. – Jules

+0

알고리즘은 실제 인간의 작업 및 동작을 계획하는 것이 아닙니다. 그것은 작은 문제의 크기를 의미합니다. 이 알고리즘의 입력은 다른 코드에 의해 생성되며 큰 수 있습니다. 공유 하위 작업이 발생할 것을 확실히 알고 있습니다. – Jules

+0

@Jules : 그런 다음 최악의 데이터 집합을 생성하고 어떤 식 으로든 코딩하는 것으로 시작하여 앞으로부터 작업 할 것입니다. 나는 추상적 인 문제를 다루지 않는다는 것을 배웠다. –

0

각 가능한 실행 경로는 선택 사항 집합이 전적으로 종속성없는 작업으로 구성된 작업으로 끝나야한다고 생각합니다.

사실이라면 이러한 각 작업의 최소 시간을 쉽게 결정할 수 있습니다.

그런 다음 "해결 된"작업에만 의존하는 작업으로 돌아가서 총 시간을 계산하십시오.

처음 시작할 때까지 가능한 모든 경로를 거쳐 뒤로 작업하십시오.

실행 시간은 O (그래프의 노드 수) 여야하며 그래프를 생성하는 데 걸린 런타임과 동일해야합니다.

+1

문제점 설명은주기를 허용합니다. – Nabb

+0

예, 사이클이 허용되지 않는 경우에도 여전히 어떻게하는지는 알 수 없습니다. 다이아몬드 모양이 문제입니다. 몇 분만 줘. – Jules

+0

@Nabb 무한 루프에 들어 가지 않는 실행 경로에는 끝이 있어야한다고 생각합니다. – mbeckish

1

지나치게 까다롭게 될 위험이 오히려 PERT보다 고전 임계 경로 방법 (CPM) 문제가 나타납니다. PERT는 각 작업에 대해 최악, 최고 및 평균 완료 시간을 가정하고 Jules은 각 작업에 대해 한 번만 시간을 지정합니다. 즉, 선형 프로그래밍을 사용하여 중요한 경로를 찾고 각 활동에 대해 가장 빠른 시작 시간, 최신 완료 시간 등을 생성 할 수 있습니다. Here's은 접근법에 대한 유용한 한 페이지 설명입니다.

+0

CTM은 다릅니다. 목표는 * 일정 * (예 : 주문 선택)과 달리 이 문제는 취할 행동 (어떤 순서가 아닌)을 선택하는 것입니다. 둘째, CTM은 임계 경로를 최소화하려고 시도하지만, 작업자가 1 명의 작업자가 해결해야하는 경우 전체 시간을 최소화하고 싶습니다. – Jules

+0

CPM = CTM?CPM 링크 : "a) 중요한 경로는 네트워크를 통과하는 가장 긴 경로입니다. - 네트워크를 완료 할 수있는 최소 시간입니다." 전체 활동을 완료하는 데 필요한 총 시간을 최소화하려면 원하는 내용이 아닌가? "CPM 예약"은 실제로 CPM을 스케줄링에 사용하는 프로세스입니다. 스케줄링 부분은 CPM을 지속적으로 사용하여 스케줄을 모니터하고 수정하는 "프로세스"입니다. – Grembo

관련 문제