Avatar billede Alexander97 Novice
06. juni 2022 - 19:26

Greedy Heuristic i VBA

Hej eksperter!
Jeg er ved at skrive en såkaldt "Greedy Heuristic" i VBA, men er desværre ikke ekspert i VBA.
Problemet består af, at jeg har 35 kunder, som jeg skal besøge. Essensen af heuristikken er, at jeg starter ved det første punkt, som er depotet/lageret. Herfra besøger jeg kontinuerligt den nærmeste kunde, indtil jeg har besøgt hver kunde præcis 1 gang.
Problem er at heuristikken laver en rute for de første 35 kunder, men undlader at besøge 3 af mine kunder. Jeg er overbevist om, at det har noget at køre med, hvordan jeg har defineret mine for loops og mine ranges, men jeg har ikke selv kunnet finde frem til fejlen.

Jeg er klar over at problemet er lidt kompliceret, når man ikke har dataet, men alt hjælp er påskønnet! :-)
På forhånd, tak for hjælpen.

Med venlig hilsen
Alexander

Min afstandsmatrix starter i celle C4. Jeg kan desværre ikke vedhæfte billeder, men jeg prøver ved at kopiere min VBA kode i stedet:

Public Sub MyNearestNeighbor()
    Dim n As Integer
    Dim dist As Double 'cummulated dist
    Dim A() As Double ' current best
    Dim i As Integer
    Dim j As Integer
    Dim used() As Integer
    Dim d As Double ' distance at current node
    Dim best As Integer 'best customer
    Dim rng As Range
  Workbooks("NearestNeighbour TSP.xlsm").Activate
ThisWorkbook.Worksheets("Rejseafstand i km").Range("C4").Activate
    n = ActiveCell.CurrentRegion.Rows.Count - 1
    ReDim A(n) 'set dimension of best(36)
    ReDim used(n) 'set dimension of used (36)
    dist = 0 'set cummulated dist to 0 to begin with
   
  'Prepare used - Start from 0
  For i = 4 To n - 1
  used(i) = 0
  Next
 
  A(0) = Cells(4, 3) 'starting point i.e., depot
  used(0) = 1
 
  For i = 4 To n - 1 'Include all except the depot
        ' Find nearest:
        d = 1000000.9 ' "a big-M inspired constraint"
For j = 1 To n - 1
  If used(j) = 0 And Cells(4 + A(i), j + 3) < d Then
 
    ' better found
                best = j
                d = Cells(4 + A(i), j + 3)
            End If
        Next
  ' best is now the nearest
        A(i) = best
        used(best) = 1
        dist = dist + d
      Next
     
     
     
     
     
'        ' Back to home
  A(n) = Cells(4, 3)
  dist = dist + Cells(4 + A(n - 1), 3 + A(n))
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester