No preview image

1 collaborator

Default-person Steven Kimbrough (Author)


market area analysis 

Tagged by Steven Kimbrough about 8 years ago

Visible to everyone | Changeable by the author
Model was written in NetLogo 5.1.0 • Viewed 327 times • Downloaded 25 times • Run 0 times
Download the 'Huff' modelDownload this modelEmbed this model

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


A number of establishments that compete for regional customer exist or are contemplated in a particular geographic area. Given the several locations and attractivenesses of these establishments, we would like to predict the market share each will achieve. We are interested in deciding whether to build a number of new establishments as well as where to put any we do decide to build.

This problem falls under the category of market area analysis, addressing one of the category's main concerns: the location of prospective retail stores. The Huff model is used extensively for this purpose. The Huff NetLogo model constitutes a simple implementation of the Huff model.

The basic formula for the Huff model is

P(i,j) = (S(j)alpha / T(i,j)beta) / sum(i=1,n)[(S(j)alpha / T(i,j)beta)]


  • P(i,j) is the probability of a consumer at a given origin i traveling to a particular shopping center j.
  • S(i) is the size of a shopping center j (typically measured in terms of the square footage of selling area devoted to the sale of a particular class of goods). More generally, a measure of attractiveness of the shopping center (with higher values more attractive than lower values).
  • T(ij) is the travel time or cost for customer i to go to shopping center j.

  • alpha is a parameter, to be estimated empirically but often simply set to 1, for scaling the importance of the attractiveness measure for the establishment, S(j).

  • beta is a parameter, to be estimated empirically but often simply set to 2 (hence the literature often speaks of the "Huff gravity model" for this class of models), reflecting the effect of travel time and other costs on various kinds of shopping trips.
  • n is the number of establishments or shopping centers under consideration.

Further, it is presumed in using this model that there are m customers, that each customer has a known location, and that each of the establishments under consideration has a known location, real or hypothetical.

The expected traffic for a store j is

expected_traffic(j) = sum(i=1,m)[P(i,j)]


Customers are represented by turtles and displayed as small gray circles. The setup procedure arrays them randomly. There is nothing in the implementation that makes them move. Stores are represented by patches whose store-at? attributes are set to true. The calculate-store-traffic procedure calculates P(i,j) for all customers i and stores j and reports to the output widget the expected traffic for each store in the model.


Use the sliders to set the number of customers, n in the Huff formula, and alpha and beta in the Huff formula. Click the setup button to initialize the world. To add stores, click the add-drop-stores button and then click in the world on any patch that does not already have a store. If your click on a patch that already is a store, the store gets removed. Click the add-drop-stores button again when you are done adding or removing stores. Click on the calculate-store traffic to run the Huff formula on each of the customer-store combinations, and to report in the output widget the expected traffic for each store. Stores have a default size of 1 when they are added.


Changing the size of a store can have a substantial affect on the level of its expected traffic, especially if alpha is much greater than 1. You can easily change the size of a store by inspecting it and editing the size attribute.


You can work interactively with the program to try to find better positions for a given store. You can do this by clicking on the add-drop-stores button, deleting a given store, and adding a new store at a different location. The payoffs resulting from changes in position are often surprising, usually interesting.

You can use NetLogo commands to move the turtles/customers to non-random distributions. For example:

observer> ask turtles [set heading 180]
observer> ask turtles [fd 5]

Again, the payoffs resulting from changes in position are often surprising, usually interesting.


The Huff Turtles-Based NetLogo model represents a signficant extension to the Huff NetLogo model, as it affords individual and group searches by stores for better positions.


The code uses the NetLogo table extension multiple times in its calculation of P(i,j) and expected traffic.


The coding methods here draw upon the Life NetLogo model, found in the Models Library.

The Huff model has an interesting relationship with Hotelling's spatial location models, which are implemented in the Hotelling's Law NetLogo model in the Models Library.


If you mention this model in a publication, we ask that you include these citations for the model itself and for the NetLogo software:

  • Kimbrough, Steven O. (2014). Huff model. University of Pennsylvania, Philadelphia, PA. Huff.nlogo


Copyright 2014 Steven O. Kimbrough.


This work is licensed under the Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License. To view a copy of this license, visit or send a letter to Creative Commons, 559 Nathan Abbott Way, Stanford, California 94305, USA.

Commercial licenses are also available. To inquire about commercial licenses, please contact Steven O. Kimbrough at

Version: $Id: Huff.nlogo 4336 2014-09-08 21:12:50Z sok $.

Comments and Questions

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

Click to Run Model

extensions [table]
globals[background-color the-stores 
patches-own [store-at? store-size ]
turtles-own [store-distances store-probabilities 

to setup
  set background-color white
  ask patches [set pcolor background-color
    set store-at? false
    set store-size 1]
  create-turtles customers
  ask turtles [setxy random-xcor random-ycor
    set color gray
    set shape "circle"
    set size 1 / 2]

to add-drop-stores
  let deleting? [store-at?] of patch mouse-xcor mouse-ycor
  while [mouse-down?]
   [ask patch mouse-xcor mouse-ycor
    [ifelse deleting?

to delete-store
  ; You can't delete the last store.
  ; But actually, this isn't necessary.
  if count patches with [store-at? = true] > 1
  [set store-at? false
  set pcolor background-color]

to put-store
  set store-at? true
  set pcolor black

to-report get-the-stores
  report patches with [store-at? = true]

to calculate-attractivness-statistics
  let stores get-the-stores
  let n count get-the-stores
  ask turtles [set store-distances []
    set store-probabilities []
    set store-attractivenesses []]  
  ; Record the store distances for each turtle.
  ask turtles [
    let the-turtle self
    ask stores [
      let the-distance distance the-turtle
      let the-store self
      ask the-turtle [set store-distances fput (list the-distance the-store) store-distances]
  ; Not really needed:
  ask turtles [set store-distances sort-by [first ?1 < first ?2] store-distances]
  ; Record the store-attractivenesses for each turtle.
  ; The attractiveness of a store is the
  ; product of the size of the store powered
  ; to the value of alpha, times the
  ; reciprocal of 
  ; distance to that store, powered to beta.
  ask turtles [set store-attractivenesses table:make
    set total-distance  total-distances
    let td total-distance    
    foreach store-distances [
     let dist first ?
     let store last ?
     table:put store-attractivenesses (list [pxcor] of store [pycor] of store) 
        ([store-size] of store) ^ alpha * (1 / dist) ^ beta
  ; Record the store-probabilities for each turtle.
  ask turtles [set store-probabilities table:make
    set total-attractiveness total-attractivenesses
    foreach table:keys store-attractivenesses [
     table:put store-probabilities ? 
     (table:get store-attractivenesses ? / total-attractivenesses)

to-report total-distances
  let answer 0
  foreach store-distances
  [set answer (answer + first ?)]
  report answer

to-report total-attractivenesses
  let answer 0
  foreach table:keys store-attractivenesses
  [set answer (answer + table:get store-attractivenesses ?)]
  report answer  

to calculate-store-traffic
  set stores-traffic table:make
  let stores get-the-stores
  ask stores [   let x [pxcor] of self
   let y [pycor] of self
   let key (list x y)
   table:put stores-traffic key 0
;  set traffic-accumulator 0
  let keys table:keys stores-traffic
  foreach keys [
   ask turtles [table:put stores-traffic ? 
     (table:get stores-traffic ? + table:get store-probabilities ?)
  ; Now display it
  output-print (word "Store     Expected")
  output-print (word "Location  Traffic")
  let listtable table:to-list stores-traffic
  set listtable sort-by [last ?1 > last ?2] listtable
  foreach listtable [let address (word first ?)
    let padding ""
    repeat (10 - length address) [set padding (word padding  " ")]
    output-print (word address padding 
      (round (100 * last ?) / 100))]

There is only one version of this model, created about 8 years ago by Steven Kimbrough.

Attached files

No files

This model does not have any ancestors.

This model does not have any descendants.