Ejemplo n.º 1
0
  def __findArrangement(self, index, currentSize, bestRemainSize, bitmap, error=0):
    newSize=currentSize+self.fileList[index][1]     # aktuelle Dateigröße zufügen
    bitmap|=(2**index)                              # und in der Bitmap vermerken
    done=False
    self.cnt+=1

    if newSize<self.destSize:           # wenn es noch gepasst hat
      remainSize=self.destSize-newSize  # neue Restkapazität berechnen

      # wenn dabei neue beste Zusammenstellung gefunden wurde
      if remainSize>0 and remainSize<bestRemainSize:
        bestRemainSize=remainSize # ...merken

        if self.fileListCount>100:  # bei zu vielen Dateien dauert die Anzeige zu lange
          s1=self.__int2dual(bitmap, self.fileListCount)
          s2=s1.replace("-", " ")
          s3=s2.split()
          ls3=len(s3)
          if ls3>1: # erst dann mit der Ausgabe beginnen, wenn mindestens eine Datei ausgelassen wurde
            if ls3!=self.statusWordCount:  # und sich zur vorigen Ausgabe deutlich was geändert hat
              self.statusWordCount=ls3
              self.insertLine(s1+" "+hlp.prettySize(bestRemainSize))
        else:
          self.insertLine(self.__int2dual(bitmap, self.fileListCount)+" "+hlp.prettySize(bestRemainSize))

        # bei maximal "self.blockSize" Restkapazität...
        if bestRemainSize<=self.blockSize:
          # ist das gut genug -> Rekursion beenden
          return(bitmap, bestRemainSize, True, error)

      wx.Yield()

      # Optimierung1: wenn Restkapazität kleiner als die kleinste Datei...
      if remainSize<self.fileList[self.fileListCount-1][1]:
        # dann macht es hier keinen Sinn mehr, weiter zu testen
        return(bitmap, bestRemainSize, done, error)

      if (time.clock()-self.startTime)>self.timeout:  # Abbruch nach n Sekunden
        return(bitmap, bestRemainSize, True, 1)

      # wenn nicht bereits die letzte Datei erreicht wurde
      if index<self.fileListCount:
        bitmap2=bitmap    # Bitmap sichern

        # rekursiver Abstieg für alle möglichen kleineren Dateigrößen
        for i in range(1, self.fileListCount-index):
          # Optimierung2: wenn die Summe der Dateigrößen der noch zu testenden Dateien
          # nicht mehr reicht, um eine bessere "bestRemainSize" zu erreichen...
          if (self.destSize-(newSize+self.sumList[index+i]))>bestRemainSize:
            # ...brauchts auch nicht getestet werden
            break

          try:
            bm, br, done, error=self.__findArrangement(index+i, newSize, bestRemainSize, bitmap, error)
          except: # ggf. maximum recursion depth exceeded
            return(bitmap, bestRemainSize, True, 2)

          # wenn neue beste Zusammenstellung gefunden
          if br<bestRemainSize:
            bestRemainSize=br # Restkapazität merken
            bitmap2=bm        # und Bitmap nach der Schleife an Aufrufer übergeben

          # wenn Zusammenstellung mit maximal "self.blockSize" Restkapazität gefunden wurde
          if done==True:
            break # Schleife abbrechen und Rekursion beenden

        # möglicherweise gefundene bessere Bitmap einstellen oder sonst alte Bitmap wiederherstellen
        bitmap=bitmap2
    return(bitmap, bestRemainSize, done, error)