2017-09-17 13 views
0

조립 라인에 일련의 기계에 대한 라우팅 순서가 있습니다. 각 경로는 전체 회선을 거쳐야합니다 (즉, 첫 번째 및 두 번째 시스템 만 실행하는 경우 회선의 두 번째에서 끝까지의 거리를 고려해야합니다).최단 흐름 레이아웃 솔버

필자는 라인의 각 위치 사이에 고정 된 거리를 가진 6 개의 다른 기계 (가능한 720 대의 기계 조합)를 보유하고 있습니다. 첫 번째 기계와 두 번째 기계 사이의 거리는 100 '이고 두 번째와 세 번째 사이의 거리는 75'이고 세 번째와 네 번째는 75 '이고 네 번째와 다섯 번째는 25'이며 다섯 번째와 여섯 번째는 25 '입니다.

나는 줄을 따라 내려야하는 4 가지 제품이 있는데, 각각 고정 라우팅이 있습니다.

제 문제는 라인 설정의 가능한 모든 조합을 실행하고이 라인의 최적 설정을 결정할 수있는 vba 코드 또는 솔버를 어떻게 설정합니까? 모든 기계는 결과를 최적화하는 한 어느 위치 에나 배치 할 수 있습니다!

네 제품의 경로는 다음과 같습니다

A - B - C - D - F 
A - C - B - D – E - F 
A - F - E - D - C - B - A - F 
A - C - E - B - D – F 
+0

다음과 같은 소리가 적합합니다. https://en.wikipedia.org/wiki/Dijkstra%27s_algorithm –

+0

가장 간단한 방법은 가능한 모든 구성을 열거하고 (최고 720 개만 있음) 가장 좋은 것을 선택하는 것입니다. 공식적인 최적화 모델은 그렇게 쉽지는 않습니다. –

+0

숙제가 마치 – jsotola

답변

0

가능한 모든 조합을 통해 실행 - 당신이 정말로 그렇게해야하는 경우 - Heap's algorithm 같은 뭔가 작업이, 나는 일반 변경 방법을 선호하지만 :

Sub Evaluate(Lineup() As String) 
' dummy evaluation, just output the permutation 
Dim OffCell As Long 
For OffCell = LBound(Lineup, 1) To UBound(Lineup, 1) 
    ActiveCell.Offset(0, OffCell).Value = Lineup(OffCell) 
Next OffCell 
ActiveCell.Offset(1, 0).Activate 

End Sub 

Sub AllPerms(Lineup() As String) 
' Lineup is a 1-D array indexed at 1 

Dim LSize As Long 
Dim Shift() As Long 
Dim Tot As Long 
Dim Idx As Long 
Dim Level As Long 
Dim Change As Long 
Dim Offset As Long 
Dim TempStr As String 

LSize = UBound(Lineup) 
ReDim Shift(LSize) 

'count of permutations, set initial changes 
Tot = 1 
For Idx = 2 To LSize 
    Tot = Tot * Idx 
    Shift(Idx) = 1 - Idx 
Next Idx 
Shift(1) = 2 ' end condition 

' go through permutations 
For Idx = 1 To Tot 
    ' check this one 
    Call Evaluate(Lineup) 
    ' switch for the next 
    Level = LSize 
    Offset = 0 
    Change = Abs(Shift(Level)) 
    Do While Change = 0 Or Change = Level 
     If Change = 0 Then Shift(Level) = 1: Offset = Offset + 1 
     If Change = Level Then Shift(Level) = 1 - Level 
     Level = Level - 1 
     Change = Abs(Shift(Level)) 
    Loop 
    Shift(Level) = Shift(Level) + 1 
    Change = Change + Offset 
    TempStr = Lineup(Change) 
    Lineup(Change) = Lineup(Change + 1) 
    Lineup(Change + 1) = TempStr 
Next Idx 

End Sub 

Sub ABCDEF_case() 
Dim LU(6) As String 
LU(1) = "A" 
LU(2) = "B" 
LU(3) = "C" 
LU(4) = "D" 
LU(5) = "E" 
LU(6) = "F" 

Call AllPerms(LU) 
End Sub