적재 비용은 배송 수령과 배송 사이에 차량이 운반하는 적재량에 따라 발생하는 비용 또는 페널티를 지정합니다. costPerKilometer를 사용한 이동 거리, costPerTraveledHour를 사용한 이동 시간 또는 둘 다를 동시에 기준으로 이러한 비용을 구성할 수 있습니다.
다음과 같은 목표를 지원하도록 로드 비용을 구성합니다.
- 화물 중량에 따라 증가하는 연료비를 고려합니다.
- 과부하된 차량이 장거리를 이동하지 않도록 경로를 지정합니다.
- 무거운 화물로 인한 차량 마모를 고려합니다.
속성
Vehicle의 loadLimits 속성 내에서 로드 비용을 지정합니다.
다른 모든 비용 매개변수와 마찬가지로 로드 비용은 차원이 없는 상대 비용 단위를 사용합니다.
다음 속성을 사용하여 로드 비용을 정의할 수 있습니다.
| 속성 | 유형 | 설명 |
|---|---|---|
costPerKilometer |
객체 | 이동한 킬로미터를 기준으로 이동 비용을 계산하는 LoadCost 객체 유형이 포함되어 있습니다. |
costPerTraveledHour |
객체 | 대기 시간, 방문 시간, 휴식 시간을 제외한 이동 시간을 기준으로 이동 비용을 계산하는 LoadCost 객체 유형이 포함됩니다. |
LoadCost
LoadCost 메시지 유형은 특정 화물을 운반하는 데 드는 이동 비용을 정의합니다. 부하 기준점을 설정한 다음 해당 기준점 미만 및 초과에 대해 부하 단위당 서로 다른 비용 요율을 지정할 수 있습니다.
LoadCost 객체에는 다음 구성 매개변수가 포함됩니다.
| 매개변수 | 유형 | 설명 |
|---|---|---|
loadThreshold |
문자열 (int64 형식) | 비용 계산 비율이 변경되는 부하 수준입니다. 기본값은 0입니다. |
costPerUnitAboveThreshold |
숫자 | loadThreshold을 초과하는 각 부하 단위에 적용되는 비용입니다. 기본값은 0입니다. |
costPerUnitBelowThreshold |
숫자 | loadThreshold 이하의 각 부하 단위에 적용되는 비용입니다. 기본값은 0입니다. |
적재 비용과 배송 매칭
차량의 운반 하중이 경로의 loadDemands 유형의 배송과 일치하는 경우 적재 비용이 적용됩니다. 부하 유형은 무게나 볼륨과 같은 임의의 문자열입니다. 부하 유형 구성에 대한 자세한 내용은 부하 유형을 참고하세요.
예
이 섹션에서는 세 가지 유형의 예시를 다룹니다.
- 로드 비용의 구조를 보여주는 코드 샘플
- 비즈니스 목표를 달성하기 위해 로드 비용을 사용하는 한 가지 방법을 보여주는 시나리오 예시
- 예시 시나리오에 설정된 값이 포함된 요청 예시
코드 샘플
다음 예에서는 사용 가능한 모든 구성 매개변수를 사용하여 로드 비용을 구조화하는 방법을 보여줍니다. 이 샘플에서는 costPerKilometer를 사용하지만 costPerTraveledHour로 대체하여 거리가 아닌 이동 시간을 기준으로 비용을 계산할 수 있습니다.
{
"model": {
"vehicles": [{
"loadLimits": {
"LOAD_TYPE": {
"maxLoad": "MAX_LOAD",
"costPerKilometer": {
"loadThreshold": "LOAD_THRESHOLD",
"costPerUnitAboveThreshold": COST_ABOVE,
"costPerUnitBelowThreshold": COST_BELOW
}
}
}
}]
}
}
예시 시나리오
이 섹션에서는 연료 소비를 최적화하려는 시나리오를 설명하며, 연료 소비는 거리와 화물 중량에 비례합니다. 차량은 무거운 짐을 운반할 때 더 많은 연료를 소비하므로 무거운 패키지를 먼저 배송하는 경로를 계획하는 것이 좋습니다.
이 동작을 설정하려면 무거운 화물을 싣고 장거리를 이동하는 차량에 불이익을 주는 요청을 구성하면 됩니다. 이 예시에서는 요청에 다음 속성 값을 사용합니다.
| 부모 | 속성 | 유형 | 값 | 시나리오 |
|---|---|---|---|---|
loadLimits |
로드 유형 | 문자열 | weightKg |
추적할 용량의 유형을 정의합니다. 이 예시에서는 weightKg을 사용하여 화물 무게를 킬로그램으로 나타냅니다. |
loadLimits |
maxLoad |
문자열 | 100 |
차량이 운반할 수 있는 최대 화물 중량입니다. |
costPerKilometer |
loadThreshold |
문자열 | 15 |
기준 부하 기준점을 설정합니다. 화물 무게가 15kg을 초과하면 무게 기반 연료비 페널티가 부과됩니다. |
costPerKilometer |
costPerUnitAboveThreshold |
숫자 | 1 |
연료비 계수 역할을 합니다. 이동한 모든 킬로미터에 대해 15kg 기준점을 초과하는 화물 1kg당 비용 단위 1개가 발생합니다. |
loadDemands |
amount |
문자열 | 배송 1: 50배송 2: 10배송 3: 80 |
세 번의 배송 각각의 화물 중량을 지정합니다. |
이 시나리오에서 구성된 값은 다음과 같은 영향을 미칩니다.
- 최적화 도구는 가장 무거운 상품을 먼저 배송하도록 경로를 정렬합니다. 솔버는 중량이 많이 나가는 동안 이동하는 거리를 최소화하기 위해 경로 시작 부분에 80kg 및 50kg 배송을 예약합니다.
- 옵티마이저는 무거운 화물을 운반하는 이동 거리를 최소화하도록 경로를 정렬합니다. 이러한 설정이 경로에 미치는 영향을 확인하려면
costPerUnitAboveThreshold을1에서5로 늘리면 됩니다. 가중치 페널티를 높이면 최적화 프로그램이 무거운 화물을 운반하는 이동 거리를 최소화하기 위해 더 열심히 노력하도록 유도할 수 있으며, 이로 인해 하차 순서가 변경되거나 배송이 여러 차량으로 분할될 수 있습니다.
요청 예
다음 예는 예시 시나리오의 로드 비용 값을 통합한 기본 optimizeTours 요청의 구조를 보여줍니다.
{ "model": { "shipments": [ { "deliveries": [ { "arrivalLocation": { "latitude": 37.789456, "longitude": -122.390192 }, "duration": "250s" } ], "penaltyCost": 100.0, "loadDemands": { "weightKg": { "amount": "50" } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.789116, "longitude": -122.395080 }, "duration": "250s" } ], "penaltyCost": 30.0, "loadDemands": { "weightKg": { "amount": "10" } } }, { "deliveries": [ { "arrivalLocation": { "latitude": 37.795242, "longitude": -122.399347 }, "duration": "250s" } ], "penaltyCost": 50.0, "loadDemands": { "weightKg": { "amount": "80" } } } ], "vehicles": [ { "endLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "startLocation": { "latitude": 37.794465, "longitude": -122.394839 }, "costPerHour": 40.0, "costPerKilometer": 10.0, "loadLimits": { "weightKg": { "maxLoad": "100", "costPerKilometer": { "loadThreshold": "15", "costPerUnitAboveThreshold": 1 } } } } ] } }
계산 공식
옵티마이저는 다음 공식을 사용하여 부하 비용을 계산합니다.
전체 기준점 계산
costPerUnitAboveThreshold와 costPerUnitBelowThreshold을 모두 지정하면 loadThreshold보다 크거나 작은 로드 양에 대해 별도의 이동 비용이 발생합니다. 공식은 다음과 같습니다.
cost = max(carried_load - load_threshold, 0) * distance_or_time * cost_per_unit_above_threshold
+ min(carried_load, load_threshold) * distance_or_time * cost_per_unit_below_threshold
예를 들어 요청 예의 값을 사용하고 costPerUnitBelowThreshold 값이 2인 경우 차량이 50의 하중을 싣고 10km를 이동하면 다음과 같이 계산됩니다.
max(50 - 15, 0) * 10 * 1 + min(50, 15) * 10 * 2 = 650 cost units
기준액 초과 계산
costPerUnitAboveThreshold만 지정하면 계산은 전체 기준점 공식의 특수한 사례가 됩니다. 기준점 미만의 비용은 0이므로 전체 수식의 후반부는 0으로 평가됩니다. 공식은 다음과 같습니다.
cost = max(carried_load - load_threshold, 0) * distance_or_time * cost_per_unit_above_threshold
예를 들어 loadThreshold이 15이고 costPerUnitAboveThreshold이 1인 요청 예시의 값을 사용하는 경우 차량이 50의 하중을 싣고 10km를 이동하면 계산은 다음과 같습니다.
max(50 - 15, 0) * 10 * 1 = 350 cost units
기준 미만 계산
대칭적으로 costPerUnitBelowThreshold만 지정하면 기준점 위의 비용이 0인 전체 기준점 공식의 또 다른 특수한 경우가 계산됩니다. 공식은 다음과 같습니다.
cost = min(carried_load, load_threshold) * distance_or_time * cost_per_unit_below_threshold