hov_penalty, use min penalty rather than aggregate

This commit is contained in:
karenzshea 2017-02-06 19:18:00 +01:00 committed by Patrick Niklaus
parent 25ab51f4f0
commit 24fe881d03
4 changed files with 29 additions and 17 deletions

View File

@ -6,7 +6,7 @@ OSRM will use 4/5 of the projected free-flow speed.
Given the profile "car" Given the profile "car"
Given a grid size of 1000 meters Given a grid size of 1000 meters
Scenario: Car - Respect maxspeeds when lower that way type speed Scenario: Car - Respect maxspeeds when lower than way type speed
Given the node map Given the node map
""" """
a b c d e f g a b c d e f g
@ -23,7 +23,7 @@ OSRM will use 4/5 of the projected free-flow speed.
When I route I should get When I route I should get
| from | to | route | speed | | from | to | route | speed |
| a | b | ab,ab | 68 km/h | | a | b | ab,ab | 85 km/h |
| b | c | bc,bc | 48 km/h | | b | c | bc,bc | 48 km/h |
| c | d | cd,cd | 40 km/h | | c | d | cd,cd | 40 km/h |
| d | e | de,de | 64 km/h | | d | e | de,de | 64 km/h |

View File

@ -80,6 +80,12 @@ Feature: Traffic - turn penalties
8,11,12,23 8,11,12,23
1,4,5,-0.2 1,4,5,-0.2
""" """
# ifg right turn
# imn left turn
# hdc left turn
# lkh right turn
# hkl left turn
# ade left turn
And the contract extra arguments "--turn-penalty-file {penalties_file}" And the contract extra arguments "--turn-penalty-file {penalties_file}"
When I route I should get When I route I should get
| from | to | route | speed | time | | from | to | route | speed | time |

View File

@ -117,7 +117,7 @@ local profile = {
unclassified = 25, unclassified = 25,
residential = 25, residential = 25,
living_street = 10, living_street = 10,
service = 15, service = 15
} }
}, },
@ -126,7 +126,8 @@ local profile = {
parking = 0.5, parking = 0.5,
parking_aisle = 0.5, parking_aisle = 0.5,
driveway = 0.5, driveway = 0.5,
["drive-through"] = 0.5 ["drive-through"] = 0.5,
["drive-thru"] = 0.5
}, },
route_speeds = { route_speeds = {

View File

@ -170,20 +170,14 @@ end
-- handle high occupancy vehicle tags -- handle high occupancy vehicle tags
function Handlers.handle_hov(way,result,data,profile) function Handlers.handle_hov(way,result,data,profile)
-- respect user-preference for HOV -- respect user-preference for HOV
if not profile.avoid.hov_lanes then if not profile.avoid.hov_lanes or properties.weight_name ~= 'routability' then
return return
end end
-- check if way is hov only
local hov = way:get_value_by_key("hov")
if "designated" == hov then
return false
end
-- check if all lanes are hov only -- check if all lanes are hov only
local hov_lanes_forward, hov_lanes_backward = Tags.get_forward_backward_by_key(way,data,'hov:lanes') data.hov_lanes_forward, data.hov_lanes_backward = Tags.get_forward_backward_by_key(way,data,'hov:lanes')
local inaccessible_forward = Handlers.has_all_designated_hov_lanes(hov_lanes_forward) local inaccessible_forward = Handlers.has_all_designated_hov_lanes(data.hov_lanes_forward)
local inaccessible_backward = Handlers.has_all_designated_hov_lanes(hov_lanes_backward) local inaccessible_backward = Handlers.has_all_designated_hov_lanes(data.hov_lanes_backward)
if inaccessible_forward then if inaccessible_forward then
result.forward_mode = mode.inaccessible result.forward_mode = mode.inaccessible
@ -269,10 +263,21 @@ end
-- scale speeds to get better average driving times -- scale speeds to get better average driving times
function Handlers.handle_penalties(way,result,data,profile) function Handlers.handle_penalties(way,result,data,profile)
-- heavily penalize a way tagged with all HOV lanes
-- in order to only route over them if there is no other option
local hov_penalty = 0.1
if profile.avoid.hov_lanes then
local hov = way:get_value_by_key("hov")
local all_lanes_designated = Handlers.has_all_designated_hov_lanes(data.hov_lanes_forward)
if "designated" == hov or all_lanes_designated then
hov_penalty = 0.1
end
end
local service_penalty = 1.0 local service_penalty = 1.0
local service = way:get_value_by_key("service") local service = way:get_value_by_key("service")
if service and service_penalties[service] then if service and profile.service_penalties[service] then
service_penalty = service_penalties[service] service_penalty = profile.service_penalties[service]
end end
local width_penalty = 1.0 local width_penalty = 1.0
@ -308,7 +313,7 @@ function Handlers.handle_penalties(way,result,data,profile)
sideroad_penalty = side_road_multiplier; sideroad_penalty = side_road_multiplier;
end end
local penalty = service_penalty * width_penalty * alternating_penalty * sideroad_penalty local penalty = math.min(service_penalty, width_penalty, alternating_penalty, sideroad_penalty, hov_penalty)
if properties.weight_name == 'routability' then if properties.weight_name == 'routability' then
if result.forward_speed > 0 then if result.forward_speed > 0 then