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.
Ürün Koli yerleştirme
-
- 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
Bu mesaja eklenen dosyaları görüntülemek için gerekli izinlere sahip değilsiniz.
-
- 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
İ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.