Algorytm układania odcinków podczas cięcia profili

0

Cześć,
chciałbym sobie ułatwić pracę za pomocą programu, który wykona rozkład odcinków za mnie.

Sprawa wygląda następująco. Projektuję maszynę/urządzenie, którego konstrukcja składa się z profilu o pewnym przekroju np. 40x40 mm.
Dostawcy dostarczają materiał w 6 m (6000 mm) odcinkach. Ja na przykład mam listę odcinki = [1500, 2000, 145, ... , 500] itd. Często odcinki się powtarzają. Moim celem jest jak najbardziej optymalne rozłożenie tych odcinków z lity aby pozostawał jak najmniejszy odpad i żeby program wyliczał mi ile surowca 6m profili zamówić.

Np. lista = [ 1500 mm - 3 szt., 500 mm - 5 szt., 1000 mm - 2 szt.]

1 belka = 1500 + 1500 +1500 +500 +500 +500 = 6000 mm, odpad = 0 mm
2 belka = 500 + 500 + 1000 + 1000 = 3000 mm, odpad 3000 mm

Cześć do wczytywania odcinków z pomocą forumowiczów napisałem, ale mam problem z napisaniem algorytmu do rozkładu. Może ktoś z was coś podlinkuje albo podpowie.

Kod wczytywania odcinków i zapisania w liście:

def section_dec():
	'''Funkcja mająca na celu utworzenie listy z odcinkami pociętego profilu'''	
	#Wpisanie długość odcinka oraz ile razy ma wystąpić na liście
	profile_dim = []
	

	while True:
		profile = []
		print('\nWpisanie "quit" spowoduje wyłączenie programu')

		while True:

			length =input('Podaj długość uciętego profilu w [mm]: ')
			if length == 'quit':
				return
			try: 
				length = int(length)
			except ValueError as e:
				print(f'Upss.. Podana wartość nie jest liczbą. Spróbuj jeszcze raz \n{e}')
				continue
			break
			
		while True:
			
			multiply = input(f'Ile sztuk {length} wykonać?: ')
			if multiply == 'quit':
				return
			try: 
				multiply = int(multiply)
			except ValueError as e:
				print(f'Upss.. Podana wartość nie jest liczbą. Spróbuj jeszcze raz \n{e}')
				continue
			break
		

		#Dodanie do listy oraz zwielokratniania elementów listy 
		profile.append(length)
		profile = profile*multiply
		print(profile)

		
		profile_dim.extend(profile)



		ending = input('Czy zakończyć dodawanie elementó do listy (wpisz "tak")').lower()
		
		if ending == 'tak':
			break
		

	
	return profile_dim

section = section_dec()
print(f'lista wszystkich przyciętych prfili: \n\t{section}')
0

Cześć,

To jest tzw Cutting stock problem -> https://en.wikipedia.org/wiki/Cutting_stock_problem

Robiłem jakiś czas temu research na podobny problem w branży drzewnej no i powiem że ciężko coś gotowego znaleźc, więc napisałem programik który liczy to mniej więcej tak:

  1. Podajesz wymiary materiału jaki masz.
  2. Podajesz wymiary i ilości formatek jakie chcesz otrzymać.
  3. Robię kombinację wszystkich możliwych ułożeń i obliczam jaki jest odpad.
  4. Układam to według najmniejszego układu.

Możesz zobaczyć jak to działa tutaj -> https://drewpartner.korodak.hostingasp.pl/

przykładowe linki:
https://softwareengineering.stackexchange.com/questions/170539/one-dimensional-cutting-algorithm-with-minimum-waste/170544
https://codeincomplete.com/articles/bin-packing/
https://blackpawn.com/texts/lightmaps/default.html

Szukaj pod hasłem "1d cutting problem", "1d optimize cutting" etc.

1

Warto szukać pod hasłem "nesting" - są dostępne rozwiązania dedykowane, 1D, 2D i 3D również (kiedyś wykorzystywałem 3D do zautomatyzowania planu rozkładu paczek w kontenerach).
Z doświadczenia: przy planowaniu rozkrojów trzeba uwzględnić grubość cięcia :)

0

Wdrażaliśmy takie tematy w 3 firmach za każdym razem w innym języku. Javie, Pythonie i c#. Zawsze algorytm genetyczny głównie ze względu na dużą ilość kombinacji, zwykle powyżej 100 odcinków a często znacznie więcej.
Widziałem też, jak jakiś naukowiec, zrobiła taką optymalizację, że losował sobie 1000 kombinacji i w tych 1000 szukał najlepszego rozwiązania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1