TAS:Pokročilé/Kurýr: Porovnání verzí
(Není zobrazeno 6 mezilehlých verzí od stejného uživatele.) | |||
Řádek 1: | Řádek 1: | ||
<languages /> <translate> | <languages /> | ||
<translate> | |||
<!--T:1--> | |||
Modul kurýr není "klasický" modul, jde úpravu [https://wiki.solvertech.cz/wiki/TAS:Pokro%C4%8Dil%C3%A9/Pluginy/Input,_Output/Import/ScenarioImporter ScenarioImporteru] a případně i [https://wiki.solvertech.cz/wiki/TAS:Pokro%C4%8Dil%C3%A9/Pluginy/Input,_Output/Import/SolverTech.Tasha.PlugIns.Commands.PostImportJobsCompute PostImportJobsCompute] tak, aby Tasha zjistila ceny jednotlivých dopravců, našla nejlevnějšího (většinou) a toho porovnala s cenou závozu. | Modul kurýr není "klasický" modul, jde úpravu [https://wiki.solvertech.cz/wiki/TAS:Pokro%C4%8Dil%C3%A9/Pluginy/Input,_Output/Import/ScenarioImporter ScenarioImporteru] a případně i [https://wiki.solvertech.cz/wiki/TAS:Pokro%C4%8Dil%C3%A9/Pluginy/Input,_Output/Import/SolverTech.Tasha.PlugIns.Commands.PostImportJobsCompute PostImportJobsCompute] tak, aby Tasha zjistila ceny jednotlivých dopravců, našla nejlevnějšího (většinou) a toho porovnala s cenou závozu. | ||
<!--T:2--> | |||
'''Obecně'''<br /> | '''Obecně'''<br /> | ||
V rámci ScenarioImporteru je třeba přidat dynamické sloupce, potřebné pro výpočet. Lze jen doporučit "civilizované" pojmenování sloupců tak, aby bylo zřejmé, co je ve sloupci obsaženo. Sloupec "cena1" toho pravděpodobně moc nenapoví, slupec "geis1zona" je lepší.<br /> | V rámci ScenarioImporteru je třeba přidat dynamické sloupce, potřebné pro výpočet. Lze jen doporučit "civilizované" pojmenování sloupců tak, aby bylo zřejmé, co je ve sloupci obsaženo. Sloupec "cena1" toho pravděpodobně moc nenapoví, slupec "geis1zona" je lepší.<br /> | ||
Komentujte kód. Kurýr patří k těm složitějším výpočtům a když se ke kódu budete po delší době vracet (nebo se jím bude muset zabývat kolega), komentáře oceníte. | Komentujte kód. Kurýr patří k těm složitějším výpočtům a když se ke kódu budete po delší době vracet (nebo se jím bude muset zabývat kolega), komentáře oceníte. | ||
<!--T:3--> | |||
'''Určení ceny dopravce při použití hmotnosti zásilky'''<br /> | '''Určení ceny dopravce při použití hmotnosti zásilky'''<br /> | ||
Jeden z nejběžnějších výpočtů.<br /> | Jeden z nejběžnějších výpočtů.<br /> | ||
Vycházejme z dopravce DPD s následujícím ceníkem: | Vycházejme z dopravce DPD s následujícím ceníkem: | ||
<!--T:4--> | |||
{| class="wikitable" data-layout="default" | {| class="wikitable" data-layout="default" | ||
| '''Hmotnost''' | | '''Hmotnost''' | ||
Řádek 25: | Řádek 29: | ||
|} | |} | ||
<!--T:5--> | |||
V rámci ScenarioImporteru bude třeba následjuící kód (demand1 je hmotnost zásilky a je již definována): | V rámci ScenarioImporteru bude třeba následjuící kód (demand1 je hmotnost zásilky a je již definována): | ||
<!--T:6--> | |||
<ColumnsCalculated> | <ColumnsCalculated> | ||
<string>dynamic;dpdcena;dynamic;dpdcena;stop1;demand1;;stop1demand1<101?159:dynamicdpdcena</string> | <string>dynamic;dpdcena;dynamic;dpdcena;stop1;demand1;;stop1demand1<101?159:dynamicdpdcena</string> | ||
Řádek 33: | Řádek 39: | ||
</ColumnsCalculated> | </ColumnsCalculated> | ||
<!--T:7--> | |||
Kód říká, že pokud je hmotnost zásilky menší než 101 kg, do sloupce dpdcena se propíše hodnota 159. Při vyhodnocování podmínek je nezbytné postupovat buď od nejvyšší možné váhy, nebo od nejnižší možné váhy (pak se použije “&gt;” ) | Kód říká, že pokud je hmotnost zásilky menší než 101 kg, do sloupce dpdcena se propíše hodnota 159. Při vyhodnocování podmínek je nezbytné postupovat buď od nejvyšší možné váhy, nebo od nejnižší možné váhy (pak se použije “&gt;” ) | ||
<!--T:8--> | |||
'''Určení ceny dopravce při použití zón'''<br /> | '''Určení ceny dopravce při použití zón'''<br /> | ||
Vycházejme z dopravce Geis s následujícím ceníkem: | Vycházejme z dopravce Geis s následujícím ceníkem: | ||
<!--T:9--> | |||
{| class="wikitable" data-layout="default" | {| class="wikitable" data-layout="default" | ||
| | | | ||
Řádek 60: | Řádek 69: | ||
|} | |} | ||
<!--T:10--> | |||
Ve ScenarioImporteru bude třeba následující kód: | Ve ScenarioImporteru bude třeba následující kód: | ||
<!--T:11--> | |||
<ColumnsCalculated> | <ColumnsCalculated> | ||
<!-- určení zóny dle PSČ --> | <!-- určení zóny dle PSČ --> | ||
Řádek 68: | Řádek 79: | ||
<string>dynamic;geiszona;dynamic;geiszona;dynamic;psc;;dynamicpsc<20000?1:dynamicgeiszona</string> <!--PSČ 1XX XX jsou pražská --> | <string>dynamic;geiszona;dynamic;geiszona;dynamic;psc;;dynamicpsc<20000?1:dynamicgeiszona</string> <!--PSČ 1XX XX jsou pražská --> | ||
<!-- určení ceny pro zóny podle váhy --> | <!--T:12--> | ||
<!-- určení ceny pro zóny podle váhy --> | |||
<string>dynamic;geis1zona;dynamic;geis1zona;stop1;demand1;;stop1demand1<101?159:dynamicgeis1zona</string> | <string>dynamic;geis1zona;dynamic;geis1zona;stop1;demand1;;stop1demand1<101?159:dynamicgeis1zona</string> | ||
<string>dynamic;geis1zona;dynamic;geis1zona;stop1;demand1;;stop1demand1<51?119:dynamicgeis1zona</string> | <string>dynamic;geis1zona;dynamic;geis1zona;stop1;demand1;;stop1demand1<51?119:dynamicgeis1zona</string> | ||
<string>dynamic;geis1zona;dynamic;geis1zona;stop1;demand1;;stop1demand1<16?59:dynamicgeis1zona</string> | <string>dynamic;geis1zona;dynamic;geis1zona;stop1;demand1;;stop1demand1<16?59:dynamicgeis1zona</string> | ||
<string>dynamic;geis2zona;dynamic;geis2zona;stop1;demand1;;stop1demand1<101?199:dynamicgeis2zona</string> | <!--T:13--> | ||
<string>dynamic;geis2zona;dynamic;geis2zona;stop1;demand1;;stop1demand1<101?199:dynamicgeis2zona</string> | |||
<string>dynamic;geis2zona;dynamic;geis2zona;stop1;demand1;;stop1demand1<51?159:dynamicgeis2zona</string> | <string>dynamic;geis2zona;dynamic;geis2zona;stop1;demand1;;stop1demand1<51?159:dynamicgeis2zona</string> | ||
<string>dynamic;geis2zona;dynamic;geis2zona;stop1;demand1;;stop1demand1<16?69:dynamicgeis2zona</string> | <string>dynamic;geis2zona;dynamic;geis2zona;stop1;demand1;;stop1demand1<16?69:dynamicgeis2zona</string> | ||
<string>dynamic;geis3zona;dynamic;geis3zona;stop1;demand1;;stop1demand1<101?259:dynamicgeis3zona</string> | <!--T:14--> | ||
<string>dynamic;geis3zona;dynamic;geis3zona;stop1;demand1;;stop1demand1<101?259:dynamicgeis3zona</string> | |||
<string>dynamic;geis3zona;dynamic;geis3zona;stop1;demand1;;stop1demand1<51?199:dynamicgeis3zona</string> | <string>dynamic;geis3zona;dynamic;geis3zona;stop1;demand1;;stop1demand1<51?199:dynamicgeis3zona</string> | ||
<string>dynamic;geis3zona;dynamic;geis3zona;stop1;demand1;;stop1demand1<16?79:dynamicgeis3zona</string> | <string>dynamic;geis3zona;dynamic;geis3zona;stop1;demand1;;stop1demand1<16?79:dynamicgeis3zona</string> | ||
<!-- určení finální ceny --> | <!--T:15--> | ||
<!-- určení finální ceny --> | |||
<string>dynamic;cenageis;dynamic;cenageis;dynamic;geiszona;dynamic;geis1zona;;dynamicgeiszona==1?dynamicgeis1zona:dynamiccenageis</string> <!-- pokud je zóna 1, použije se cena, uvedená v geis1zona --> | <string>dynamic;cenageis;dynamic;cenageis;dynamic;geiszona;dynamic;geis1zona;;dynamicgeiszona==1?dynamicgeis1zona:dynamiccenageis</string> <!-- pokud je zóna 1, použije se cena, uvedená v geis1zona --> | ||
<string>dynamic;cenageis;dynamic;cenageis;dynamic;geiszona;dynamic;geis2zona;;dynamicgeiszona==2?dynamicgeis2zona:dynamiccenageis</string> | <string>dynamic;cenageis;dynamic;cenageis;dynamic;geiszona;dynamic;geis2zona;;dynamicgeiszona==2?dynamicgeis2zona:dynamiccenageis</string> | ||
Řádek 89: | Řádek 104: | ||
<!--T:16--> | |||
'''Určení ceny při použití vzdáleností'''<br /> | '''Určení ceny při použití vzdáleností'''<br /> | ||
Vycházejme z dopravce TopTrans s následujícím ceníkem: | Vycházejme z dopravce TopTrans s následujícím ceníkem: | ||
<!--T:17--> | |||
{| class="wikitable" data-layout="default" | {| class="wikitable" data-layout="default" | ||
| | | | ||
Řádek 114: | Řádek 131: | ||
|} | |} | ||
<!--T:18--> | |||
V tomto případě je nutné počítat jak ve ScenarioImporteru, tak i v PostImportJobsCompute. | V tomto případě je nutné počítat jak ve ScenarioImporteru, tak i v PostImportJobsCompute. | ||
<!--T:19--> | |||
Ve ScenarioImporteru bude třeba následující kód: | Ve ScenarioImporteru bude třeba následující kód: | ||
<!--T:20--> | |||
<ColumnsCalculated> | <ColumnsCalculated> | ||
<!-- určení ceny pro vzdálenosti podle váhy --> | <!-- určení ceny pro vzdálenosti podle váhy --> | ||
Řádek 124: | Řádek 144: | ||
<string>dynamic;toptrans100km;dynamic;toptrans100km;stop1;demand1;;stop1demand1<16?59:dynamictoptrans100km</string> | <string>dynamic;toptrans100km;dynamic;toptrans100km;stop1;demand1;;stop1demand1<16?59:dynamictoptrans100km</string> | ||
<string>dynamic;toptrans300km;dynamic;toptrans300km;stop1;demand1;;stop1demand1<101?199:dynamictoptrans300km</string> | <!--T:21--> | ||
<string>dynamic;toptrans300km;dynamic;toptrans300km;stop1;demand1;;stop1demand1<101?199:dynamictoptrans300km</string> | |||
<string>dynamic;toptrans300km;dynamic;toptrans300km;stop1;demand1;;stop1demand1<51?159:dynamictoptrans300km</string> | <string>dynamic;toptrans300km;dynamic;toptrans300km;stop1;demand1;;stop1demand1<51?159:dynamictoptrans300km</string> | ||
<string>dynamic;toptrans300km;dynamic;toptrans300km;stop1;demand1;;stop1demand1<16?119:dynamictoptrans300km</string> | <string>dynamic;toptrans300km;dynamic;toptrans300km;stop1;demand1;;stop1demand1<16?119:dynamictoptrans300km</string> | ||
<string>dynamic;toptrans700km;dynamic;toptrans700km;stop1;demand1;;stop1demand1<101?259:dynamictoptrans700km</string> | <!--T:22--> | ||
<string>dynamic;toptrans700km;dynamic;toptrans700km;stop1;demand1;;stop1demand1<101?259:dynamictoptrans700km</string> | |||
<string>dynamic;toptrans700km;dynamic;toptrans700km;stop1;demand1;;stop1demand1<51?199:dynamictoptrans700km</string> | <string>dynamic;toptrans700km;dynamic;toptrans700km;stop1;demand1;;stop1demand1<51?199:dynamictoptrans700km</string> | ||
<string>dynamic;toptrans700km;dynamic;toptrans700km;stop1;demand1;;stop1demand1<16?159:dynamictoptrans700km</string> | <string>dynamic;toptrans700km;dynamic;toptrans700km;stop1;demand1;;stop1demand1<16?159:dynamictoptrans700km</string> | ||
Řádek 135: | Řádek 157: | ||
<!--T:23--> | |||
V PostImportJobsCompute bude třeba následující kód: | V PostImportJobsCompute bude třeba následující kód: | ||
<!--T:24--> | |||
<Equations> | <Equations> | ||
<!-- přiřazení ceny ke vzdálenosti--> | <!-- přiřazení ceny ke vzdálenosti--> | ||
Řádek 146: | Řádek 170: | ||
<!--T:25--> | |||
Pokud je použit výpočet podle vzdálenosti, je nezbytné po načtení zakázek (a správném spočtení matice vzdáleností) kliknout na "Výpočty zakázek".<br /> | Pokud je použit výpočet podle vzdálenosti, je nezbytné po načtení zakázek (a správném spočtení matice vzdáleností) kliknout na "Výpočty zakázek".<br /> | ||
Pokud má Tasha určovat optimálního dopravce, je třeba porovnat ceny různých dopravců a tu nejnižší propsat do job.notservedpenalty (pokud je použit PostImportJobsCompute, je třeba porovnání a přiřazení dělat tam). V průběhu řešení pak tasha rozhodne, zda je finančně výhodnější zásilku obsloužit, nebo zda ji ponechá neobslouženou (tedy notservedpenalty bude menší než cena závozu). | Pokud má Tasha určovat optimálního dopravce, je třeba porovnat ceny různých dopravců a tu nejnižší propsat do job.notservedpenalty (pokud je použit PostImportJobsCompute, je třeba porovnání a přiřazení dělat tam). V průběhu řešení pak tasha rozhodne, zda je finančně výhodnější zásilku obsloužit, nebo zda ji ponechá neobslouženou (tedy notservedpenalty bude menší než cena závozu). | ||
</translate> | </translate> |
Aktuální verze z 23. 3. 2023, 15:32
Modul kurýr není "klasický" modul, jde úpravu ScenarioImporteru a případně i PostImportJobsCompute tak, aby Tasha zjistila ceny jednotlivých dopravců, našla nejlevnějšího (většinou) a toho porovnala s cenou závozu.
Obecně
V rámci ScenarioImporteru je třeba přidat dynamické sloupce, potřebné pro výpočet. Lze jen doporučit "civilizované" pojmenování sloupců tak, aby bylo zřejmé, co je ve sloupci obsaženo. Sloupec "cena1" toho pravděpodobně moc nenapoví, slupec "geis1zona" je lepší.
Komentujte kód. Kurýr patří k těm složitějším výpočtům a když se ke kódu budete po delší době vracet (nebo se jím bude muset zabývat kolega), komentáře oceníte.
Určení ceny dopravce při použití hmotnosti zásilky
Jeden z nejběžnějších výpočtů.
Vycházejme z dopravce DPD s následujícím ceníkem:
Hmotnost | Cena |
do 15 kg | 79 Kč |
16 - 50 kg | 119 Kč |
51 - 100 kg | 159 Kč |
V rámci ScenarioImporteru bude třeba následjuící kód (demand1 je hmotnost zásilky a je již definována):
<ColumnsCalculated> <string>dynamic;dpdcena;dynamic;dpdcena;stop1;demand1;;stop1demand1<101?159:dynamicdpdcena</string> <string>dynamic;dpdcena;dynamic;dpdcena;stop1;demand1;;stop1demand1<51?119:dynamicdpdcena</string> <string>dynamic;dpdcena;dynamic;dpdcena;stop1;demand1;;stop1demand1<16?79:dynamicdpdcena</string> </ColumnsCalculated>
Kód říká, že pokud je hmotnost zásilky menší než 101 kg, do sloupce dpdcena se propíše hodnota 159. Při vyhodnocování podmínek je nezbytné postupovat buď od nejvyšší možné váhy, nebo od nejnižší možné váhy (pak se použije “>” )
Určení ceny dopravce při použití zón
Vycházejme z dopravce Geis s následujícím ceníkem:
do 15 kg | do 50 kg | do 100 kg | |
Praha | 59 | 119 | 159 |
Čechy | 69 | 159 | 199 |
Morava | 79 | 199 | 259 |
Ve ScenarioImporteru bude třeba následující kód:
<ColumnsCalculated> <string>dynamic;geiszona;dynamic;geiszona;dynamic;psc;;dynamicpsc>59999?3:dynamicgeiszona</string> <string>dynamic;geiszona;dynamic;geiszona;dynamic;psc;;dynamicpsc<60000?2:dynamicgeiszona</string> <string>dynamic;geiszona;dynamic;geiszona;dynamic;psc;;dynamicpsc<20000?1:dynamicgeiszona</string>
<string>dynamic;geis1zona;dynamic;geis1zona;stop1;demand1;;stop1demand1<101?159:dynamicgeis1zona</string> <string>dynamic;geis1zona;dynamic;geis1zona;stop1;demand1;;stop1demand1<51?119:dynamicgeis1zona</string> <string>dynamic;geis1zona;dynamic;geis1zona;stop1;demand1;;stop1demand1<16?59:dynamicgeis1zona</string>
<string>dynamic;geis2zona;dynamic;geis2zona;stop1;demand1;;stop1demand1<101?199:dynamicgeis2zona</string> <string>dynamic;geis2zona;dynamic;geis2zona;stop1;demand1;;stop1demand1<51?159:dynamicgeis2zona</string> <string>dynamic;geis2zona;dynamic;geis2zona;stop1;demand1;;stop1demand1<16?69:dynamicgeis2zona</string>
<string>dynamic;geis3zona;dynamic;geis3zona;stop1;demand1;;stop1demand1<101?259:dynamicgeis3zona</string> <string>dynamic;geis3zona;dynamic;geis3zona;stop1;demand1;;stop1demand1<51?199:dynamicgeis3zona</string> <string>dynamic;geis3zona;dynamic;geis3zona;stop1;demand1;;stop1demand1<16?79:dynamicgeis3zona</string>
<string>dynamic;cenageis;dynamic;cenageis;dynamic;geiszona;dynamic;geis1zona;;dynamicgeiszona==1?dynamicgeis1zona:dynamiccenageis</string> <string>dynamic;cenageis;dynamic;cenageis;dynamic;geiszona;dynamic;geis2zona;;dynamicgeiszona==2?dynamicgeis2zona:dynamiccenageis</string> <string>dynamic;cenageis;dynamic;cenageis;dynamic;geiszona;dynamic;geis3zona;;dynamicgeiszona==3?dynamicgeis3zona:dynamiccenageis</string> </ColumnsCalculated>
Určení ceny při použití vzdáleností
Vycházejme z dopravce TopTrans s následujícím ceníkem:
do 100 km | do 300 km | do 700 km | |
do 15 kg | 59 | 119 | 159 |
16 - 50 kg | 69 | 159 | 199 |
51 - 100 kg | 79 | 199 | 259 |
V tomto případě je nutné počítat jak ve ScenarioImporteru, tak i v PostImportJobsCompute.
Ve ScenarioImporteru bude třeba následující kód:
<ColumnsCalculated> <string>dynamic;toptrans100km;dynamic;toptrans100km;stop1;demand1;;stop1demand1<101?79:dynamictoptrans100km</string> <string>dynamic;toptrans100km;dynamic;toptrans100km;stop1;demand1;;stop1demand1<51?69:dynamictoptrans100km</string> <string>dynamic;toptrans100km;dynamic;toptrans100km;stop1;demand1;;stop1demand1<16?59:dynamictoptrans100km</string>
<string>dynamic;toptrans300km;dynamic;toptrans300km;stop1;demand1;;stop1demand1<101?199:dynamictoptrans300km</string> <string>dynamic;toptrans300km;dynamic;toptrans300km;stop1;demand1;;stop1demand1<51?159:dynamictoptrans300km</string> <string>dynamic;toptrans300km;dynamic;toptrans300km;stop1;demand1;;stop1demand1<16?119:dynamictoptrans300km</string>
<string>dynamic;toptrans700km;dynamic;toptrans700km;stop1;demand1;;stop1demand1<101?259:dynamictoptrans700km</string> <string>dynamic;toptrans700km;dynamic;toptrans700km;stop1;demand1;;stop1demand1<51?199:dynamictoptrans700km</string> <string>dynamic;toptrans700km;dynamic;toptrans700km;stop1;demand1;;stop1demand1<16?159:dynamictoptrans700km</string> </ColumnsCalculated>
V PostImportJobsCompute bude třeba následující kód:
<Equations> <string>cenatoptrans;cenatoptrans;toptrans700km;distance;;distance<701?toptrans700km:cenatoptrans</string> <string>cenatoptrans;cenatoptrans;toptrans300km;distance;;distance<701?toptrans300km:cenatoptrans</string> <string>cenatoptrans;cenatoptrans;toptrans100km;distance;;distance<701?toptrans100km:cenatoptrans</string> </Equations>
Pokud je použit výpočet podle vzdálenosti, je nezbytné po načtení zakázek (a správném spočtení matice vzdáleností) kliknout na "Výpočty zakázek".
Pokud má Tasha určovat optimálního dopravce, je třeba porovnat ceny různých dopravců a tu nejnižší propsat do job.notservedpenalty (pokud je použit PostImportJobsCompute, je třeba porovnání a přiřazení dělat tam). V průběhu řešení pak tasha rozhodne, zda je finančně výhodnější zásilku obsloužit, nebo zda ji ponechá neobslouženou (tedy notservedpenalty bude menší než cena závozu).