Consumer Vehicle Choice Model

Consumer Vehicle Choice Model  preview image

1 collaborator

Default-person Kalai Ramea (Author)

Tags

consumer behaviorJ 

Tagged by Kalai Ramea 10 months ago

infrastructure analysis 

Tagged by Kalai Ramea 10 months ago

vehicle choice 

Tagged by Kalai Ramea 10 months ago

Visible to everyone | Changeable by the author
Model was written in NetLogo 5.3.1 • Viewed 286 times • Downloaded 25 times • Run 0 times
Download the 'Consumer Vehicle Choice Model ' modelDownload this modelEmbed this model

Do you have questions or comments about this model? Ask them here! (You'll first need to log in.)


WHAT IS IT?

This model predicts the average annual purchase probability of the population of three different vehicle technologies: gasoline cars, battery electric vehicles, and fuel cell vehicles, based on their consumer demographic attributes, infrastructure availability and driving behavior.

The model consists of a neighborhood with houses, workplaces and public places. Each house has a vehicle. Each vehicle has a work location, and a few public locations assigned to the household. Each tick is a day. Every day, the vehicle goes from home to work; and from work, there are options on how the vehicle gets back home. They can get back directly home from work, or they can visit one/two public locations before getting back home.

Each house/workplace/public location have charging infrastructure randomly assigned based on input. The hydrogen stations are also located per input. The user can also assign these locations interactively.

For each vehicle, the model assigns the following costs for three vehicle technologies (conventional gasoline vehicle, Battery electric vehicle, and Fuel cell vehicle):

  • Fuel cost (based on their travel distance every day)
  • Income-related disutility costs (ratio of vehicle price/income--higher income households are less sensitive to vehicle prices)
  • Range anxiety cost (if not enough recharging infrastructure is available)
  • Refueling cost (for fuel cell vehicles, if not enough hydrogen stations are available)
  • Neighborhood effect (if the neighbors in a 5-mile radius have higher threshold of BEVs/FCVs, then there is an utility added, i.e. negative cost)

Then, these costs are summed up for each vehicle technology for each car in the model. A simple multinomial logit approach is then used to estimate the purchase probability of the vehicle technology for that household.

Purchase probability of X = Exp ( X ) / Sum [ Exp ( X ) + Exp ( Y ) + Exp ( Z ) ]

The model then reports the mean purchase probability of these vehicle technologies in the neighborhood.

These inputs interact to provide the final purchase probability of the consumer. The link distance for example, plays an important role in increasing or decreasing the range anxiety cost and refueling cost. Neighborhood effect is also computed with time. The final outcome is the purchase probability at the end of the year.

HOW IT WORKS

Initialize (SETUP):

  • num-population: Choose the number of population in the city. This will create a group of houses (with one car each).

  • The 'share-workplaces' variable creates the workplaces in the city as a percentage share of the total population. The model also creates a certain public locations (these could be grocery stores, day care centers, etc.) as some share of population.

  • homecharge-share and workcharge-share variables assigns the charger availability at home and work. For example, 0.5 value of homecharge-share assigns 50% of houses with home charging availability.

  • The user can include the number of public chargers available in the city by choosing the number of public-chargingstations. This will randomly choose some public locations to have chargers.

  • h2-stations variable randomly assigns certain patches to be hydrogen stations.

  • place-chargers and place-h2stations are interactive buttons that allows the user to place stations or chargers at certain locations instead of letting the model choose the locations randomly.

  • the income 'sliders' allows the user to choose the share of income levels in the city. The sum of all these shares add up to 1.

  • the neighborhood-effect chooser allows the user the determine the purchase probability with or without the neighbor effect of vehicle purchases.

We reset the ticks.

At setup, every car is assigned a house and a workplace. Links are generated from home to the workplace, and 2 other public locations.

Based on the income distribution (and the vehicle prices--harcoded in the model), the model predetermines the 'purchase probability' of each vehicle type. These will be refined as the model runs, as it starts including other parameters in the purchase probability estimation.

Iterative/Tick (GO):

Each tick acts as a 'day'.

Each day, the consumer drives from home to work first. Then, from work, the consumer has options.

  • They can go home.
  • They can visit a public location (grocery / day care) and drive home from there.
  • They can visit 2 public locations and drive home from there.

The model randomly chooses these decisions for the consumers.

At each tick, the consumers drive from home to work, and visit other places (optionally) and drive back home. The model runs for 365 ticks (365 days).

The distance between these places are used for calculating the fuel cost for each type of vehicle.

The distances also determine the 'range limitation' for electric vehicles depending on their charger availability. If the consumers have chargers available at home, work and public places they visit, then they do not incur any penalty. If not, depending on the distance, they incur penalty for the electric vehicles.

Same strategy is used for hydrogen vehicles. If they have a hydrogen station in a 5-mile radius of the locations they visit, then they do not incur any penalty. Else, there is a penalty for fuel cell vehicles.

The neighborhood effect estimates the share of alternative fueled vehicles in the 5-mile radius of the consumer. If it exceeds 50%, it assigns a small utility to the consumer for the respective vehicle.

Model core

The model assigns penalties and preference points to each vehicle technology based on their characteristics. Then, these points are sent to a multinomial logit model to predict the purchase probabilities.

'WIPE' button:

WIPE button has to be used carefully. This is disabled before the first run. Once, the model finishes the first run (365 ticks), the user can click on 'WIPE' to restore the utilities, clear plots. This retains the same network.

Then the user can choose to 'place' stations or charger, or turn on/off the neighborhood effect to observe the change in purchase probabilities of these parameters in the same network.

DO NOT use the WIPE button before the model finishes its first run. If it throws any error, then it means, it was invoked wrongly (or the previous run was incomplete), so please restart the model. Do not change any other network related parameters while using this button. It will not have any effect.

HOW TO USE IT

Use SETUP options to initialize the network. GO button runs the model and stops after 365 ticks (days). WIPE can be used optionally to see if changes in any of these parameters (neighborhood-effect, place-h2stations, or place-chargers) have any effect on the outcome.

THINGS TO NOTICE

The model mainly predicts and plots the average purchase probability of vehicle technologies of the population in this city. See the monitor and the plot to observe how the daily variation in driving distances can influence the purchase probabilities.

THINGS TO TRY

There are several things that can be tried with this model:

  • Different population densities (num-population)

  • Turn on/off the neighborhood effect (optionally after WIPE to see the effect on the same network)

  • Different shares of home or work recharger availability

  • Different public charger and hydrogen station availability

  • Interactive public charger and hydrogen station locations (optionally after WIPE to see the effect on the same network)

  • Different income distribution

EXTENDING THE MODEL

  • Include weekday/weekend distinction
  • Different population having different VMT distribution rather than model choosing the links randomly

RELATED MODELS

Uri Wilensky's one turtle per patch model was used to initialize locations, and car per household.

The Link-Walking turtles model from the library was used to imitate the links between the locations, on how cars travel between them.

CREDITS AND REFERENCES

The 'disutility cost' related to consumer purchase behavior is taken from US Department of Energy report "Non-Cost Barriers to Consumer Adoption of New Light-Duty Vehicle Technologies": http://www.nrel.gov/docs/fy13osti/55639.pdf

COPYRIGHT

This model is developed by Kalai Ramea (2016). For any questions, please contact kalai.ramea@gmail.com.

Comments and Questions

Please start the discussion about this model! (You'll first need to log in.)

Click to Run Model

;; This model runs the network of houses, workplaces and public locations in a neighborhood
;; and finds the average purchase probability of three vehicle technologies in the population

;; Different breeds of turtles are initialized to keep track of various locations and objects in the model
;; Vehicles move from one location to another and they also have their own variables which is used to calculate
;; the purchase probability of vehicle technologies
breed [ houses house]
breed [ works work]
breed [ place2s place2 ]
breed [ place3s place3 ]
breed [ place4s place4 ]
breed [vehicles vehicle]
patches-own [hcharge? wcharge? pcharge? h2? ] ;; each patch location stores recharge variables and hydrogen station location variables
vehicles-own [homelocation wlocation range income bevdisutil convdisutil fcvdisutil fcvrange]
globals [dist] ;; this global variable stores the link distances during calculation


;; the setup procedure initializes the locations, vehicles and attributes
;; one household has one vehicle, and there is only one turtle per patch

to setup
  clear-all

  ask patches [ set pcolor white ] ;; blank background

  ;; patches are colored differently to make sure there is only one type of location per patch and not duplicated
  ask n-of (num-population + 50) patches [ set pcolor 8 ]
  ask n-of ((share-workplaces * num-population) + 10) patches [ set pcolor 9 ]
  ask n-of ( (num-population * 0.1 + public-chargingstations) + 10 ) patches [ set pcolor 9.5 ]
  ask n-of ( (num-population * 0.1 + public-chargingstations) + 10) patches [ set pcolor 9.6 ]
  ask n-of ((num-population * 0.1 + public-chargingstations) + 10) patches [ set pcolor 9.7 ]

  ask n-of (num-population) patches with [pcolor = 8 ][sprout-houses 1 [
     set color red
     set shape "house"]
  ]
  ask n-of (num-population ) patches with [pcolor = 8 and any? other houses-here][sprout-vehicles 1 [
     set color yellow
     ask vehicles with [any? houses-here] [set homelocation one-of houses-here] ;; the vehicle chooses the homelocation here
     set shape "car"]
  ]
  ask n-of (share-workplaces * num-population) patches with [pcolor = 9 and not any? other works-here][sprout-works 1 [
     set color blue
     set shape "triangle"]
  ]

  ask n-of ((num-population * 0.1) + public-chargingstations) patches with [pcolor = 9.5 and not any? other place2s-here][sprout-place2s 1 [
     set color 25
     set shape "triangle"]
  ]

  ask n-of ((num-population * 0.1) + public-chargingstations) patches with [pcolor = 9.6 and not any? other place3s-here][sprout-place3s 1 [
     set color 26
     set shape "triangle"]
  ]

  ask n-of ((num-population * 0.1) + public-chargingstations) patches with [pcolor = 9.7 and not any? other place4s-here][sprout-place4s 1 [
     set color 27
     set shape "triangle"]
  ]

  ask n-of (num-population * homecharge-share) patches with [pcolor = 8 and any? houses-here] [ set hcharge? 1]
  ask n-of (num-population * (1 - homecharge-share)) patches with [pcolor = 8 and any? houses-here] [ set hcharge? 0]

  ask n-of (num-population * share-workplaces * workcharge-share) patches with [pcolor = 9 and any? works-here] [ set wcharge? 1]
  ask n-of (num-population * share-workplaces * (1 - workcharge-share)) patches with [pcolor = 9 and any? works-here] [ set wcharge? 0]

  ask n-of (public-chargingstations * 0.3) patches with [pcolor = 9.5 and any? place2s-here] [ set pcharge? 1 set pcolor violet]

  ask n-of (public-chargingstations * 0.3) patches with [pcolor = 9.6 and any? place3s-here] [ set pcharge? 1 set pcolor violet]

  ask n-of (public-chargingstations * 0.3) patches with [pcolor = 9.7 and any? place4s-here] [ set pcharge? 1 set pcolor violet]

  ask n-of (h2-stations) patches with [pcolor = white] [ set h2? 1 set pcolor 67]

  ;; the following routine creates links between houses and workplaces and other public locations
  ask  houses
  [
    If any? works [ create-link-with one-of works ]
    if any? place2s [ create-link-with one-of place2s ]
    if any? place3s [ create-link-with one-of place3s ]
    if any? place4s [ create-link-with one-of place4s ]
  ]

  ask vehicles [
    if any? patches with [hcharge? = 1] [ set range range + 42] ;; if the house has recharging availability, 42 miles are added here
    ;; the 42 electric mile range comes from 8 hours of recharging * 6 kW power
    ]

  ask vehicles [set wlocation one-of [link-neighbors with [color = blue]] of homelocation] ;; vehicle chooses the worklocation here

  ask patches with [pcolor != violet  and pcolor != 67 ] [set pcolor white]

  ask links [ set color 9.3]

  ask vehicles [
    if (count other patches with [pcolor = 67] in-radius 5  > 0 )[ set fcvrange fcvrange + 250]
    ;; if there is hydrogen station available, the model adds 250 miles to the vehicle range
    ]

  ;; based on the input shares, income categories are created
  ;; the vehicle price / income share is used to add the various disutility levels
  ;; These are 2016 vehicle prices from Department of Energy
  ;; Gasoline vehicle price = $20,280
  ;; Battery electric vehicle price = $31,086
  ;; Fuel cell vehicle price = $33,252
  ask n-of (num-population *  income-morethan125K )  vehicles  [
    set bevdisutil  ( 31086 / 125000 ) * 2500  ; vehicle price / income
    set fcvdisutil  ( 33252 / 125000 ) * 2500
    set convdisutil  ( 20280 / 125000 ) * 2500
    set income 125000
     ] ; high-income
  ask n-of (num-population *  income-75to125K ) vehicles with [income = 0 ] [
    set bevdisutil  ( 31086 / 100000 ) * 2500
    set fcvdisutil  ( 33252 / 100000 ) * 2500
    set convdisutil  ( 20280 / 100000 ) * 2500
    set income 100000
     ] ; upper-med-income
  ask n-of (num-population *  income-30to75K ) vehicles with [ income = 0 ] [
    set bevdisutil  ( 31086 / 50000 ) * 2500
    set fcvdisutil  ( 33252 / 50000 ) * 2500
    set convdisutil  ( 20280 / 50000 ) * 2500
    set income 50000
     ] ; lower-med-income

 ask n-of (num-population *  income-lessthan30K ) vehicles with [ income = 0 ]  [
    set bevdisutil  ( 31086 / 25000 ) * 2500
    set fcvdisutil  ( 33252 / 25000 ) * 2500
    set convdisutil  ( 20280 / 25000 ) * 2500
    set income 25000
     ] ; lower-income

  reset-ticks
end 

;; This routine retains the link network
;; and restores the utility levels back to the start of the run

to wipe
  reset-ticks
  clear-plot
  ask vehicles [
    move-to homelocation
     if (count other patches with [pcolor = 67] in-radius 5  > 0 )[ set fcvrange 250]
     if any? patches with [hcharge? = 1] [ set range 42]
     set bevdisutil  ( 31086 / income ) * 2500
     set fcvdisutil  ( 33252 / income ) * 2500
     set convdisutil  ( 20280 / income ) * 2500
    ]
end 


;; the go procedure moves the vehicle from one location to another
;; and calculates the distance related disutility costs along the way

to go

  if ticks >= 365 [ stop ]

  ask links [ set thickness 0 ]

  ask vehicles [
    let worklocation wlocation
    ask [link-with worklocation] of homelocation [
      set thickness 0.3
      set dist link-length
      ]
    face worklocation  ;; not strictly necessary, but improves the visuals a bit
    move-to worklocation

    ; Gasoline price is about $3.37/gal, mileage of a car is 20 mpg on avg
    ; so $/mile is 3.37 * 0.0532  = 0.179
    set convdisutil convdisutil + ( 0.179 * dist )

    ; Electricity pricing is $0.0841 / kwh, eff of BEV is 0.239 kWh/mile
    ; $/mile is 0.0841 * 0.239 = 0.02
    set bevdisutil bevdisutil + ( 0.02 * dist )

    ; Hydrogen price is $4.38 / gge, eff is 0.027 gpm
    ; $/mile is 4.38 * 0.027 = 0.12
    set fcvdisutil fcvdisutil + ( 0.12 * dist )

    set range range - dist
    set fcvrange fcvrange - dist
    if any? patches with [wcharge? = 1] [ set range range + 24]
    if any? patches with [pcolor = 67 ] in-radius 5 [ set fcvrange fcvrange + 250]

  ]

  ask vehicles [

    let new-location one-of [link-neighbors] of homelocation
    ask [link-with new-location] of homelocation [
      set thickness 0.3
      set dist link-length
      ]
    face new-location  ;; not strictly necessary, but improves the visuals a bit
    move-to new-location

    ; Gasoline price is about $3.37/gal, mileage of a car is 20 mpg on avg
    ; so $/mile is 3.37 * 0.0532  = 0.179
    set convdisutil convdisutil + ( 0.179 * dist )

    ; Electricity pricing is $0.0841 / kwh, eff of BEV is 0.239 kWh/mile
    ; $/mile is 0.0841 * 0.239 = 0.02
    set bevdisutil bevdisutil + ( 0.02 * dist )

    ; Hydrogen price is $4.38 / gge, eff is 0.027 gpm
    ; $/mile is 4.38 * 0.027 = 0.12
    set fcvdisutil fcvdisutil + ( 0.12 * dist )

    set range range - dist
    set fcvrange fcvrange - dist
    if any? patches with [pcharge? = 1] [ set range range + 12]
    if (count other patches with [pcolor = 67 ] in-radius 5 > 0) [ set fcvrange fcvrange + 250]
  ]


  ask vehicles [
    let new-location one-of [link-neighbors] of homelocation

    ask [link-with new-location] of homelocation [
      set thickness 0.3
      set dist link-length
      ]
    face new-location  ;; not strictly necessary, but improves the visuals a bit
    move-to new-location

    ; Gasoline price is about $3.37/gal, mileage of a car is 20 mpg on avg
    ; so $/mile is 3.37 * 0.0532  = 0.179
    set convdisutil convdisutil + ( 0.179 * dist )

    ; Electricity pricing is $0.0841 / kwh, eff of BEV is 0.239 kWh/mile
    ; $/mile is 0.0841 * 0.239 = 0.02
    set bevdisutil bevdisutil + ( 0.02 * dist )

    ; Hydrogen price is $4.38 / gge, eff is 0.027 gpm
    ; $/mile is 4.38 * 0.027 = 0.12
    set fcvdisutil fcvdisutil + ( 0.12 * dist )

    set range range - dist
    set fcvrange fcvrange - dist
    if any? patches with [wcharge? = 1] [ set range range + 12]
    if (count other patches with [pcolor = 67 ] in-radius 5 > 0) [ set fcvrange fcvrange + 250]

    if(new-location != homelocation) [
        set new-location one-of [link-neighbors] of homelocation
       face new-location  ;; not strictly necessary, but improves the visuals a bit
       move-to new-location

       ; Gasoline price is about $3.37/gal, mileage of a car is 20 mpg on avg
       ; so $/mile is 3.37 * 0.0532  = 0.179
       set convdisutil convdisutil + ( 0.179 * dist )

       ; Electricity pricing is $0.0841 / kwh, eff of BEV is 0.239 kWh/mile
       ; $/mile is 0.0841 * 0.239 = 0.02
       set bevdisutil bevdisutil + ( 0.02 * dist )

       ; Hydrogen price is $4.38 / gge, eff is 0.027 gpm
       ; $/mile is 4.38 * 0.027 = 0.12
       set fcvdisutil fcvdisutil + ( 0.12 * dist )

       set range range - dist
       set fcvrange fcvrange - dist
       if any? patches with [wcharge? = 1] [ set range range + 12]
       if (count other patches with [pcolor = 67 ] in-radius 5 > 0) [ set fcvrange fcvrange + 250]
       ]
     face homelocation
     move-to homelocation

    ; Gasoline price is about $3.37/gal, mileage of a car is 20 mpg on avg
    ; so $/mile is 3.37 * 0.0532  = 0.179
    set convdisutil convdisutil + ( 0.179 * dist )

    ; Electricity pricing is $0.0841 / kwh, eff of BEV is 0.239 kWh/mile
    ; $/mile is 0.0841 * 0.239 = 0.02
    set bevdisutil bevdisutil + ( 0.02 * dist )

    ; Hydrogen price is $4.38 / gge, eff is 0.027 gpm
    ; $/mile is 4.38 * 0.027 = 0.12
    set fcvdisutil fcvdisutil + ( 0.12 * dist )

    if any? patches with [hcharge? = 1] [ set range range + 42]
    if (count other patches with [pcolor = 67 ] in-radius 5 > 0) [ set fcvrange fcvrange + 250]

    if range < 0 [set bevdisutil bevdisutil + 25 ] ;; if range is negative, then it means BEV does not have sufficient chargers
                                                   ;; so a $25/day penalty is given (approx. price of a rental car per day)
    if range > 0 [set bevdisutil bevdisutil]

    if fcvrange < 0 [ set fcvdisutil fcvdisutil + 25 ]  ;; if range is negative, then it means FCV does not have sufficient stations to refuel
                                                        ;; so a $25/day penalty is given (approx. price of a rental car per day)
    if fcvrange > 0 [ set fcvdisutil fcvdisutil ]

    ;; Neighborhood effect: If more than 50% of the neighbors in the 5-mile radius
    ;; prefer BEVs or FCVs (based on their disutility) then there is an utility for the vehicle in question
    if neighborhood-effect [

      if ( count other vehicles in-radius 5 > 0 ) [
        if (( count other vehicles with [bevdisutil < convdisutil and bevdisutil < fcvdisutil] in-radius 5 ) /
        ( count other vehicles in-radius 5 ) > 0.5 ) [ set bevdisutil bevdisutil - 25]
      ]

      if ( count other vehicles in-radius 5 > 0 ) [
        if (( count other vehicles with [fcvdisutil < convdisutil and fcvdisutil < bevdisutil] in-radius 5 ) /
        ( count other vehicles in-radius 5 ) > 0.5 ) [ set fcvdisutil fcvdisutil - 25]
      ]

    ]


  ]

  tick
end 

;; This routine allows the user to create hydrogen stations in real-time

to place-h2stations

  if mouse-down? [
    ask patch mouse-xcor mouse-ycor [ set pcolor 67 ]
    display
  ]
end 

;; This routine allows the user to create public charging stations in real-time

to place-chargers

  if mouse-down? [
    ask patch mouse-xcor mouse-ycor [ set pcolor violet set pcharge? 1 ]
    display
  ]
end 


;; The purchase probabilities are calculated using multinomial logistic regression approach
;; The respective probabilities are reported for each vehicle technology

to-report conventional
  report exp (- convdisutil / 1000 ) / ( exp (- convdisutil / 1000 ) + exp ( - fcvdisutil / 1000 ) + exp ( - bevdisutil / 1000 ))
end 

to-report bev
  report exp (- bevdisutil / 1000 ) / ( exp (- convdisutil / 1000 ) + exp ( - fcvdisutil / 1000 ) + exp ( - bevdisutil / 1000 ))
end 

to-report fcv
  report exp (- fcvdisutil / 1000 ) / ( exp (- convdisutil / 1000 ) + exp ( - fcvdisutil / 1000 ) + exp ( - bevdisutil / 1000 ))
end 

There is only one version of this model, created 10 months ago by Kalai Ramea.

Attached files

File Type Description Last updated
Consumer Vehicle Choice Model .png preview Preview for 'Consumer Vehicle Choice Model ' 10 months ago, by Kalai Ramea Download

This model does not have any ancestors.

This model does not have any descendants.