Ürün Koli yerleştirme

Excel formülleri ile ilgili paylaşım alanı
Cevapla
korkuta
Mesajlar: 1
Kayıt: Cum Eki 25, 2024 10:22 am
Lokasyon: İstanbul
Meslek: Muhasebe Yetkilisi
Adınız: ali
Soyadınız: korkut

Ürün Koli yerleştirme

Mesaj gönderen korkuta »

Merhaba,

Muhtelif miktar ve ölçülere sahip ürünlerimi 3 tip ölçüye sahip kolilere en uygun şekilde (gerekirse ürünler aynı pakette karmaşık olarakda konabilir, en az ve en uygun koliyi kullanarak paketlemek istiyorum. Bununla alakalı ekteki dosyada bir çalışmam var fakat tam olarak istediğim gibi olmadı. Ekteki dosyada Sayfa1' de veriler - Sonuç sayfasında kodu çalıştırdığımda çıkan sonuç var. Kodun hataları var. yardım rica ediyorum.
Bu mesaja eklenen dosyaları görüntülemek için gerekli izinlere sahip değilsiniz.
SNNAY
Mesajlar: 45
Kayıt: Prş Mar 21, 2024 11:31 am
Lokasyon: istanbul
Meslek: Oto Yedek Parça Satış Elemanı
Adınız: Sinan
Soyadınız: Aykaç

Re: Ürün Koli yerleştirme

Mesaj gönderen SNNAY »

İstediğiniz olayın net çözümü henüz bulunmamaktadır. 3d Bin Packing (kutulama problemi) olarak bilinen bu sorunu çözmek için değişik algoritmalar üretilmiş ve üretilmeye devam edilmekte kesin sonuç şudur diyebileceğimiz bir çözüm henüz bulunmamış. Ürün sayısı ve boyutları değişken olan Kutu boyutları değişkenlik gösteren kutulara yerleştirerek max ürün min kutu adeti bulmak excelde biraz zor, python kodları ile makul seviyede bir kabul edilecek sonuçları bulduk işinize yarar ise kullanabilirsiniz. Sonuçları excele aktarmaktadır.

Kod: Tümünü seç

import openpyxl
from tkinter import Tk
from tkinter.filedialog import askopenfilename

class Product:
    def __init__(self, name, width, length, height, quantity):
        self.name = name
        self.width = width
        self.length = length
        self.height = height
        self.quantity = quantity

class Box:
    def __init__(self, width, length, height):
        self.width = width
        self.length = length
        self.height = height
        self.products = []

    def add_product(self, product, count):
        self.products.append((product, count))

    def calculate_total_volume(self):
        total_volume = 0
        for product, count in self.products:
            total_volume += product.width * product.length * product.height * count
        return total_volume

    def calculate_box_volume(self):
        return self.width * self.length * self.height

    def calculate_box_count(self):
        total_volume = self.calculate_total_volume()
        box_volume = self.calculate_box_volume()
        if box_volume == 0:  # Kutu hacmi sıfırsa
            return 0
        return -(-total_volume // box_volume)  # Yukarı yuvarlama

    def calculate_products_in_box(self):
        product_details = []
        for product, count in self.products:
            product_details.append((product.name, count))
        return product_details

# Tkinter penceresini oluştur
Tk().withdraw()  # Ana pencereyi gizle
file_path = askopenfilename(title="Excel Dosyası Seçin", filetypes=[("Excel dosyası", "*.xlsx;*.xls")])

# Seçilen dosya yolunu kontrol et
if not file_path:
    print("Hiçbir dosya seçilmedi.")
else:
    # Excel dosyasını yükle
    wb = openpyxl.load_workbook(file_path)

    # Ürünleri oku
    product_sheet = wb["Ürünler"]
    products = []
    for row in product_sheet.iter_rows(min_row=2, values_only=True):
        name, width, length, height, quantity = row
        # Dönüştürme ve eksik veriler için varsayılan değer atama
        products.append(Product(name, float(width) if width is not None else 0,
                                float(length) if length is not None else 0,
                                float(height) if height is not None else 0,
                                quantity if quantity is not None else 0))

    # Kutuları oku
    box_sheet = wb["Kutular"]
    boxes = []
    for row in box_sheet.iter_rows(min_row=2, values_only=True):
        width, length, height = row
        # Dönüştürme ve eksik veriler için varsayılan değer atama
        boxes.append(Box(float(width) if width is not None else 0,
                         float(length) if length is not None else 0,
                         float(height) if height is not None else 0))

    # Sonuçları yazmak için yeni bir Excel dosyası oluştur
    result_wb = openpyxl.Workbook()
    ws = result_wb.active
    ws.title = "Kutu Bilgileri"

    # Başlık satırını yaz
    ws.append(["Kutu Boyutları", "Gerekli Kutu Sayısı", "Ürün Adı", "Adet"])

    # Ürünleri kutulara ekleyin ve kutu adedini hesaplayın
    for box in boxes:
        for product in products:
            # Ürün sığma kontrolü
            if (product.width <= box.width and 
                product.length <= box.length and 
                product.height <= box.height):
                # Ürünün maksimum sığacağı adedi hesapla
                max_fit = product.quantity  # Stokta mevcut ürün adedi
                box.add_product(product, max_fit)  # Kutunun içine ürünü ekle

        box_count = box.calculate_box_count()
        # Kutu bilgilerini ve ürünleri yaz
        for product_name, count in box.calculate_products_in_box():
            ws.append([f"{box.width} x {box.length} x {box.height}", box_count, product_name, count])

    # Excel dosyasını kaydet
    result_wb.save("kutu_bilgileri.xlsx")
    print("Sonuçlar 'kutu_bilgileri.xlsx' olarak kaydedildi.")
Bu mesaja eklenen dosyaları görüntülemek için gerekli izinlere sahip değilsiniz.
Cevapla