Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> przypisanie odpowiednich wartości
mihmih
post 11.10.2019, 15:33:39
Post #1





Grupa: Zarejestrowani
Postów: 125
Pomógł: 1
Dołączył: 4.06.2015

Ostrzeżenie: (0%)
-----


Witam,

mam pewien problem i nie mogę sobie poradzić... Mam pewną grupę operacji, kolumny to nazwa operacji, kolejność, długość operacji, id konstrukcji

op1, 3, 4, 1
op2, 2, 2, 2
op3, 7, 1, 1
op4, 5, 8, 1
op5, 8, 4, 2

Chodzi o to, że te operacje należy wykonać wg kolejności od najmniejszej wartości do największej i potrzebuje ile jednostek czasowych przed jakimś tam terminem trzeba zakończyć każdą operacje, żeby, utrzymując poprawną kolejność, zmieścić się w czasie. Wszystko musi odbywać się z ramach jednej konstrukcji. Czyli chcę otrzymać:

13
6
1
9
4

Ktoś ma może jakiś pomysł?
Go to the top of the page
+Quote Post
trueblue
post 11.10.2019, 17:43:43
Post #2





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Mógłbyś wyjaśnić skąd się wziął wynik?

Ja kiedy je posortowałem według kolejności, otrzymałem czasy: 2, 4, 8, 1, 4, czyli całość operacji to 19 jednostek. Operacje więc musiałaby się kończyć przed: (19-2)=17, (19-2-4)=13, (19-2-4-8)=5, (19-2-4-8-1)=4, (19-2-4-8-1-4)=0.


--------------------
Go to the top of the page
+Quote Post
mihmih
post 11.10.2019, 20:00:06
Post #3





Grupa: Zarejestrowani
Postów: 125
Pomógł: 1
Dołączył: 4.06.2015

Ostrzeżenie: (0%)
-----


Wszystko ładnie, tylko chodzi o to że to są dwie różne konstrukcje, dla których odejmujemy wartości osobno. Ostatnia kolumna to id konstrukcji. Operacja wykonywana w celu zbudowania jednej konstrukcji nie wpływa na inne konstrukcje.
Go to the top of the page
+Quote Post
trueblue
post 11.10.2019, 20:40:40
Post #4





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Nie określiłeś, że obliczanie czasu ma być również odrębne dla konstrukcji, lecz "operacje należy wykonać wg kolejności od najmniejszej wartości do największej".

To nie jest rozwiązanie, bo prosiłem, abyś wyjaśnił skąd się wzięły liczby. Tak chyba będzie łatwiej znaleźć rozwiązanie, którego szukasz.

P.S. Dla odrębnych konstrukcji mamy czasy całkowite 13 oraz 6. Choć nadal nie wiem czy ma to w ogóle sens, bo nie wiem jaki tok postępowania przyjąć.


--------------------
Go to the top of the page
+Quote Post
mihmih
post 11.10.2019, 22:00:12
Post #5





Grupa: Zarejestrowani
Postów: 125
Pomógł: 1
Dołączył: 4.06.2015

Ostrzeżenie: (0%)
-----


Napisałem w pierwszym poście, że: "Wszystko musi odbywać się z ramach jednej konstrukcji"... ale masz racje, niepotrzebnie dodawałem czas tej konkretnej operacji w każdym przypadku. A więc wynikiem powinno być:

9
4
0
1
0

i tak np. 9 ponieważ konstrukcja nr 1 potrzebuje 3 operacji, a op1 w tej konstrukcji ma za sobą dwie operacje, które po wykonaniu op1 potrzebują 9 jednostek czasu.
Go to the top of the page
+Quote Post
trueblue
post 12.10.2019, 08:42:42
Post #6





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Nadal nie rozumiem.
Skąd 4 i 0?
Jeśli op1 potrzebuje 9 jednostek (za nią są 8+1), to op2 1 jednostkę (za nią 1), a op3 0 jednostek (za nią nic).


--------------------
Go to the top of the page
+Quote Post
mihmih
post 12.10.2019, 18:39:28
Post #7





Grupa: Zarejestrowani
Postów: 125
Pomógł: 1
Dołączył: 4.06.2015

Ostrzeżenie: (0%)
-----


4 dlatego że:

op2 wchodzi wskład konstrukcji nr 2
ta konstrukcja składa się z dwóch operacji: op2 i op5
najpierw należy wykonać op2, potem op5 (2<8)
op2 zatem musi być zakończona 4 dni przed terminem 0, ponieważ po wykonaniu op2 potrzeba jeszcze 4 jednostek czasu na wykonanie op5
Go to the top of the page
+Quote Post
trueblue
post 12.10.2019, 19:10:59
Post #8





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


Jeszcze bardziej stało się to dla mnie zagmatwane.
Najpierw była wartość 9 wynikająca z 3 operacji dla konstrukcji 1, a teraz jako druga pojawia się wartość wynikająca z konstrukcji 2, choć pisałeś, że wszystko ma się odbywać w ramach jednej konstrukcji (a z tego wyjaśnienia wynika, że jednak operacje są przemieszane).

Jeśli kluczem sortowania będzie kolejność, to:
oper: 2 1 4 3 5
czas: 2 4 8 1 4
kons: 2 1 1 1 2
czyli operacje będę przemieszane względem konstrukcji.

Możesz pokazać w jakiej kolejności należy posortować przykładowe rekordy (na razie abstrahując od liczenia czasu)?


--------------------
Go to the top of the page
+Quote Post
mihmih
post 12.10.2019, 19:46:05
Post #9





Grupa: Zarejestrowani
Postów: 125
Pomógł: 1
Dołączył: 4.06.2015

Ostrzeżenie: (0%)
-----


1. Mam listę wszystkich operacji, ale operacje mogą być wykorzystywane do różnych konstrukcji.
2. Przy każdej operacji chce uzyskać kolumnę, z wartością ile jednostek czasowych przed terminem 0 musi być zakończona dana operacja, żeby przypisana do niej konstrukcja była zakończona w terminie
3. Np. w przypadku op1... wchodzi ona wskład wykonania konstrukcji nr 1 wraz z dwoma innymi operacjami: op3 i op4. Jest to pierwsza operacja potrzebna do wykonania tej konstrukcji (3<5, 3<7), a więc musi być ona wykonana na 9 dni przed terminem. 9 dni ponieważ op3 zajmuje 1 dzień, a op4 8 dni.

Konstrukcje należy rozpatrywać osobno, ale lista operacji jest jedna, z różnymi konstrukcjami do nich przypisanymi. Czy teraz jest to trochę bardziej jasne?

Go to the top of the page
+Quote Post
trueblue
post 13.10.2019, 07:00:59
Post #10





Grupa: Zarejestrowani
Postów: 6 761
Pomógł: 1822
Dołączył: 11.03.2014

Ostrzeżenie: (0%)
-----


  1. CREATE TABLE `operacja` (
  2. `id_operacja` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  3. `operacja` CHAR(3) NULL DEFAULT NULL,
  4. `sort_key` INT(10) UNSIGNED NOT NULL DEFAULT '0',
  5. `czas` INT(10) UNSIGNED NOT NULL DEFAULT '0',
  6. `id_konstrukcja` INT(10) UNSIGNED NOT NULL DEFAULT '0',
  7. PRIMARY KEY (`id_operacja`)
  8. )
  9. COLLATE='utf8_general_ci'
  10. ENGINE=MyISAM
  11. ;


  1. SELECT o1.operacja, COALESCE(SUM(o2.czas),0)
  2. FROM operacja AS o1
  3. LEFT JOIN operacja AS o2 ON o1.sort_key<o2.sort_key AND o1.id_konstrukcja=o2.id_konstrukcja
  4. GROUP BY o1.id_operacja





--------------------
Go to the top of the page
+Quote Post
mihmih
post 15.10.2019, 13:38:29
Post #11





Grupa: Zarejestrowani
Postów: 125
Pomógł: 1
Dołączył: 4.06.2015

Ostrzeżenie: (0%)
-----


dzięki za pomoc. Dopiero w weekend będę miał okazję sprawdzić to na prawdziwej bazie, ale w teorii wygląda na to o co mi chodziło. Dziękuję.

Jeszcze się zastanawiam nad jedna rzeczą...jeśli w jakiejś konstrukcji będzie 7 operacji poprzedzających konkretna operacje i w sumie będzie należało odjąć 30 dni. To pojawia się tutaj problem weekendów i świąt. Bo oczywiście pracujemy jedynie w dni robocze.

- jak do wartości 30 dodać określoną wartość wynikająca z weekendów pomiędzy tymi dwoma datami
- jak do tej wartości dodać kolejne wartości, jeśli wynik powyżej wyjdzie w sobotę lub niedzielę
- jak w tym wszystkim uwzględnić święta, których daty są przechowywane w dodatkowej tabeli

Ten post edytował mihmih 15.10.2019, 13:48:06
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 28.03.2024 - 23:40