/* Murat Yildizoglu - Universite Bordeaux IV
* Montesquieu, FRANCE
* Copyright (c) 1996-2001 Murat Yildizoglu
* e-mail: yildi[a_t]u-bordeaux4.fr
* Permission to use, copy, modify, and distribute this
* software and its documentation for NON-COMMERCIAL purposes
* and without fee is hereby granted provided that this
* copyright notice appears in all copies.
*/
/**
* An evolutionnary firm close to Nelson and Winter (1982)
* @version 1.02 16 10 96
* @author Murat Yildizoglu
*/
import java.util.Random;
public class EvolFirm
{ /** Initializes and computes the firm's caracteristics
* given the caracteristics of the industry to which
* it belongs.
*/
public EvolFirm(double K0, double prod0, double cost0,
double p_in, double p_im, double d_in0, double d_im0,
double sigma_in0, double b0, double delta0, double eta0)
{
K=K0;
prod=prod0;
cost=cost0;
r_in=p_in/(K0*d_in0); // p_in: innovation probability
r_im=p_im/(K0*d_im0); // p_im: imitation probability
d_in=d_in0;
d_im=d_im0;
sigma_in=sigma_in0;
b=b0;
delta=delta0;
eta=eta0;
r=new Random();
}
/** Computes the supply of the firm
*/
public double supply()
{
return K*prod;
}
/** Computes the profit rate on capital
* @return profit rate
*/
public double profit(double Prix)
{
return (Prix*prod-(cost+r_in+r_im));
}
/** Computes the investment following the rule
* of Nelson and Winter
*/
public void invest(double P, double Supply, double b)
{
double invdes=0,invmax=0,ipos=0,inv=0, loans=0;
double s=supply()/Supply;
double margin=cost/(P*prod);
invdes=delta+1-(margin*eta)/(eta-s);
prf=profit(P);
if(prf<0) loans=0;
else loans=b*prf;
invmax=delta+prf+loans;
ipos=Math.min(invdes,invmax);
inv=Math.max(0.0,ipos);
K*=(1+inv-delta);
}
/** Imitative draw
*/
public void imitate(double maxprod)
{
double tirage=r.nextDouble();
if ( tirage<=d_im*r_im*K )
prod=maxprod;
}
/** Innovative draw
*/
public void innovate()
{
double prd=0;
double tirage=r.nextDouble();
if ( tirage<=d_in*r_in*K )
{
prd=(r.nextGaussian())*sigma_in+prod;
}
if ( prd>prod )
prod=prd;
}
/** Returns the productivity of the firm
* @param prod
*/
public double getprod()
{
return prod;
}
/** Returns the capital stock
* @return K
*/
public double getKapital()
{
return K;
}
/** Returns the profit_ratexKapital
*/
public double getProfit(double pp)
{
return profit(pp)*K;
}
/** Prints on the screen the productivity and capital of the firm
*/
public void showFirm()
{
System.out.print("Prod= "+prod+" K= "+K);
}
private double prod,K, cost, r_in,
r_im, d_in, d_im, b, sigma_in, delta, eta,prf;
private static Random r;
}