2017-09-17 133 views
0

我在流水線上有一組機器的路由順序。每條路線都必須經過整條生產線(也就是說,如果您只運行第一臺和第二臺機器,您仍然需要考慮從第二臺到最後一臺的距離)。最短流程佈局求解器

我有六個不同的機器(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