Avatar billede misseren Nybegynder
22. november 2005 - 21:41 Der er 6 kommentarer

problemer med simulering

Hej dette er mit problem.....

jeg prøver at øve mig i vba og derfor forsøgt at lave en simulering i excel vba, men synes ikke helt det spiller. Jeg har forsøgt at lave et transportbånd med chokolade. Chokoladen kommer ind en efter en og bliver derefter vejet hvorefter det skal hen i 1 ud af 3 skåle. Jeg har sat vægten til mellem 40 - 70 gram. Der skal være mindst 7 stykker cholade i skålen og de skal veje mindst 400 gram. Når det er opfyldt skiftes skålen ud.

det her er koden indtil videre som jeg har lavet, jeg ved ikke om jeg prøver at gøre det for indviklet eller der er en mere simpel måde....

Option Explicit
Option Base 1

Sub SimMasterFirstBestWorstOutputPaaArk()
  Dim MinVaegt As Integer 'Mindste vægt af en enhed
  Dim MaxVaegt As Integer 'Største vægt af en enhed
  Dim Q As Integer
  Dim AntalEnhederIalt As Integer
  Dim MaxBins As Integer
  Dim EnhedNr As Integer
  Dim BinIdx As Integer
  Dim BinNr As Integer
  Dim LukBinNr As Integer
  Dim Vaegt As Integer
  Dim AntalLukkedeBins As Integer
  Dim AntalBenyttedeBins As Integer
  Dim RestKap() As Integer
 
  Dim W As Worksheet
  Dim FoersteRaekke As Integer
  Dim RNr As Integer
 
  Set W = Worksheets.Add(after:=Worksheets(Worksheets.Count))
   
  W.Range("A3") = "Inddata:"
  W.Range("A5") = "Min. vægt:"
  W.Range("A6") = "Max. vægt:"
  W.Range("A7") = "Kapacitet:"
  W.Range("A8") = "Antal enheder ialt:"
  W.Range("A9") = "Max. åbne bins:"
 
  W.Range("A11") = "Uddata:"
  W.Range("A13") = "Antal benyttede bins:"
 
  W.Range("A3:A13").Font.Bold = True
 
  W.Columns("A:A").AutoFit
 
  W.Range("A1") = "Output fra simulationsmodel for Online Bin Packing"
  W.Range("A1").Font.Bold = True
 
  MinVaegt = 40
  MaxVaegt = 70
  Q = 400
  AntalEnhederIalt = 50 'vil sende 50 stykker chokolade igennem
  MaxBins = 3
 
  W.Range("B5") = MinVaegt
  W.Range("B6") = MaxVaegt
  W.Range("B7") = Q
  W.Range("B8") = AntalEnhederIalt
  W.Range("B9") = MaxBins
 
  W.Range("C15") = "Enhed nr."
  W.Range("D15") = "Vægt"


her stopper det og jeg ved ikke hvordan jeg helt skal komme videre med selve udregningen
Avatar billede bak Forsker
23. november 2005 - 19:26 #1
Hvad vil du gerne vide ?
Hvad skal resultatet være?
Avatar billede bak Forsker
23. november 2005 - 20:09 #2
Da jeg ikke helt er klar over hvad du ønsker at opnå, er det ikke sikkert at svaret er det du ønsker.

Option Base 1

Sub SimMasterFirstBestWorstOutputPaaArk()
  Dim MinVaegt As Integer                              'Mindste vægt af en enhed
  Dim MaxVaegt As Integer                              'Største vægt af en enhed
  Dim Q As Integer
  Dim AntalEnhederIalt As Integer
  Dim MaxBins As Integer
  Dim EnhedNr As Integer
  Dim BinIdx As Integer
  Dim BinNr As Integer
  Dim LukBinNr As Integer
  Dim Vaegt As Integer
  Dim AntalLukkedeBins As Integer
  Dim AntalBenyttedeBins As Integer
  Dim RestKap() As Integer
  Dim x As Long, lBin As Long, dSum As Double, lantal As Long
  Dim W As Worksheet
  Dim FoersteRaekke As Integer
  Dim RNr As Integer
  Dim MinPrBin As Long
  Dim Arr()

  Set W = Worksheets.Add(after:=Worksheets(Worksheets.Count))

  W.Range("A3") = "Inddata:"
  W.Range("A5") = "Min. vægt:"
  W.Range("A6") = "Max. vægt:"
  W.Range("A7") = "Kapacitet:"
  W.Range("A8") = "Antal enheder ialt:"
  W.Range("A9") = "Max. åbne bins:"

  W.Range("A11") = "Uddata:"
  W.Range("A13") = "Antal benyttede bins:"

  W.Range("A3:A13").Font.Bold = True

  W.Columns("A:A").AutoFit

  W.Range("A1") = "Output fra simulationsmodel for Online Bin Packing"
  W.Range("A1").Font.Bold = True

  MinVaegt = 40
  MaxVaegt = 70
  Q = 400
  AntalEnhederIalt = 50                              'vil sende 50 stykker chokolade igennem
  MaxBins = 3
  MinPrBin = 7
 
  W.Range("B5") = MinVaegt
  W.Range("B6") = MaxVaegt
  W.Range("B7") = Q
  W.Range("B8") = AntalEnhederIalt
  W.Range("B9") = MaxBins

  W.Range("C15") = "Enhed nr."
  W.Range("D15") = "Vægt"
  W.Range("E15") = "Bin nr."
  W.Range("F15") = "Akk. Sum"
 
  ReDim Arr(50, 4)

  FillArray AntalEnhederIalt, Arr, MinVaegt, MaxVaegt

  lBin = 1
  For x = 1 To AntalEnhederIalt
      If dSum + Arr(x, 2) < Q And lantal <= MinPrBin Then
        dSum = dSum + Arr(x, 2)
        Arr(x, 4) = dSum
        lantal = lantal + 1
        Arr(x, 3) = lBin
      Else
        Arr(x, 3) = lBin
        Arr(x, 4) = dSum + Arr(x, 2)
        dSum = 0
        lantal = 0
        lBin = lBin + 1
      End If
  Next
  W.Range("C16:F" & x + 14) = Arr
  W.Range("B13") = lBin
End Sub

Sub FillArray(Enheder, myarray, mini, maxi)
  Dim x As Long
  maxi = maxi + 1
  For x = 1 To Enheder
      myarray(x, 1) = x
      myarray(x, 2) = Int(Rnd() * (maxi - mini) + mini)
  Next
End Sub
Avatar billede misseren Nybegynder
24. november 2005 - 19:01 #3
hej jeg vil gerne give dig de 100 point for din ihærdighed, men jeg fandt faktisk en løsning i mellemtiden....

som et lile bonus spørgsmål, så vil jeg høre om du ved hvad man skal have med og hvad man eventuelt kunne skrive, hvis man skal lave et regelsæt til ovenstående problemstilling.
Avatar billede bak Forsker
25. november 2005 - 19:37 #4
kan jeg ikke lige se din løsning?
Avatar billede misseren Nybegynder
25. november 2005 - 21:54 #5
dette er mine beslutningsregler som er en public function modul

For binidx = 1 To antalbins
      If RestKap(binidx) < 500 Or antalstyk(binidx) < 7 Then
      'Der er plads i denne bin
      If bedstebin = 0 Or RestKap(binidx) < MinRestKap Then
        bedstebin = binidx
       
        MinRestKap = RestKap(binidx)
      End If
    End If
 
  Next binidx

  VaelgBinBestFit = bedstebin
 

og i et andet modul har jeg dette...

Sub SimMasterFirstBestWorstOutputPaaArk()
  Dim MinVaegt As Integer 'Mindste vægt af en enhed
  Dim MaxVaegt As Integer 'Største vægt af en enhed
  Dim Q As Integer 'Kapacitet af hver bin
  Dim AntalEnhederIalt As Integer 'Antal ankommende enheder ialt i simulationen
  Dim MaxBins As Integer 'Max. antal bins, som kan være åbne samtidigt
  Dim EnhedNr As Integer
  Dim binidx As Integer 'Bruges som tæller til at gennemløbe RestKap-tabel.
  Dim binnr As Integer
  Dim lukbinnr As Integer
  Dim vaegt As Integer
  Dim AntalLukkedeBins As Integer
  Dim AntalBenyttedeBins As Integer
  Dim RestKap() As Integer
  Dim startstyk As Integer
  Dim antalstyk() As Integer
  Dim stykiskaal As Integer
  Dim sum As Integer
 
 
  Dim W As Worksheet
  Dim FoersteRaekke As Integer
  Dim RNr As Integer
 
  Set W = Worksheets.Add(after:=Worksheets(Worksheets.Count))
  'Tilføjelse af et worksheet, som placeres til sidst i samlingen af worksheets.
  'Objektvariablen W refererer herefter til dette ark.
  'Dette ark er nu det aktive ark.
 
  W.Range("A3") = "Inddata:"
  W.Range("A5") = "Min. vægt:"
  W.Range("A6") = "Max. vægt:"
  W.Range("A7") = "Kapacitet:"
  W.Range("A8") = "Antal enheder ialt:"
  W.Range("A9") = "Max. åbne bins:"
  W.Range("A10") = "startstyk i bin:"
 
  W.Range("A11") = "Uddata:"
  W.Range("A13") = "Antal benyttede bins:"
 
  W.Range("A3:A13").Font.Bold = True
 
  W.Columns("A:A").AutoFit
 
  W.Range("A1") = "Output fra simulationsmodel for Online Bin Packing"
  W.Range("A1").Font.Bold = True
 
  MinVaegt = Range("MinVaegt")
  MaxVaegt = Range("MaxVaegt")
  Q = 0
  AntalEnhederIalt = Range("EnhederIalt")
  MaxBins = Range("MaxAabneBins")
 
 
  W.Range("B5") = MinVaegt
  W.Range("B6") = MaxVaegt
  W.Range("B7") = Q
  W.Range("B8") = AntalEnhederIalt
  W.Range("B9") = MaxBins
  W.Range("b10") = startstyk
 
  W.Range("C15") = "Enhed nr."
  W.Range("D15") = "Vægt"
 
  W.Range("E14") = "Restkapaciteter"
 
  W.Range(Cells(14, 5), Cells(14, 4 + MaxBins)).Merge
  W.Range(Cells(14, 5), Cells(14, 4 + MaxBins)).HorizontalAlignment = xlCenter
  'Ovenstående to linier kræver, at W er det aktiverede ark, hvilket ikke
  'nødvendigvis er tilfældet, hvis f.eks. W sættes til at referere til et
  'eksisterende ark. W kan aktiveres med kommandoen W.Activate.
 
  For binnr = 1 To MaxBins
    W.Cells(15, binnr + 4) = "Bin " & binnr
  Next
 
  W.Rows("15:15").HorizontalAlignment = xlRight
  W.Rows("14:15").Font.Bold = True
 
  W.Columns("C:C").AutoFit
 
  ReDim RestKap(MaxBins)
  ReDim antalstyk(MaxBins)
 
   
  For binidx = 1 To MaxBins
    RestKap(binidx) = Q
    antalstyk(binidx) = startstyk
  Next binidx
 
  AntalLukkedeBins = 0
 
  Call StartGenerator
 
  FoersteRaekke = 16
 
 
  For EnhedNr = 1 To AntalEnhederIalt
    RNr = FoersteRaekke + EnhedNr - 1 'Output for denne enhed skrives i række RNr
       
       
    vaegt = RektTilfHeltal(MinVaegt, MaxVaegt)
     
    binnr = VaelgBinBestFit(vaegt, MaxBins, RestKap, antalstyk)
    'Funktionen, som returnerer bin nr., er specific for hver enkelt beslutningsregel
   
  ' stykiskaal = samledeantalstyk(MaxBins, startstyk, antalstyk)
   
     
    W.Cells(RNr, 3) = EnhedNr
    W.Cells(RNr, 4) = vaegt
   
   
    If binnr = 0 Then 'Der er ikke plads i nogen af de åbne bins ... Or
     
      ReDim RestKap(binidx)
      ReDim antalstyk(binidx)
     
      lukbinnr = FindBinMedMinRestKap(MaxBins, RestKap)
      AntalLukkedeBins = AntalLukkedeBins + 1
      antalstyk(lukbinnr) = startstyk + 1
      RestKap(lukbinnr) = Q + vaegt 'Den lukkede bin erstattes af en tom bin, som enheden fyldes i
      W.Cells(RNr, lukbinnr + 4) = RestKap(lukbinnr)
      W.Cells(RNr, lukbinnr + 4).Interior.Color = RGB(0, 255, 0)
    Else
      'Placer denne enhed i bin nr. BinNr
      If RestKap(binnr) = Q Then
      'AntalLukkedeBins = AntalLukkedeBins + 1
      'W.Range("L13") = AntalLukkedeBins
      W.Cells(RNr, binnr + 4).Interior.Color = RGB(0, 255, 0)
        'Denne bin er tom før den aktuelle enhed fyldes i
        'Dette sker kun (højst) én gang pr. kolonne
      End If
      antalstyk(binnr) = antalstyk(binnr) + 1
      RestKap(binnr) = RestKap(binnr) + vaegt
     
     
     
      W.Cells(RNr, binnr + 4) = RestKap(binnr)

      W.Cells(RNr, binnr + 7) = antalstyk(binnr)
   
   
     
    End If
   
    Next EnhedNr
     

  'De bins, som er åbne og endnu ikke lukkede, tælles med i antal benyttede bins:
  AntalBenyttedeBins = AntalLukkedeBins
 
  For binidx = 1 To MaxBins
    If RestKap(binidx) < 500 Then 'Denne bin er ikke tom
      AntalBenyttedeBins = AntalBenyttedeBins + 1
    End If
  Next
 
  W.Range("B13") = AntalBenyttedeBins
 
 

End Sub
Avatar billede misseren Nybegynder
25. november 2005 - 21:55 #6
jeg vil høre om du ved hvordan man summere tallene i en bestemt række.....f.eks hvis jeg gerne vil summere alle tallene i række B i mit excel ark, hvor skriver jeg så det i kode??
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
Kategori
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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