harker.gms : Models of Spatial Competition

Description

A spatial equilibrium model is used to demonstrate different
ways of modeling market behavior. Competitive and Monopolistic markets
are modeled using consumers' and producers' surplus. A Cournot-Nash
Oligopoly model is solved by a Diagonalization or Jacobi algorithm.


Reference

  • Harker, P T, Alternative Models of Spatial Competition. Operations Research 34, 3 (1986), 410-425.

Small Model of Type : NLP


Category : GAMS Model library


Main file : harker.gms

$title Models of Spatial Competition (HARKER,SEQ=85)

$onText
A spatial equilibrium model is used to demonstrate different
ways of modeling market behavior. Competitive and Monopolistic markets
are modeled using consumers' and producers' surplus. A Cournot-Nash
Oligopoly model is solved by a Diagonalization or Jacobi algorithm.


Network structure:

        one      two     three        demand and supply points
        /  \       \     /
       /    \       \   /
     four -- five -- six              transport nodes

linear demand function:        demand(price) = (rho - price)/eta

linear marginal cost function: cost(supply) = alpha + 2*beta*supply

transport cost:                cost(t(ij)) = kappa(ij)*t(ij) + nu(ij)*t(ij)^3


Harker, P T, Alternative Models of Spatial Competition. Operations
Research 34, 3 (1986), 410-425.

Keywords: nonlinear programming, spatial equilibrium model, micro economics,
          market behavoir, competitive markets, monopolistic markets, Cournot-Nash
          oligopoly
$offText

Set
   n    'nodes'   / one, two, three, four, five, six /
   l(n) 'regions' / one, two, three                  /;

Alias (l,lp), (n,np);

Table coefs(l,*) 'demand and supply data'
           alpha  beta  rho  eta
   one       1.0    .5   19  .2
   two       2.0    .4   27  .01
   three     1.5    .3   30  .3 ;

Table pairs(n,np,*) 'transport data'
               kappa   nu
   one.four        1   .5
   one.five        2   .2
   two.six         3   .3
   three.six       1   .4
   four.one        2   .3
   four.five       1   .1
   four.six        1   .1
   five.one        3   .5
   five.four       2   .2
   five.six        1  1.0
   six.two         2  .25
   six.three       2   .2
   six.four        1   .9
   six.five        3   .8;

Set arc(n,np) 'active arcs';

arc(n,np) = pairs(n,np,"kappa");

Positive Variable
   t(n,np)  'transport'
   tt(l,lp) 'notional o-d flows'
   d(n)     'demand'
   s(n)     'supply';

Variable obj 'objective value';

Equation
   bal      'supply demand balance'
   sbal(l)  'supply balance'
   dbal(l)  'demand balance'
   nbal(n)  'node balance'
   in(l)    'inflow balance'
   objdef   'objective definition'
   objoli   'objective definition oligopoly';

Scalar
   pm 'product market type'
   tm 'transport market type';

bal..     sum(l, d(l)) =e= sum(l, s(l));

nbal(n).. s(n)$l(n) + sum(arc(np,n), t(arc)) =e= d(n)$l(n) + sum(arc(n,np), t(arc));

objdef..  obj =e= sum(l, coefs(l,"rho")*d(l) - pm*coefs(l,"eta")*sqr(d(l)))
               -  sum(l, coefs(l,"alpha")*s(l) + coefs(l,"beta")*sqr(s(l)))
               -  sum(arc, pairs(arc,"kappa")*t(arc)
                         + tm*pairs(arc,"nu")*power(t(arc),3));

Model hark / bal, nbal, objdef /;

Parameter
   rep1 'transport summary'
   rep2 'supply demand and price summary';

s.l(l) = 25;
d.l(l) = 25;

* 1. classical spatial price equilibrium: perfectly competitive
* producers and suppliers facing average cost pricing
* of transportation:

pm =  .5;
tm = 1/3;

solve hark maximizing obj using nlp;

rep1(arc,       "cspe2") = t.l(arc);
rep2("supply",l,"cspe2") = s.l(l);
rep2("demand",l,"cspe2") = d.l(l);
rep2("price ",l,"cspe2") = coefs(l,"rho") - coefs(l,"eta")*d.l(l);

* 2. monopoly pricing equilibrium in which the firm owns both
* means of production and distribution network (hence, marginal
* cost pricing prevails at both the factory and the railhead):

pm = 1;
tm = 1;

solve hark maximizing obj using nlp;

rep1(arc,       "monop1") = t.l(arc);
rep2("supply",l,"monop1") = s.l(l);
rep2("demand",l,"monop1") = d.l(l);
rep2("price ",l,"monop1") = coefs(l,"rho") - coefs(l,"eta")*d.l(l);

* 3. monopoly pricing equilibrium in which the firm uses the
* distribution network with average cost pricing:

pm =   1;
tm = 1/3;

solve hark maximizing obj using nlp;

rep1(arc,       "monop2") = t.l(arc);
rep2("supply",l,"monop2") = s.l(l);
rep2("demand",l,"monop2") = d.l(l);
rep2("price ",l,"monop2") = coefs(l,"rho") - coefs(l,"eta")*d.l(l);

* 4. multi-producer oligopoly model with average cost pricing
* of transportation links:

pm =   1;
tm = 1/3;

* Additional equation required to solve the a Cournot-Nash
* Oligopoly model by a Diagonalization or Jacobi algorithm.
*
* note the use of d.l(l)-tt.l(lp,l) which holds the values of the
* previous iteration

Variable tt(l,lp) 'notional o-d flows';

Equation
   sbal(l) 'supply balance'
   dbal(l) 'demand balance'
   in(l)   'inflow balance'
   objoli  'objective definition oligopoly';

sbal(l).. s(l) =e= sum(lp, tt(l,lp));

dbal(l).. d(l) =e= sum(lp, tt(lp,l));

in(l)..   d(l) =e= tt(l,l) + sum(arc(n,l), t(arc));

objoli..  obj  =e= sum(l, coefs(l,"rho")*d(l) - pm*coefs(l,"eta")
                *  sum(lp, (d.l(l) - tt.l(lp,l) + tt(lp,l))*tt(lp,l)))
                -  sum(l, coefs(l,"alpha")*s(l) + coefs(l,"beta")*sqr(s(l)))
                -  sum(arc, pairs(arc,"kappa")*t(arc)
                          + tm*pairs(arc,"nu")*power(t(arc),3));

Model harkoli / nbal, sbal, dbal, in, objoli /;

Set iter 'iteration count' / iter1*iter20 /;

Parameter
   objold          'previous objective'
   irep(iter,n,np) 'iteration summary';

option irep:8:1:2, limCol = 0, limRow = 0;

tt.l(l,lp) = 1;

objold = 0;
harkoli.objVal = 1;

loop(iter$(abs(objold - harkoli.objVal) > 1e-5),
   objold = harkoli.objVal;
   solve harkoli maximizing obj using nlp;
   harkoli.solPrint = %solPrint.Quiet%;
   irep(iter,arc)   = t.l(arc);
);

display irep;

rep1(arc,       "oligop") = t.l(arc);
rep2("supply",l,"oligop") = s.l(l);
rep2("demand",l,"oligop") = d.l(l);
rep2("price ",l,"oligop") = coefs(l,"rho") - coefs(l,"eta")*d.l(l);

display rep1, rep2;