Alüminyum boy profil fire ve optimize yaptırmak

alüminyum profilin boyu 600 cm, bizim de keseceğimiz 600cm kadar, çeşitli uzunluklarda olan parça listesi var, bu parça listesi dışardan alınan bir liste. parçaları kesince 5mm kadar bıçak payı oluyor, bu bıçak payını da düşmek gerek ve elimizdeki parça listesini büyük sayıdan başlayarak ve/veya 600 santim boy profile sığdırarak ve de bıçak payını da düşerek azaltması lazım, birinci 600 cmlik boydan alındıktan sonra ikinci 600 cmlik boy profile geçmeli. böylece elimizdeki parça listesindeki uzunlukların hepsi kesilmiş olmalı. bunu yapan kodu yazabilir miyiz? teşekkür ederim.

6m uzunluğundaki profilleri, elinizdeki listede belirtilen uzunluklarda kesmek (keserken 5 mm bıçak payını da hesaba katmak) ve en az fire/zayiat vermek istiyorsunuz.
Buna uygun kod yazılmasını, bu sayede profillerin sırayla hangi uzunlukta kesilmesi gerektiğini belirlemek istiyorsunuz.
Doğru mu anladım?

Aynen doğrudur. Yardımlarınız için şimdiden teşekkürler.

Aşağıdaki şekilde kod yazdım, elbette bundan çok çok iyi , doğru ve hızlı kodlar yazılabilir.
Kısa sürede bu kadar yazabildim.

Kodun çalışabilmesi için öncelikle itertools kütüphanesini yüklemeniz gerekli.

Kesilecek olan parça uzunlukları, parcalar isimli listede bulunuyor.
musade_edilen_fire değişkeni, profilin kesilmesinde müsade edilecek en fazla değeri cm. cinsinden belirtiğimiz kısımdır. Yani örnek olarak 10cm fireye kadar müsade ediyorsanız, 10 yazmalısınız. Hesaplama sonucunda bir çok seçenek sunulacaktır. 10 cm ve alt tüm seçenekler listelenecektir. Öncelikle 1 cm denenerek sonuç alınıyor mu bakılabilir. Sonuç alınmıyorsa bu değer azar azar artırılıp kod yeniden çalıştırılabilir. Gerçi bu işlem de otomatiğe bağlanabilir. Vakit ayırıp bu kısmı siz de düzenleyebilirsiniz.

Kod çalıştırıldığında, kod dosyasının bulunduğu dizinde (klasörde) parca secenekleri.txt isimli dosya oluşacak ve tüm seçenekler bu dosyaya kaydedilecektir.
Kod her çalıştırıldığında öncelikle bu dosya içeriği silinip temizlenecektir.

parcalar = [110, 25, 50, 65, 80, 75, 110, 35, 40, 290, 250, 315, 300,120,330] # cm. Kesilecek parça uzunlukları

bicak = 0.5 # cm.
profil_uzunlugu = 600 # cm
musade_edilen_fire = 10 # cm

import itertools
with open("parca secenekleri.txt", "w", encoding="utf-8") as dosya:

    for kacli in range(2, len(parcalar)):
        print("*****", kacli, " PARÇALI SEÇENEKLER *****")
        for liste in itertools.permutations(parcalar, kacli):
            toplam = sum(liste) + (len(liste) * bicak)
            if ((toplam > (profil_uzunlugu - musade_edilen_fire)) and (toplam < profil_uzunlugu)):
                with open("parca secenekleri.txt", "a", encoding="utf-8") as dosya:
                    dosya.write("(" + str(len(liste)) + ") Parça Boyları: " + str(liste) + " Parça Toplamları: " + str(toplam) + ", Fire Miktarı: " + str(profil_uzunlugu - toplam) + " cm. \n")
    print("İşlem Tamamlandı!")

Örnek Çıktı:

(2) Parça Boyları: (290, 300) Parça Toplamları: 591.0, Fire Miktarı: 9.0 cm. 
(2) Parça Boyları: (300, 290) Parça Toplamları: 591.0, Fire Miktarı: 9.0 cm. 
...
(3) Parça Boyları: (25, 250, 315) Parça Toplamları: 591.5, Fire Miktarı: 8.5 cm. 
(3) Parça Boyları: (25, 315, 250) Parça Toplamları: 591.5, Fire Miktarı: 8.5 cm. 
...
(4) Parça Boyları: (110, 50, 315, 120) Parça Toplamları: 597.0, Fire Miktarı: 3.0 cm. 
(4) Parça Boyları: (110, 50, 120, 315) Parça Toplamları: 597.0, Fire Miktarı: 3.0 cm. 
(4) Parça Boyları: (110, 110, 120, 250) Parça Toplamları: 592.0, Fire Miktarı: 8.0 cm. 
(4) Parça Boyları: (110, 110, 330, 40) Parça Toplamları: 592.0, Fire Miktarı: 8.0 cm. 
...
(5) Parça Boyları: (75, 110, 40, 65, 300) Parça Toplamları: 592.5, Fire Miktarı: 7.5 cm. 
(5) Parça Boyları: (75, 110, 40, 35, 330) Parça Toplamları: 592.5, Fire Miktarı: 7.5 cm. 
(5) Parça Boyları: (75, 110, 40, 290, 80) Parça Toplamları: 597.5, Fire Miktarı: 2.5 cm. 
(5) Parça Boyları: (75, 110, 40, 250, 120) Parça Toplamları: 597.5, Fire Miktarı: 2.5 cm. 
.....
(6) Parça Boyları: (25, 250, 110, 75, 50, 80) Parça Toplamları: 593.0, Fire Miktarı: 7.0 cm. 
(6) Parça Boyları: (25, 250, 110, 75, 80, 50) Parça Toplamları: 593.0, Fire Miktarı: 7.0 cm. 
(6) Parça Boyları: (25, 250, 110, 110, 65, 35) Parça Toplamları: 598.0, Fire Miktarı: 2.0 cm. 
(6) Parça Boyları: (25, 250, 110, 110, 35, 65) Parça Toplamları: 598.0, Fire Miktarı: 2.0 cm.
...
(7) Parça Boyları: (50, 65, 75, 40, 25, 35, 300) Parça Toplamları: 593.5, Fire Miktarı: 6.5 cm. 
(7) Parça Boyları: (50, 65, 75, 40, 25, 300, 35) Parça Toplamları: 593.5, Fire Miktarı: 6.5 cm. 
(7) Parça Boyları: (50, 65, 75, 40, 80, 35, 250) Parça Toplamları: 598.5, Fire Miktarı: 1.5 cm. 
(7) Parça Boyları: (50, 65, 75, 40, 80, 250, 35) Parça Toplamları: 598.5, Fire Miktarı: 1.5 cm. 
...
(8) Parça Boyları: (110, 25, 110, 35, 120, 75, 50, 65) Parça Toplamları: 594.0, Fire Miktarı: 6.0 cm. 
(8) Parça Boyları: (110, 25, 110, 35, 120, 75, 65, 50) Parça Toplamları: 594.0, Fire Miktarı: 6.0 cm. 
(8) Parça Boyları: (110, 25, 110, 35, 120, 75, 80, 40) Parça Toplamları: 599.0, Fire Miktarı: 1.0 cm. 
(8) Parça Boyları: (110, 25, 110, 35, 120, 75, 40, 80) Parça Toplamları: 599.0, Fire Miktarı: 1.0 cm.
...
(9) Parça Boyları: (110, 25, 65, 110, 35, 50, 80, 40, 75) Parça Toplamları: 594.5, Fire Miktarı: 5.5 cm. 
(9) Parça Boyları: (110, 25, 65, 110, 35, 50, 75, 80, 40) Parça Toplamları: 594.5, Fire Miktarı: 5.5 cm.
...
1 Beğeni

m.halil emeğiniz için teşekkür ederim. 8 PARÇALI SEÇENEK kısmında 169bin küsür satır yazdı ve hala da yazmaya devam ediyor, ben durdurdum artık.
Toplamda kesilecek 15 parça var, bu kadar çok satır vermesi normal değil sanırım.
sizde de aynı mı oldu, yoksa ben mi bir yerde hata yapıyorum.

benim anladığım kadarıyla kesilecek bütün parçaları 600cmlik boy profile yerleştirmenin 169binden fazla varyasyonunu alıp en sonunda 5-10 boy profile yazıp onun mu sonucunu yazacak acaba?

kesilecek parçalar 600cmlik boy profile yerleştirildikten sonra, kesim listesinden çıkarılıp, aynı parçanın tekrar bir sonraki 600cmlik boy profile dahil edilmemesi lazım…

kolay gelsin.

Merhaba,
Rica ederim.
Sözledikleriniz kesinlikle doğru.
itertools kütüphanesi sayesinde, belirttiğimiz parça listesindeki ölçülerin perputasyon varyasyonları sürekli ekrana basıyor ve dosyaya yazdırıyor.
Asıl yapılması gereken, sizin de ifade ettiğiniz gibi, seçilen parçalar hesapladıktan sonra, mevcut listeden çıkarılmalı, kalan parça listesinden yeni seçimler yapılmalı.
Hatta Müsade edilen fire miktarı bile sıfırdan başlayarak otomatik olarak artırılmalı. uygun sonuç alınamadığı zaman artım sağlanmalı.
Mesai sonrası, evde vakit bulursam yukarıda anlatılanlara uygun çok daha düzgün ve daha az çıktı veren kod yazmaya çalışacağım.

m.halil bey merhaba,
5 saattir varyasyon yapıyor, henüz sonuç vermedi.
kod üzerinde çalışırken bununla da ilgili bilginiz olsun diye yazıyorum.
teşekkür ederim.
kolay gelsin.

Kesilecek parçaların ölçülerine dair örnek liste yazabilir ya da gönderebilir misiniz?

sizin yazdıklarınız da olabilir, bu alüminyum doğrama pencere kanat genişliği ölçüsünde gibi birşey…

@m.halil e benzer bir mantıkla böyle bir şey yazdım ama sırayla min fireye göre baktığı ve işin bütününden bakmadığı için çok doğru bir yaklaşım olmadı sanırım.

import itertools
parcalar=[110, 25, 50, 65, 80, 75, 110, 35, 40, 290, 250, 315, 300,120,330]
sonuc=[]
b_payi=0.5
def m_fire():
    son_l=[]
    en_yakin=0
    for i in range(len(parcalar)):
        k_list=(list((itertools.combinations(parcalar,i+1))))
        for top in k_list:
            if sum(top) <= 600 - b_payi*(len(top)) and sum(top) > en_yakin:
                en_yakin=sum(top)
                son_l=top
                
    return(son_l)
while len(parcalar) != 0:
    son_l=m_fire()
    sonuc.append(son_l)
    for i in range(len(son_l)):
        parcalar.remove(son_l[i])
    
for i in range(len(sonuc)):
    fire=600-(sum(sonuc[i])+b_payi*(len(sonuc[i])))
    print(f"{i+1}.parça : {sonuc[i]} | Fire :{fire}")

ÇIKTI:

1.parça : (110, 50, 315, 120) | Fire :3.0
2.parça : (80, 75, 110, 330) | Fire :3.0
3.parça : (290, 300) | Fire :9.0
4.parça : (25, 65, 35, 40, 250) | Fire :182.5

Son parçadaki fire hayli yüksek oluyo bunu diğer parçalara dağıtmak mümkün ama burda sadece matematik yok sonuçta siz iş yapıyosunuz o 182.5 cm yi çöpe atmıycaksınızdır.

1 Beğeni

Sayın Muhammet_Kulaber,
doğru söylüyorsunuz, kalan büyük fire çöp değildir, başka işlerde kullanılabilir, ancak bu parçaların herbirinden 100er veya 1000er adet olsa yüz veya bin tane 182.5 cm kalacak. biz bir boya sığdırıp en az fire ile iş yapmaya çalışıyoruz.
piyasada boru, profil, demir gibi tek boyutlu optimize yapan birçok yerli veya yabancı program var ancak ben doğrama en ve boy ölçüleriyle kasa, kanat, etek profili hesaplayan bir program yapmak istiyorum, diğer kısımları bitti, bu optimizeyi yapamadım.
sizin verdiğiniz bu parça ölçülerini diğer programlara yazıp optimize ediyorum, daha az fireyle sonuç alıyorum.
daha da geliştirmek lazım… ama nasıl?
işte burada yardımlarınızı bekliyorum.
teşekkür ederim.
kolay gelsin.

Kaç adet parça girileceğini girerseniz böyle bir sonuç almazsınız.
Örnek veriyorum 10000 adet parça olsaydı sadece sondaki bir profilde fire yüksek olma ihtimali doğucaktı.
Kesilicek parça boyları kaç farklı adette biliyormusunuz yoksa sürekli değişiyor mu ?

sürekli değişiyor…
örnek olarak (adetleri sallıyorum)
110 dan 10 tane,
25 den 5 tane,
50 den 7 tane,
65den 13 tane,
80dan 20 tane,
75den 13 tane,
35den 18 tane,
40dan 23 tane,
290dan 9 tane,
250den 50 tane,
315ten 35 tane,
300den 45 tane,
120den 38 tane,
330 dan 103 tane
olabilir…
en son parçada böyle fire kalıp da hepsinde kalmayacaksa sorun yok o zaman…

Evet kalmaz ama şöyle bir sorunumuz var 10000 parça verisi girdiğimizde bir süper bilgisayara ihtiyacımız olucak böyle bir veriyi hesaplamak çok uzun sürer.

1 Beğeni

mesela bu ölçü ve adetlere göre bendeki optimize programında 165 boy profil kullanılıyor. “”“tam bunu yazarken şu aklıma geldi, ölçüleri ve adetleri aynı anda girebilmeliyiz. yani ölçüyü ve karşısına adeti elle girebilmeliyiz.”“” bunu belirtmeyi unuttum, özür dilerim.

Ben de kaç saattir kafa yoruyorum, şu sonuç çıktı;
@Muhammet_Kulaber beyin kodu daha iyi sonuç vermiş.
Tebrik ediyorum.
Kodu yarın inceleyeceğim :slight_smile:

import itertools

parca_uzunluklari = [110, 25, 50, 65, 80, 75, 110, 35, 40, 290, 250, 315, 300,120,330] # cm. Kesilecek parça uzunlukları

bicak_payi = 0.5 # cm.
profil_uzunlugu = 600 # cm
musade_edilen_fire = 0 # cm
kalanlar = list()

print(len(parca_uzunluklari), " adet parçanın toplam uzunluğu:", sum(parca_uzunluklari))

def hesapla():
    while True:
        for kacli in range(2, len(parca_uzunluklari)):
            for parcalar in itertools.combinations(parca_uzunluklari, kacli):
                toplam = sum(parcalar) + (len(parcalar) * bicak_payi)
                if ((toplam > (profil_uzunlugu - musade_edilen_fire)) and (toplam < profil_uzunlugu)):
                    print("\n", "*" * 10, musade_edilen_fire, "cm Fire hesabına göre çıkan sonuç:", "*" * 10)
                    print("Koşula uyan parçalar:", parcalar, "| Parçaların Toplam Uzunluğu:", sum(parcalar), "cm. | Fire Miktarı:", profil_uzunlugu - sum(parcalar), "cm.")
                    for oge in parcalar:
                        parca_uzunluklari.remove(oge)
                        # print("Silinen Parçalar:", oge)
                    # print("Öğe Silme İşlemi Sonlandı!!!")
                    break
        break
        

while True:
    hesapla()
    if sum(parca_uzunluklari) > profil_uzunlugu:
        for fire in range(musade_edilen_fire+1, 100):     # Son kalan parça listesinde fire miktarinı 50cm'e kadar kademeli olarak yükselt.
            hesapla()
            musade_edilen_fire += 1
    break

print("\n", "*" * 10, "\nkalan parçalar:", parca_uzunluklari, "Parçaların Uzunlukları Toplamı:", sum(parca_uzunluklari))

Çıktı:

15  adet parçanın toplam uzunluğu: 2195

 ********** 2 cm Fire hesabına göre çıkan sonuç: **********
Koşula uyan parçalar: (110, 65, 80, 75, 110, 35, 120) | Parçaların Toplam Uzunluğu: 595 cm. | Fire Miktarı: 5 cm.

 ********** 9 cm Fire hesabına göre çıkan sonuç: **********
Koşula uyan parçalar: (25, 250, 315) | Parçaların Toplam Uzunluğu: 590 cm. | Fire Miktarı: 10 cm.

 ********** 10 cm Fire hesabına göre çıkan sonuç: **********
Koşula uyan parçalar: (290, 300) | Parçaların Toplam Uzunluğu: 590 cm. | Fire Miktarı: 10 cm.

**********
kalan parçalar: [50, 40, 330] Parçaların Uzunlukları Toplamı: 420
1 Beğeni

Merhaba;

Uzun süredir bir kaç yakınımın trafik kazası sonucu onlarla ilgilenmek zorunda olduğumdan foruma giremiyordum.

Daha doğrusu girebiliyor ama cevap yazmaya vakit ayıramıyordum.Şansızlığınıza/ şansınıza sizin sorunuza denk geldim.

Öncelikle sorunuz gayet güzel ve mantıklı.

Öneren katılımcıların çözümleri de her zaman ellerinden gelen yadımı esirgemeyen forumda rastladığım katılımcılar.

Yalnız biraz zorlanmaya başlamış konu ufak bir katkı sunmak isterim.

Üzgünüm ve söz veremiyorum ki her zaman foruma vakit ayırıp tam istediğiniz kodu buraya yapıştırabileyim.

Ama size ve yardım edecek katılımcılara ufak bir nefes aldıracak konulara değinmeye çalışayım kısaca.

Daha doğrusu size bir kaç anahtar kelime ve link vereyim, siz üzerinde çalışıp çözümünüzü kolay oluşturabilesiniz.

Öncelikle şunu bilmenizi isterim;

Bir sorunun tüm ihtimallerinin denenip en doğrsunun bulunmasına dayanan algolirtmalara doğrusal algoritmalar diyebiliriz. Bunun avandaşı, tüm ihtimalleri dener ve kesin en doğru olan sonucu verir. Bunun bedeli süredir.

Diğer bir yöntem ise, yapay zekada da faydalanılan belirli bir kesinlik vey belirli bir derinliğe kadar olanları deneyip arasından en iyiye en yakın olanı seçen algoritmalardır.

Yani sorunuzda belirttiğiniz üzere, 5 saattir hala bekliyorum diyorsanız, kod büyün olası varyasyonları deniyor demektir.

Peki kullandığım örnek programlar hızla nasıl yapıyor diyorsanız,onlar da ikinci söyediğim gibi, tüm olasılıkları denemek yerine belirli bir hata payı ile iterasyonları belirli bir derinliğe kadar sürdürüp bırakıyor.

Eğer tüm olasılıklar üzerinde denemeye devam ederseniz, sayı listeleriniz/kesilecek parça boylarınız da artarsa saatlerce algoritma çalışabilir.

Bunun yerine, size ve size yardımcı olacak katılımcılara ufak bir önerim olacak.

Amerikayı yeniden keşfetmeyelim;

Probleminizi belirlemeden çözümü bulamayız.

Sorununuz dünyada daha önce bir çok kişinin karşısına çıkan ve doğal olarak bir kaç farklı çözüm yaklaşımı olan bir soru.

Cutting stock problem - Wikipedia

Lec-4 One Dimensional Cutting Stock Problem - YouTube

58 dakika dinlemeye ve anlamaya sabrınız varsa bu videodan sorunun ve çözümün mantığını dinleyebilirsiniz.

Yada optimizasyon konularına bakmak ve pyton konusunda biraz da göz alışkanlığı olması konusunda

Create an iterative algorithm cutting stock problem (fico.com)

Linkindeki konuya bakabilirsiniz.

Bunlar sadece ipucu, tam istediğiniz kodu buraya yazıp yapıştıracak vaktim olmadığından özür dilerim.

Size ve katılımcı arkadaşlara, tüm ihtimalleri denemek yerine, hangi algoritma ile optimize bir çözüm oluşturulabileceği ile ilgili ip uçları bırakmaktan fazla yardımcı olamayacağım için şimdiden özür dilerim.

Umarım ip uçları sizin yada çözüme yardımcı olacak arkadaşlara faydalı olur da hızlı bir optimizasyon kodu geliştirebilirsiniz.

Kolay gelsin.

3 Beğeni

m. halil teşekkür ederim.
dediğiniz gibi @Muhammet_Kulaber beyin kodu daha iyi sonuç vermiş. yanlız ondada kesilecek parça sayısını artırınca optimize etmesi uzun sürüyor. daha önce de değindiğim gibi hazır bazı yerli ve yabancı programlarda optimize 100 bin parça 1 saniyede bitiyorken, yukardaki 15 parça dahil ve bu parçaları 50 falan yapınca bu kodlarla saatler sürüyor.

Parçala böl bitir şeklinde yaparsak süre konusunda rahatlıyabiliriz.Aklıma bir kod şeması geldi yazmayı deniycem eğer başarılı çalışırsa paylaşırım.Daha bütük verilerle denemeler yapıcam.

Muhammet_Kulaber bey, şimdiden elinize sağlık, yapabilirsek ne ala, yapamazsak bile, “hayra vesile olan o hayrı yapan gibidir” düsturu ile birilerinin ufkunu açabilirsek o da bizi mutlu eder.
Alman LOGİKAL (Orgadata - LogiKal) programı binlerce Euro, doğramayı çiziyoruz, kasa, kanat, orta kayıt, cam çıtası, fitil, conta, adaptör, köşe takozu, vida, pul vs, vs hesaplıyor, autocad çizimi veriyor.
Bir yerli LOGİKAL neden ortaya koyamayalım. visual basicde diğer kısımlarını hesaplatabiliyorum ancak, bu optimize kısmını VB’de de yapamadım, python da belki yapılabilir diye umut ediyorum. yapabilirsek ne ala…
Piyasadaki doğrama çizim programları, çizimi yapıyor, metrajı metretül bazında hesaplıyor, o da yanlış oluyor, çünkü fireyi de metreye dahil ediyor. çıkan metrajı 600 santime bölüp şu kadar boy profil lazım demek hatalı oluyor.
Bir de uğraşmaya değmesi için parça ölçüsü ile karşısına adeti birlikte düşünürsek, bunu user form ve optionbuton ekleme kısmına geldiğimizde, ölçüler bir textboxtan, adetler bir textboxtan okututulursa daha doğru olacaktır.
Belkide bir program çıkmasına vesile oluruz…
Şimdiden kolay gelsin, emekleriniz için tekrar teşekkür ederim.