/********************************************************
BCL Example Problems
====================
file xbcontr.c
``````````````
Contract allocation example.
(c) 2008 Fair Isaac Corporation
author: S.Heipcke, Jan. 2000, rev. Mar. 2011
********************************************************/
#include <stdio.h>
#include "xprb.h"
#define District 6 /* Number of districts */
#define Contract 10 /* Number of contracts */
/**** DATA ****/
int OUTPUT[] = {50, 40, 10, 20, 70, 50}; /* Max. output per district */
int COST[] = {50, 20, 25, 30, 45, 40}; /* Cost per district */
int VOLUME[] = {20, 10, 30, 15, 20, 30, 10, 50, 10, 20};
/* Volume of contracts */
/***********************************************************************/
int main(int argc, char **argv)
{
int d,c;
XPRBctr c1,c2,cobj;
XPRBvar x[District][Contract]; /* Variables indicating whether a project
is chosen */
XPRBvar y[District][Contract]; /* Quantities allocated to contractors */
XPRBprob prob;
prob=XPRBnewprob("Contract"); /* Initialize a new problem in BCL */
/**** VARIABLES ****/
for(d=0;d<District;d++)
for(c=0;c<Contract;c++)
{
x[d][c] = XPRBnewvar(prob,XPRB_BV,XPRBnewname("x_d%dc%d",d+1,c+1),0,1);
y[d][c] =
XPRBnewvar(prob,XPRB_SC,XPRBnewname("q_d%dc%d",d+1,c+1),0,OUTPUT[d]);
XPRBsetlim(y[d][c],5);
}
/****OBJECTIVE****/
cobj = XPRBnewctr(prob,"OBJ",XPRB_N); /* Define objective: total cost */
for(d=0;d<District;d++)
for(c=0;c<Contract;c++)
XPRBaddterm(cobj,y[d][c],COST[d]);
XPRBsetobj(prob,cobj); /* Set objective function */
/**** CONSTRAINTS ****/
for(c=0;c<Contract;c++)
{
c1=XPRBnewctr(prob,"Size",XPRB_G); /* Cover the required contract volume */
c2=XPRBnewctr(prob,"Min",XPRB_G); /* At least 2 districts per contract */
for(d=0;d<District;d++)
{
XPRBaddterm(c1,y[d][c],1);
XPRBaddterm(c2,x[d][c],1);
}
XPRBaddterm(c1,NULL,VOLUME[c]);
XPRBaddterm(c2,NULL,2);
}
for(d=0;d<District;d++) /* Do not exceed max. output of any district */
{
c1=XPRBnewctr(prob,"Output",XPRB_L);
for(c=0;c<Contract;c++)
XPRBaddterm(c1,y[d][c],1);
XPRBaddterm(c1,NULL,OUTPUT[d]);
}
for(d=0;d<District;d++) /* If a contract is allocated to a district,
then at least 1 unit is allocated to it */
for(c=0;c<Contract;c++)
XPRBnewprec(prob,"XY",x[d][c],0,y[d][c]);
/****SOLVING + OUTPUT****/
XPRBexportprob(prob,XPRB_MPS,"Contract"); /* Output matrix in MPS format */
XPRBsetsense(prob,XPRB_MINIM); /* Choose the sense of the optimization */
XPRBmipoptimize(prob,""); /* Solve the MIP-problem */
if((XPRBgetmipstat(prob)==XPRB_MIP_SOLUTION) ||
(XPRBgetmipstat(prob)==XPRB_MIP_OPTIMAL))
/* Test whether an integer solution was found */
{
printf("Objective: %g\n",XPRBgetobjval(prob)); /* Get objective value */
for(d=0;d<District;d++) /* Print the solution values */
{
for(c=0;c<Contract;c++)
if(XPRBgetsol(x[d][c])>0)
printf("%s:%g, ", XPRBgetvarname(y[d][c]), XPRBgetsol(y[d][c]));
printf("\n");
}
}
return 0;
}
|