Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 70550 Skopiuj do schowka Solver - zamówienie desek
Autor Wiadomość
jasiux 
Fan Excela


Posty: 81
Wysłany: 30-03-2021, 13:42   Solver - zamówienie desek

Cześć,

Potrzebuję policzyć z wielu wymiarów desek, ilość materiału jaką zamówić na ogrodzenie :)

Deski dostępne są w długościach 400 i 500 cm

Potrzebuję policzyć ile jakich desek zamówić i jak je ciąć.
Chyba solver to powinien ogarnąć, ale mogę się mylić.

Długości desek jakie potrzebuję w formacie długość,ilość:

155,22
130,11
160,22
175,44
200,11
190,22
114,11
90,11
249,11


Ktoś pomoże/naprowadzi? Ostatni raz używałem tego na studiach...
ID posta: 402958 Skopiuj do schowka
 
 
ąćęłńóś
Excel Expert


Pomógł: 327 razy
Posty: 1615
Wysłany: 30-03-2021, 19:05   

Jak dla mnie, to wystarczyłyby tylko formułki, np.: "ZAOKR.DO.CAŁK" i "ZAOKR.GÓRA" ... (?)
Najpierw wyliczyć ilość możliwą (ile konkretnej dechy da się wyciąć z 4-setki, a ile z 5-setki), a potem dzielnąć ilość wymaganą (to co podajesz) przez ilość możliwą.
ID posta: 402986 Skopiuj do schowka
 
 
Kaper 



Zaproszone osoby: 2
Wersja: Win Office 365
Pomógł: 4228 razy
Posty: 7959
Wysłany: 03-04-2021, 08:40   

Już zacząłem pisać, że:

dla solvera badającego wszystkie możliwości prawdopodobnie będzie tu za dużo zmiennych. Dodatkowym utrudnieniem są zróżnicowane długości desek wejściowych. Być może Open Solver dałby sobie z tym radę.

Ale okazuje się, że (dość rozsądne) przyjęcie, że jeśli np. fragmenty 200 i 200 mogą być wycięte zarówno z deski 400 (0 cm odpadu) jak i z 500 (100 cm odpadu) to wytniemy je z deski 400 pozwala nam zejść ciut poniżej dopuszczalnej przez solvera liczby zmiennych.

Wypisanie wszystkich możliwych sposobów cięcia ręcznie byłoby kłopotliwe i czasochłonne, więc napisałem makro, które takie dane przygotowuje (Arkusz1)

Wynik działania Solvera i jego ustawienie w załączniku w Arkuszu 2 (być może nie jest to rozkrój optymalny, ale chyba zadowalająco bliski optymalnego). Zużywamy 57 desek, a suma odpadów to półtorej deski :-)

Makro na wszelki wypadek wklejam tu, a ustawienia solvera i wykorzystane formuły widoczne w arkuszu. Wyjaśnię może tylko jedną - w K2:
Kod:
=SUMA.ILOCZYNÓW(K4:K191;$L$4:$L$191)+SUMA.ILOCZYNÓW((B1:J1-B2:J2);B3:J3)
to suma odpadów i niewykorzystanych wyciętych fragmentów (liczba desek z danym typem rozkroju * odpad z danego typu plus liczba nadmiarowo wyciętych desek). Akurat w tym rozwiązaniu, które się tym razem wygenerowało w załączniku takich nie ma, ale solver wygenerował mi w innej próbie rozwiązanie, gdzie było pocięte tyle samo desek, a długośc odpadów pozornie była mniejsza. Pozornie, dlatego, że solver "wyciął" o jedną gotową deskę 130 cm za dużo. Pewnie z takiej jak np. ta zaznaczona na żółto w arkuszu wynikowym. Wyniki w arkuszu 2 już po pracy solvera posortowałem wg liczby zużytych desek, bo były rozrzucone w pionie wśród niemal 200 wierszy i było słabo widać jakie rozkroje są wybierane.

I obiecany kod:
Kod:
Dim dlugosci, wiersz As Long

Sub test()
Dim i As Integer
dlugosci = Application.Transpose(Range("b3:j3").Value)
wiersz = 3
For i = 0 To Int(500 / dlugosci(1, 1))
  sprawdz i & ";", i * dlugosci(1, 1), 1
Next i
Range("J4").Value = 1
Range("J4").Copy
With Range("A3:K" & Cells(Rows.Count, "A").End(xlUp).Row)
  .PasteSpecial Paste:=xlPasteValues, Operation:=xlMultiply
  Application.CutCopyMode = False
  .RemoveDuplicates Columns:=Array(2, 3, 4, 5, 6, 7, 8, 9, 10), Header:=xlYes
End With

End Sub

Sub sprawdz(ByVal lista As String, ByVal suma As Double, ByVal ktora As Integer)
Dim i As Integer, reszta As Double
If suma <= 500 Then 'jeśli większa, to nie do wycięcia
  zapisz lista, suma
  If ktora < UBound(dlugosci) Then
    reszta = 500 - suma
    For i = 0 To Int(reszta / dlugosci(ktora + 1, 1))
      sprawdz lista & i & ";", suma + i * dlugosci(ktora + 1, 1), ktora + 1
    Next i
  End If
End If
End Sub
 
Sub zapisz(lista As String, suma As Double)
Dim dane, puste, i As Integer
puste = Split("0;0;0;0;0;0;0;0;0;0;0;0;0", ";")
If suma > 0 Then
  wiersz = wiersz + 1
  dane = Split(lista, ";")
  Cells(wiersz, "B").Resize(1, UBound(dane)) = dane
  Cells(wiersz, "B").Offset(0, UBound(dane)).Resize(1, UBound(dlugosci) - UBound(dane) + 1) = puste
  If suma <= 400 Then
    Cells(wiersz, "A") = "deska 400"
    Cells(wiersz, "K") = 400 - suma
  Else
    Cells(wiersz, "A") = "deska 500"
    Cells(wiersz, "K") = 500 - suma
  End If
End If
End Sub


Zeszyt2.xlsm
Pobierz Plik ściągnięto 10 raz(y) 36.17 KB

_________________
Kaper Jej Królewskiej Mości :boss

Jeśli dane będą torturowane dość długo, przyznają się do wszystkiego
ID posta: 403125 Skopiuj do schowka
 
 
Kaper 



Zaproszone osoby: 2
Wersja: Win Office 365
Pomógł: 4228 razy
Posty: 7959
Wysłany: 09-04-2021, 14:45   

No i chyba nasz Fan Excela jasiux przytłukł sobie palec przybijając deski : :lol: :lol: :lol: bo nie komentuje propozycji :tak :
_________________
Kaper Jej Królewskiej Mości :boss

Jeśli dane będą torturowane dość długo, przyznają się do wszystkiego
ID posta: 403340 Skopiuj do schowka
 
 
ąćęłńóś
Excel Expert


Pomógł: 327 razy
Posty: 1615
Wysłany: 10-04-2021, 18:40   

Bo dechy pewnikiem przyjechały zapakowane w paczki-kubiki i teraz trzeba wpierw przeliczyć z metrów sześciennych na kwadratowe, żeby wyszły sztuki ... albo może na jaką zabawę już rozebrali ... :roll: ... jest zabawa, nie ma ogrodzenia i na odwrót ... :roll:
ID posta: 403363 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe