MODEL: ! General Purchasing model (PURCHASL).
A single customer is trying to decide
which products should be bought from which supplier.
Each supplier has fixed order cost and a quantity
discount(all units) threshold. You may get a split sourcing solution;
!Keywords: Purchasing, Quantity Discount, Discount;
SETS:
! The suppliers;
SUP: FC, DHURDL, DRATE,
DISC, YFC, YDS;
! The products;
PROD: DEM;
! For each supplier, product combination...;
SXP( SUP, PROD): PRICE, X;
ENDSETS DATA:
SUP = MART STNB;
FC = 1000, 0; ! Fixed cost of ordering;
DHURDL = 0, 10000; ! Hurdle for winning discount;
DRATE = 0, .1; ! Discount rate;
PROD = PUMP GENR STBLZR;
DEM = 2, 1, 30; ! Demand by product;
PRICE = ! Price by supplier * product;
4450, 3100, 210,
4500, 3950, 290;
ENDDATA
!;
NSUP = @SIZE(SUP);
NPRD = @SIZE(PROD);
! Minimize net purchase cost of
gross cost + fixed charges  discounts;
[COST] MIN = @SUM( SXP( I, J): PRICE( I, J) * X( I, J))
+ @SUM( SUP( I): FC( I) * YFC( I))
 @SUM( SUP( I): DISC( I));
! Demand constraints, must buy amount needed;
@FOR( PROD( J):
@SUM( SUP( I): X( I, J)) >= DEM( J);
);
! Turn on fixed charge var of I if buy anything from I;
@FOR( SUP( I):
! YFC is binary (0/1);
@BIN( YFC( I));
@FOR( PROD( J):
X( I, J) <= DEM( J) * YFC( I);
! Can only buy integer quantities;
@GIN( X( I, J));
););
! Describe the discount;
@FOR( SUP( I):
! YDS is binary;
@BIN( YDS( I));
! Turn on YDS( I) if we take any discount;
DISC( I) <= YDS( I) *
DRATE( I) * @SUM( PROD( J): PRICE( I, J) * DEM( J));
! If we take a discount it must be at least the minimum;
DISC( I) >= DRATE( I) * DHURDL( I) * YDS( I);
! We cannot take more discount than entitled to;
DISC( I) <= DRATE( I) * @SUM( PROD( J): PRICE( I, J) * X( I, J));
);
DATA:
@TEXT( ) = "Amount to buy of each of 3 products from 2 suppliers:";
@TEXT( ) = @TABLE(X);
ENDDATA
END
