TAS:Pokročilé/Kurýr: Porovnání verzí
imported>Unknown user |
|||
Řádek 1: | Řádek 1: | ||
Modul kurýr není "klasický" modul, jde úpravu [https://solvertech. | 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. | ||
'''Obecně'''<br /> | '''Obecně'''<br /> | ||
Řádek 25: | Řádek 25: | ||
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): | ||
<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 “&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;” ) | ||
Řádek 56: | Řádek 60: | ||
Ve ScenarioImporteru bude třeba následující kód: | Ve ScenarioImporteru bude třeba následující kód: | ||
<ColumnsCalculated> | |||
<!-- určení zóny dle PSČ --> | |||
<string>dynamic;geiszona;dynamic;geiszona;dynamic;psc;;dynamicpsc>59999?3:dynamicgeiszona</string> <!--PSČ 6XX XX a 7XX XX jsou moravská --> | |||
<string>dynamic;geiszona;dynamic;geiszona;dynamic;psc;;dynamicpsc<60000?2:dynamicgeiszona</string> <!--PSČ 5XX XX a méně jsou česká --> | |||
<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 --> | |||
<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> | |||
<!-- 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;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í'''<br /> | '''Určení ceny při použití vzdáleností'''<br /> | ||
Řádek 87: | Řádek 116: | ||
Ve ScenarioImporteru bude třeba následující kód: | Ve ScenarioImporteru bude třeba následující kód: | ||
<ColumnsCalculated> | |||
<!-- určení ceny pro vzdálenosti podle váhy --> | |||
<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: | V PostImportJobsCompute bude třeba následující kód: | ||
<Equations> | |||
<!-- přiřazení ceny ke vzdálenosti--> | |||
<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".<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 /> | ||
Řádek 97: | Řádek 148: | ||
<!-- From bodyContent 702382154.mraw --> | <!-- From bodyContent 702382154.mraw --> | ||
Verze z 4. 8. 2022, 11:37
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).