! Supply sourcing: Which plants should we use in which countries to
     satisfy demand in various countries, taking into account
        production costs, transportation costs, taxes that vary by country,
        import duties that vary by country, random demand,
        random exchange rates;
  ! Original Author: Arnd Huchzermeier;
  !  SHAREHOLDER VALUE MAXIMIZATION UNDER DEMAND AND EXCHANGE RATE RISK;
  !          WHU Koblenz;
  !          Otto-Beisheim Graduate School of Management;
  !          Production Management;
  !          Burgplatz 2;
  !          56179 Vallendar;
  !          Germany;
  !         Tel.: +49-261-6509-380;
  !         Fax: +49-261-6509-389;
  !         E-mail: ah@whu-koblenz.de;
  !         Home page: www.whu-koblenz.de/prod;
  ! Last revised: Dezember 9, 1998;
  ! Reference: Cohen, M. A., A. Huchzermeier. 1999. 
     Global supply chain management: A survey of research and applications. 
     In Tayur S., M. Magazine, R. Ganeshan (Eds.) 
     Quantitative Models for Supply Chain Management. Kluwer Academic Publishers.; 
  ! Subsequent modifications by L. Schrage;
  !  Based on the Applichem business case;
  ! Keywords: Applichem, Foreign Exchange, FX, Logistics, Real Options,
              Stochastic Programming, Supply Chain, Transportation Model;
SETS:
   ORIGINS  : CST, CAP, FXI, SIGFXI, FCOST, Y; ! Sources of production;
   DESTN    : PRI, DEM, FXJ, SIGFXJ;    ! Destinations/markets;
   SCENED   : PROBD;                    ! Demand scenarios;
   SCENEFX  : PROBFX;     ! Foreign exchange rate scenarios;
   LINKS( ORIGINS, DESTN)                     : TAX, DUT, LCST;
   SCENE( SCENEFX, SCENED)                    : REVBYS; ! Combination scenarios;
   SDEM( SCENED, DESTN)                       : DEMS;   ! Demand scenarios;
   SFXI( SCENEFX, ORIGINS)                    : FXIS;   ! FX scenarios;
   SFXJ( SCENEFX, DESTN)                      : FXJS;
   SORI( SCENEFX, SCENED, DESTN)              : ;
   SSIN( SCENEFX, SCENED, ORIGINS)            : ;
   SLINKS ( SCENEFX, SCENED, ORIGINS, DESTN)  : VOLS;
ENDSETS
DATA: DESTN= MEXD, CAND, VEND, GERD, USAD, JAPD; ORIGINS= MEXO, CANO, VENO, GERO, USAO, JAPO; ! Available capacity for each plant/origin/source; CAP = 22.0 3.7 4.5 47.0 18.5 5.0; ! Fixed cost of a plant if used, for any volume > 0; FCOST= 0 0 0 0 0 0; NSOURCES = 5; ! Number of sources/plants allowed; ! Mean demand for each destination/market region/sink; DEM = 3.0 2.6 0.0 20.0 26.4 11.9; PRI = 101.0 101.0 101.0 101.0 101.0 101.0; ! Expected mean of exchange rate change/drift in currency of plant/origin (= interest rate differential); FXI = 0 0 0 0 0 0; ! Expected mean of exchange rate change/drift in currency of market region/sink (= interest rate differential); FXJ = 0 0 0 0 0 0; ! Standard deviation of log of annual exchange rate changes in percent; SIGFXI = 0.3871 0.0570 0.3629 0.1415 0 0.1296; ! Standard deviation of log of annual exchange rate changes in percent; SIGFXJ = 0.3871 0.0570 0.3629 0.1415 0 0.1296; ! Variable production costs before packaging (in 1982 U.S. dollars); CST = 92.63 93.25 112.31 73.34 89.15 149.25; ! Variable distribution logistics costs from plants/origins to market regions/DESTN; LCST = 0 11.4 7.0 11.0 11.0 14.0 11.0 0 9.0 11.5 6.0 13.0 7.0 10.0 0 13.0 10.4 14.3 10.0 11.5 12.5 0 11.2 13.3 10.0 6.0 11.0 10.0 0 12.5 14.0 13.0 12.5 14.2 13.0 0; ! Duty rates on imports (in percent); DUT = 0 0 50.0 9.5 4.5 6.0 60.0 0 50.0 9.5 4.5 6.0 60.0 0 0 9.5 4.5 6.0 60.0 0 50.0 0 4.5 6.0 60.0 0 50.0 9.5 0 6.0 60.0 0 50.0 9.5 4.5 0; ! Corporate income tax rates (in percent); TAX = 35.0 35.0 35.0 35.0 35.0 35.0 38.0 38.0 38.0 38.0 38.0 38.0 50.0 50.0 50.0 50.0 50.0 50.0 50.0 50.0 50.0 50.0 50.0 50.0 34.0 34.0 34.0 34.0 34.0 34.0 37.5 37.5 37.5 37.5 37.5 37.5; SCENED = D1 D2 D3; ! Demand scenarios; ! Standard deviation of demand in percent of mean demand; SIGD = 0.10; SCENEFX = FX1 FX2; ! Foreign exchange scenarios; ! Price in each market region/sink; ENDDATA ! The objective function: Maximize expected profit over scenarios; [PROFIT] MAX = @SUM( SCENE( K, L): PROBFX( K) * PROBD( L) * REVBYS (K, L)); ! Revenue by scenario; @FOR( SCENEFX( K): @FOR( SCENED( L): REVBYS( K, L) = @SUM( LINKS( I, J): (1 - TAX( I, J)/100) * (1/FXJS( K, J) * PRI( J) - FXIS( K, I) * ((1 + DUT( I, J)/100) * CST( I) + LCST( I, J)))* VOLS( K, L, I, J)) - @SUM( ORIGINS(I): FCOST(I)*Y(I)); ); ); ! A supply constraint for each scenario and plant/origin; @FOR( SORI( K, L, I): @SUM( DESTN( J): VOLS( K, L, I, J)) <= CAP( I)*Y(i)); @FOR( ORIGINS(I): @BIN(Y(i))); ! The Y(i) = 0 or 1; ! We may put a limit on number of origins/plants/sources; @SUM( ORIGINS(I): Y(I)) <= NSOURCES; ! A demand constraint for each scenario and market region/sink. Cannot sell more to a market than its scenario demand; @FOR( SSIN( K, L, J): @SUM( ORIGINS( I): VOLS( K, L, I, J)) <= DEMS( L, J)); ! Compute the various random variables: demands & exchange rates so as to match the specified means and standard deviations; ! Approximate demand distributions with a three point symmetric distribution that matches the mean and standard deviation; PROBD(1) = .25; PROBD(2) = .5; PROBD(3) = .25; @FOR( DESTN( J): ! High demand scenario = mean demand plus square root of two times standard deviation; DEMS(1, J) = DEM( J) + 1.414 * (SIGD * DEM( J)); ! Medium demand scenario = mean demand; DEMS(2, J) = DEM( J); ! Low demand scenario = mean demand minus square root of two times standard deviation; DEMS(3, J) = DEM( J) - 1.414 * (SIGD * DEM( J)); ); ! Approximate FX distribution with a two point, equi probable distribution; PROBFX(1) = 0.50; PROBFX(2) = 0.50; @FOR( ORIGINS( I): ! Based on log Normal distribution; ! Up-exchange rate scenario = exp(drift plus standard deviation of log exchange rate change); FXIS( 1, I) = @EXP( FXI( I) + SIGFXI( I)); ! Down-exchange rate scenario = exp(drift minus standard deviation of log exchange rate change); FXIS( 2, I) = @EXP( FXI( I) - SIGFXI( I)); ); @FOR( DESTN( J): ! Up-exchange rate scenario = exp(drift plus standard deviation of log exchange rate change); FXJS( 1, J) = @EXP( FXJ( J) + SIGFXJ( J)); ! Down-exchange rate scenario = exp(drift minus standard deviation of log exchange rate change); FXJS( 2, J) = @EXP( FXJ( J) - SIGFXJ( J)); );