# Bid Evaluation

TomSym implementation of GAMS Example (BID,SEQ=19)

A company obtains a number of bids from vendors for the supply of a specified number of units of an item. Most of the submitted bids have prices that depend on the volume of business.

Bracken, J, and McCormick, G P, Chapter 3. In Selected Applications of Nonlinear Programming. John Wiley and Sons, New York, 1968, pp. 28-36.

v: vendors (a, b, c, d, e)

s: segments (1-5)

vs(v,s): vendor bit possibilities

cl: column labels (setup, price, q-min, q-max)

```% scalar req requirements
req = 239600.48;

% Matrix bid(v,s,cl), with bid data
bid = zeros(5,5,4);
bid(1,1,:) = [3855.84     61.150     0        33000];
bid(2,1,:) = [125804.84   68.099     22000    70000];
bid(2,2,:) = [0           66.049     70000    100000];
bid(2,3,:) = [0           64.099     100000   150000];
bid(2,4,:) = [0           62.119     150000   160000];
bid(3,1,:) = [13456.00    62.190     0        165600];
bid(4,1,:) = [6583.98     72.488     0        12000];
bid(5,1,:) = [0           70.150     0        42000];
bid(5,2,:) = [0           68.150     42000    77000];

% Get minimum domains and ripple total cost up the segments
vs = bid(:,:,4);

% bid(v,s+1,'setup') = bid(v,s,'setup') +
% bid(v,s,'q-max')*(bid(v,s,'price')-bid(v,s+1,'price')))
for i=1:5
for j=2:5
bid(i,j,1) = bid(i,j-1,1)+bid(i,j-1,4)*(bid(i,j-1,2)-bid(i,j,2));
end
end

% Variables

% pl(v,s): Purchase level
toms 5x5 pl

% plb(v,s): Purchase decision (binary)
toms 5x5 integer plb

% Bounds on binary (integer variables)
cbnd = {0 <= plb <= 1};

% Index for variables that are known to be zero
idx = vs==0;

% Set bounds to force zero
cbnd = {cbnd; pl(vs==0) == 0; plb(vs==0) == 0};

% Demand constraint
eq1 = {req == sum(sum(pl))};

% Cost definition
bid1 = bid(:,:,1);
bid1(idx) = 0;
bid2 = bid(:,:,2);
bid2(idx) = 0;
cost = sum(sum(bid2.*pl + bid1.*plb));

% Min purchase (pl(vs) >= bid(vs,'q-min')*plb(vs))
bid3 = bid(:,:,3);
bid3(idx) = 0;
eq2 = {pl >= bid3.*plb};

% Max purchase (pl(vs) <= bid(vs,'q-max')*plb(vs))
bid4 = bid(:,:,4);
bid4(idx) = 0;
eq3 = {pl <= bid4.*plb};

% At most one deal
eq4 = {sum(plb,2) <= 1};

% Constraints
cons = {cbnd,eq1,eq2,eq3,eq4};

solution = ezsolve(cost,cons);
```
```Problem type appears to be: mip
===== * * * =================================================================== * * *
TOMLAB - Tomlab Optimization Inc. Development license  999001. Valid to 2010-02-05
=====================================================================================
Problem: ---  1:                                f_k 15210109.512000000000000000
sum(|constr|)      0.000000000001634248
f(x_k) + sum(|constr|)15210109.512000000000000000
f(x_0)      0.000000000000000000

Solver: CPLEX.  EXIT=0.  INFORM=101.
CPLEX Branch-and-Cut MIP solver
Optimal integer solution found

FuncEv    7
```