Maliyet
Her araç için, RouteQ sorgusunda kullanım ücretinin farklı bileşenleri belirtilebilir. Araç veya kurye ücretini belirlemek için vehicle.cost
isteğe bağlı sorgulama alanı kullanılır.
Araç veya kurye ücreti
RouteQ, ücretin aşağıdaki ana bileşenlerinin belirlenmesini sağlar:
-
cost.fixed
– aracın kullanımı ile ilgili sabit ücret. -
cost.hour
– çalışma saati başına ücret. -
cost.km
– kat edilen kilometre başına ücret. -
cost.location
– sipariş başına ücret. -
cost.run
– sefer başına ücret. -
cost.tonne_km
– taşıma işinin ton-kilometresi başına ücret.
Bu durumda, algoritmanın en iyi rota seçeneğini seçtiği ücret kullanılır. Bu, gerçekte araç kullanımı için ücretlendirilen oran değil, algoritmanın ayarlarıdır.
Aracın veya kuryenin ücreti aritmetik bir ifade olarak da belirlenebilir. Daha fazla bilgi için Gelişmiş ücret ayarları bölümüne bakın.
Ücret değerleri
Araç ücretinin bazı bileşenlerinin varsayılan olarak zaten ayarlanmış olduğunu unutmayın:
-
cost.fixed
= 3000 -
cost.hour
= 100 -
cost.km
= 8
Aşağıdaki durumlarda kullanılırlar:
-
eğer excel kullanıyorsanız ve bu alanları boş bırakırsanız;
-
API üzerinden erişiyorsanız ve
vehicle.cost
istek alanını doldurmuyorsanız.
Her zaman cost.hour
ve cost.km
alanlarını 0 dışındaki değerlerle doldurun, aksi takdirde rotalar kaotik hale gelecektir. Bunun nedeni, algoritmanın nihai ücreti optimize etmesidir ve bunun için kilometre veya zaman ücreti 0 ise, herhangi bir kilometreye sahip bir rota aynı ücrete sahip olacaktır.
Taşıma işinin ton-kilometre başına ücreti
Ağır yüklü araçlar daha fazla yakıt kullanır ve daha hızlı aşınır. Bu nedenle ağır yüklerin taşınması için rotaları, araçların ağır yük altında kat ettiği mesafeyi en aza indirecek şekilde tasarlanmasını gerektirir.
RouteQ’de bu amaç için cost.tonne_km
özelliği kullanılır. Araçtaki her bir ton yük için kilometre başına seyahat ücretini belirler. Varsayılan değer 0’dır.
Ton-kilometre cinsinden toplam taşıma işi API yanıtının total_transport_work_cost
alanında döndürülür ve toplam ücreti de total_transport_work_tonne_km
alanına.
Örnek 1
100, 200 ve 2000 kg ağırlığında 3 yükün teslim edilmesi gerekiyor. Bir ton-kilometre başına ücret cost.tonne_km
sıfıra eşit olarak ayarlanmıştır. Sonuç olarak, en ağır sipariş en son teslim edildi: rota oluşturulurken araç yükü dikkate alınmadı, ancak diğer kriterlere göre bu seçenek en uygunuydu.
API isteği (JSON) ⋅ API yanıtı ⋅ Haritada aç
Örnek 2
Kaynak veriler aynıdır, ancak cost.tonne_km
= 8’dir. Sonuç olarak, çözüm yüklenme dikkate alınarak optimize edilmiştir: en ağır sipariş önce boşaltılmıştır.
API isteği (JSON) ⋅ API yanıtı ⋅ Haritada aç
Gelişmiş ücret ayarları
Araç veya kuryenin ücreti aritmetik bir ifade olarak belirlenebilir. Planlama yaparken, ücreti vehicles.cost
alanında tek bir ifadeyle hesaplayabilir veya içe dahil edilmiş alanlarda birden fazla ifade kullanabilirsiniz:
cost.route
– rota için;cost.shift
– vardiya için;cost.run
– sefer için.
Uyarı
Eğer vehicle.cost
alanında formüller belirtilirse, algoritma yalnızca bu formülleri kullanarak araç veya kurye ücretini hesaplar. Bununla birlikte Standart ücret bileşenleri yalnızca formüllerde açıkça belirtilmişlerse hesaplamaya dahil edilirler.
İfade içinde aşağıdaki tablolarda verilen anahtar sözcükler ve matematiksel gösterimler kullanılabilir. HTTP isteği kullanarak ifadenin doğruluğu kontrol edilebilir.
Rota parametreleri için anahtar kelimeler
Grup |
Anahtar kelime ve açıklama |
Seferler |
|
Vardiyalar |
|
Siparişler |
|
Süre |
|
Mesafe |
Eğer araç için rotanın belirli bir noktanın yakınında bulunan siparişleri içerecek şekilde istenen çalışma bölgesi ayarlamak gerekiyorsa, |
Taşıma işi |
|
Duraklar |
|
Depolar |
|
Hareketin başlangıcı ve sonu |
|
Depodan veya depoya hareket |
Parametreler, Rotanın başlangıcı veya sonu depoya mümkün olduğunca yakın cezalarıyla aynı senaryoları uygulamak için kullanılır. |
Siparişler arasında hareket |
|
Siparişli ve siparişsiz hareket |
|
Kapasite |
|
Treyler |
|
Yaya rotaları |
|
Rota metrikleri aşağıdaki formüller kullanılarak hesaplanır:
- rotanın toplam süresi
transit_duration_h
=walking_transit_duration_h
+driving_transit_duration_h
; - rota toplam uzunluğu
distance_km
=walking_distance_km
+driving_distance_km
.
Yaya kısımları olan rotalarda kullanılan değişkenlerin hesaplanmasına taşıma şekli etki eder:
walking
– tüm rotaya yürüyerek işlenir, mesafedriving_distance_km
ve süredriving_transit_duration_h
0’dır;transit
:driving_distance_km
= 0 – kuryenin tüm siparişleri yürüyerek tamamladığı varsayılır (toplu taşıma ile kat edilen mesafeyi hesaplamak için yeterli veri yoktur);driving_transit_duration_h
Çözümleme sırasında elde edilen diğer veriler temelinde hesaplanır (sıfır olmayabilir).
Matematiksel gösterimi ve fonksiyonlar
Matematiksel gösterimler |
Açıklama |
Sayılar |
Tam sayılar (pozitif, negatif), rasyonel. Ondalık kesirler için ayırıcı olarak nokta kullanın. |
Aritmetik işlemler |
+, -, *, / |
Parantezler |
(…) |
Matematiksel fonksiyonlar |
|
Mantıksal fonksiyonlar |
|
Karşılaştırma işlemleri |
<, >, = |
Mantıksal işlemler |
|
Fonksiyonlar |
|
Fonksiyonların koşulları |
Aşağıdaki fonksiyonlar sadece
|
İfade örnekleri
500 + 500 * has_location(in_zone('West'))
– eğer rotadaWest
bölgesinde bir durak varsa, bu durumda 1000, aksi durumda ise 500 döner.450 * location_count(in_zone('West') | in_zone('North'))
– ifade, (West
,North
) iki bölgeden en az birine düşen durakların sayısını sayacak ve sayılarını 450 ile çarparak döndürecektir.1000 + has_location(in_zone('West') & has_load_type('Заморозка')) * 500
– rotada hemWest
bölgesinde olan hem deЗаморозка
yük türüne sahip en az bir durak varsa, ifade bu durumda cevap olarak 1500, aksi takdirde 1000 döndürür.100 * (has_location(in_zone('West')) & has_location(in_zone('North')))
– eğerWest
bölgesinde en az bir durak veNorth
bölgesinde en az bir durak varsa (her iki bölgede de bir durak veya iki farklı durak olabilir), cevap olarak 100 döner.100 * has_location(in_zone('West') & in_zone('North'))
– eğer her ikisiWest
veNorth
bölgesinde aynı anda kalan bir durak varsa, ifade cevap olarak 100 döndürür.100 * location_count(is_pickup() & in_zone('West') & !has_tag('Возврат'))
– ifade,West
bölgesinde bulunan ve etiketiВозврат
olmayanpickup
türündeki siparişlerin sayısını sayacak ve bunların sayısını 100 ile çarparak döndürecektir.
Çözüm metrikleri
Bir araç veya kurye için gelişmiş ücret ayarları ayarlanmışsa, çözüm metriklerinde aşağıdaki alanları görürsünüz:
run_custom_cost
–cost.run
için formüle göre bir seferin ücreti.shift_custom_cost
–cost.shift
için formüle göre bir vardiyanın ücreti. Sadece vardiyanın ilk seferinde görüntülenir.shift_total_custom_cost
– vardiyanın toplam ücreti. Formüle göre hesaplanan vardiya ücretini ve vardiyaya dahil olan tüm seferlerin ücretini içerir. Sadece vardiyanın ilk seferinde görüntülenir.route_custom_cost
–cost.route
için formüle göre rotanın ücreti. Yalnızca rotanın ilk seferinde görüntülenir.total_custom_cost
– formüle göre hesaplanan rota ücreti ve tüm vardiyaların ücreti dahil olmak üzere rotanın toplam ücreti. Sadece rotanın ilk seferinde gösterilir, diğer seferlerde 0 gösterilir.
Örnek 1
Görevde aşağıdaki ücretlendirme şeması kullanılmaktadır:
-
Bir çoklu sipariş’in temel ücreti 170 birimdir.
-
Çoklu siparişin ücreti her 100 kilometre için 20 birim artar.
-
Bir kurye, siparişler bu kadar fazla olmasa bile vardiya başına en az 4000 birim alır.
Bu tarifeye aşağıdaki ücret karşılık gelmektedir: 100 * duration_h + 8 * distance_km + max(4000, (170 + 20 * Floor(distance_km / 100)) * unique_stops)
.
Bu da araç kullanımı başına ücretin en az 4000
olmasını doğuruyor. Vardiya ödemesinin (veya tamamlanan siparişlerin) üzerindeki ücret, rotanın toplam süresine ve uzunluğuna bağlıdır.
API isteği (JSON) ⋅ API yanıtı ⋅ Haritada aç
Örnek 2
Ücretin kilometreye bağlı olduğu ve bir formülle belirlendiği varsayımı altında bir rota planlanması gerekiyor:
<araç fiyatı> = maksimum {<minimum rota maliyeti>, <güzergahtaki öğe sayısı> * <varış noktasına teslimat ücreti>}
Minimum rota ücreti ve noktadan noktaya teslimat ücreti tabloda gösterilmektedir:
Kat edilen mesafe |
Çoklu sipariş başına ücret (rub.) |
Rotanın minimum ücreti (rub.) |
En fazla 150 km |
510 |
6000 |
En fazla 450 km |
530 |
7000 |
En fazla 750 km |
550 |
8500 |
750 km üstü |
570 |
11.000 |
Böyle bir durumda planlama sırasında aracın ücreti aşağıdaki formül kullanılarak hesaplanır:
max(6000 + (distance_km > 150)*1000 + (distance_km > 450)*1500 + (distance_km > 750)*2500
, stops
*(510 + min(60, Ceil(max(0, distance_km - 150)/300)*20))
)
Hesaplama formülü hakkında daha fazla bilgi
- minimum rota ücreti:
6000 + (distance_km > 150)*1000 + (distance_km > 450)*1500 + (distance_km > 750)*2500
; - rota üzerindeki nokta sayısı
stops
parametresi yardımı ile belirlenmektedir; - bir noktaya teslimat ücreti – aşağıdaki şekilde belirlenir. Çoklu siparişin minimum ücreti –
510
, olası maksimum artış –570 - 510 = 60
. Daha da önemlisi, çoklu siparişin ücreti, kat edilen her 300 kilometre için 20’lik artışlarla eşit olarak artar – bu,Ceil(max(0, distance_km - 150)/300)*20
formül kullanılarak gösterilebilir. Böyle bir durumda tablodaki veriler dikkate alınarak noktaya teslimat ücreti510 + min(60, Ceil(max(0, distance_km - 150)/300)*20))
’e eşittir.
Sonuç olarak, araç 1’in rota uzunluğu 150 km’den fazladır, durak sayısı 18’dir (1 çoklu sipariş vardır). Toplam ücret 9540’tır. Araç 2’nin rota uzunluğu en fazla 150 kilometredir, durak sayısı – 21 (1 çoklu sipariş var). Toplam ücret 10.710’dur.
API isteği (JSON) ⋅ API yanıtı ⋅ Haritada aç
Örnek 3
Rotanıyı, aracın yetersiz doluluğunu en aza indirecek şekilde planlamak gerekir. Bu amaçla, belirli bir limitin altında kullanılması durumunda aracın ek ücreti formülde belirtilebilir. Örneğin, 3000 kg taşıma kapasitesine sahip araçlar planlanırken, bunların en az %80 oranında yüklenmesi gerekmektedir. Bununla birlikte, ücretin geri kalanının (saat başına, km başına, kullanım başına) varsayılan olacağını öngörüyoruz. Böyle durumda aracın ücreti aşağıdaki formül kullanılarak hesaplanır:
3000 + duration_h*100 + distance_km*8 + max(0, 2400 - utilization_kg) * 100
Hesaplama formülü hakkında daha fazla bilgi
İlk üç toplamdaki 3000, 100, 8 sırasıyla kullanım başına, saat başına ve kilometre başına ücretin varsayılan değerleridir. Formülle, 2400’den düşük kilo durumunda her kilogram için 100 birimlik bir ücret eklenir: <nominal yük kapasitesi> * <minimum kullanım eşiği> = 3000 * %80 = 2400.
Sonuç olarak, algoritma tüm araçları en az %80 oranında (mümkünse) yüklemeyi hedefleyecektir.
API isteği (JSON) ⋅ API yanıtı ⋅ Haritada aç
Örnek 4
Bazı perakende zincirlerinin daha erken başlaması koşuluyla rotanın planlanması gerekir. Görevde aşağıdaki ücretlendirme şeması kullanılmaktadır:
-
Rotanın temel ücreti, harcanan zamana ve kat edilen mesafeye dayanmaktadır.
-
Sabah trafik sıkışıklığından kaçınmak için rotalara erken başlanması tavsiye edilir. Bunu yapmak için, ücret formülüne sabah 8’den sonra çıkış cezası eklenir.
Bu tarifeye aşağıdaki ücret karşılık gelmektedir:
100 * duration_h + 8 * distance_km + 50 * (start_route_time_s > 28800)
Planlama sonucunda, tüm araçlar sabah 8’den önce depoya gelmektedir.
API isteği (JSON) ⋅ API yanıtı ⋅ Haritada aç
Kuryeye yapılacak ödemenin hesaplanması
Rotayı tamamlama karşılığında kuryeye ne kadar ödeme yapılacağını hesaplamak için. Planlama yaparken, ödemeleri vehicle.payout
alanında tek bir ifade ile hesaplayabilir veya bunun için iç içe geçmiş alanlarda birden fazla ifade kullanabilirsiniz:
payout.route
– rota için;payout.shift
– vardiya için;payout.run
– sefer için.
İfadelerde şirket için rota ücreti (alan vehicle.cost
) hesaplamasında kullanılan anahtar kelimeler ve matematiksel gösterimler kullanılabilir.
Not
vehicle.payout
alanı rota optimizasyonunu etkilememekte, planlama problemi çözüldükten sonra hesaplanır.
Kurye için vehicle.payout
alanı belirlendiyse, çözüm metriklerinde aşağıdaki alanları görürsünüz:
run_payout
–payout.run
için formüle göre sefer başına ödeme.shift_payout
–payout.shift
için formüle göre vardiya başına ödeme. Sadece vardiyanın ilk seferinde görüntülenir.shift_total_payout
– vardiya başına toplam ödeme. Formüle göre hesaplanan vardiya ücretini ve vardiyaya dahil olan tüm seferler için ödemeyi içerir. Sadece vardiyanın ilk seferinde görüntülenir.route_payout
–payout.route
için formüle göre rota ödemesi. Yalnızca rotanın ilk seferinde görüntülenir.total_payout
– formüle göre hesaplanan rota ödemesi ve tüm vardiyalar için ödeme dahil olmak üzere tam rota ödemesi. Sadece rotanın ilk seferinde gösterilir, diğer seferlerde 0 gösterilir.
Eğer en az bir kurye için payout
alanı ayarlanmışsa, planlama sonuçlarınde aşağıdaki metrik ayrıca yer alır: total_payout
– kuryelere yapılan toplam ödeme.
Örnek 1
İki kurye 40 siparişi teslim ediyor, her kurye 2 sefer yapıyor. Şirket için kuryelerin ücreti cost
alanda ifade ile belirtilir. Kurye 1 için, tamamlanan rota için ödeme tutarı payout
alanındaki ifade kullanılarak hesaplanır, bu tutar ilk seferin metriklerinde görüntülenir ve 5000 birimdir. Kurye 2 için herhangi bir ödeme tutarı hesaplanmaz, bu nedenle toplam ödeme tutarı total_payout
aynı şekilde 5000 birim etmektedir.
API isteği (JSON) ⋅ API yanıtı ⋅ Haritada aç
Örnek 2
İki kurye 40 siparişi teslim dağıtıyor. Kurye 1 için aşağıdaki şekilde ödeme hesaplaması belirlenmiştir: kurye her vardiya için 3000 birim, her kilometre yol için 10 birim ve teslim edilen her sipariş için 50 birim alıyor. Eğer bir vardiyada 10’dan fazla sipariş teslim ederse, 500 birim ikramiye alır. Kurye 2 için ödeme tutarı hesaplanmıyor.
Planlama sonucunda, kurye 1 2 sefer yapıyor ve 20 sipariş teslim ediyor. Her bir sefer için ona tahakkuk eden run_payout
– 1232 ve 1053 birim, vardiya başına shift_total_payout
– 2785 birim (500 birim shift_payout
bonus dahil) ve rota başına route_payout
– 3000 birim. Kuryeye toplam total_payout
5785 birim tahakkuk etmiştir.
API isteği (JSON) ⋅ API yanıtı ⋅ Haritada aç