ps10_s.gms : Parts Supply Problem w/ 10 Types and w/ Asymmetric Information

Description

Hideo Hashimoto, Kojun Hamada, and Nobuhiro Hosoe, "A Numerical Approach
to the Contract Theory: the Case of Adverse Selection", GRIPS Discussion
Paper 11-27, National Graduate Institute for Policy Studies, Tokyo, Japan,
March 2012.

Keywords: nonlinear programming, contract theory, principal-agent problem,
          adverse selection, parts supply problem


Small Model of Type : NLP


Category : GAMS Model library


Main file : ps10_s.gms

$title Parts Supply Problem w/ 10 Types & w/ Asymmetric Information (PS10_S,SEQ=368)

$onText
Hideo Hashimoto, Kojun Hamada, and Nobuhiro Hosoe, "A Numerical Approach
to the Contract Theory: the Case of Adverse Selection", GRIPS Discussion
Paper 11-27, National Graduate Institute for Policy Studies, Tokyo, Japan,
March 2012.

Keywords: nonlinear programming, contract theory, principal-agent problem,
          adverse selection, parts supply problem
$offText

option limCol = 0, limRow = 0;

Set i 'type of supplier' / 0*9 /;

Alias (i,j);

Parameter
   theta(i) 'efficiency'
   p(i)     'probability of type';

theta(i) = ord(i)/card(i);
p(i)     =      1/card(i);

Scalar ru 'reservation utility' / 0 /;

* Definition of Primal/Dual Variables
Positive Variable
   x(i) "quality"
   b(i) "maker's revenue"
   w(i) "price";

Variable Util "maker's utility";

Equation
   obj     "maker's utility function"
   rev(i)  "maker's revenue function"
   pc(i)   "participation constraint"
   licd(i) "incentive compatibility constraint";

obj..     Util =e= sum(i, p(i)*(b(i) - w(i)));

rev(i)..  b(i) =e= x(i)**(0.5);

pc(i)..   w(i) - theta(i)*x(i) =g= ru;

licd(i).. w(i) - theta(i)*x(i) =g= w(i+1) - theta(i)*x(i+1);

* Setting Lower Bounds on Variables to Avoid Division by Zero
x.lo(i) = 0.0001;

Model SB_lic / all /;

solve SB_lic maximizing Util using nlp;

File sol / solution_lic.csv /;
put  sol;
sol.pc =     5;
sol.pw = 32767;

put "type" "x.l" "w.l" "b.l" "prob" "theta"/;
loop(i, put i.tl x.l(i):20:10 w.l(i):20:10 b.l(i):20:10 p(i):20:10 theta(i):20:10/;);
put "Util" Util.l:20:10;

put "Shadow price of IC(i,j)" /;
put "True type"; put "LICD" /;
loop(i, put i.tl licd.m(i):20:10; put /;);