1 // testdata.cc
2 
3 // Implements the data generation routines declared in testdata.h.
4 
5 #ifndef TESTDATA_CC
6 #define TESTDATA_CC
7 
8 
9 
10 #include "testdata.h"
11 
12 
13 
14 
random_matrix(const short & rows,const short & columns,const Integer & lower_bound,const Integer & upper_bound,ofstream & MATRIX)15 int random_matrix(const short& rows, const short& columns,
16                   const Integer& lower_bound, const Integer& upper_bound,
17                   ofstream& MATRIX)
18 {
19   // check arguments
20 
21   if(rows<=0)
22   {
23     cerr<<"ERROR: int random_matrix(const short&, const short&, \n"
24       "                         const Integer&, const Integer&, ofstream&):\n"
25       "first argument out of range: number of matrix rows must be positive"
26         <<endl;
27     return 0;
28   }
29 
30   if(columns<=0)
31   {
32     cerr<<"ERROR: int random_matrix(const short&, const short&, \n"
33       "                         const Integer&, const Integer&, ofstream&):\n"
34       "second argument out of range: number of matrix columns must be positive"
35         <<endl;
36     return 0;
37   }
38 
39   if(upper_bound<0)
40   {
41     cerr<<"ERROR: int random_matrix(const short&, const short&, \n"
42       "                         const Integer&, const Integer&, ofstream&):\n"
43       "fourth argument (upper bound for random cost vector entries) must be\n"
44       "nonnegative\n"<<endl;
45     return 0;
46   }
47 
48   if(upper_bound<lower_bound)
49   {
50     cerr<<"ERROR: int random_matrix(const short&, const short&, \n"
51       "                         const Integer&, const Integer&, ofstream&):\n"
52       "third argument (lower bound for random entries) must be less\n"
53       "or equal the fourth argument (upper bound)"<<endl;
54     return 0;
55   }
56 
57   // create test file
58 
59   MATRIX<<"MATRIX"<<endl<<endl;
60 
61   MATRIX<<"columns:"<<endl;
62   MATRIX<<columns<<endl<<endl;
63 
64   // random cost vector
65   MATRIX<<"cost vector:"<<endl;
66   for(short j=0;j<columns;j++)
67     MATRIX<<setw(4)<<rand()%(upper_bound+1);
68   // random entries between 0 and upper_bound
69   MATRIX<<endl;
70 
71   MATRIX<<"rows:"<<endl;
72   MATRIX<<rows<<endl<<endl;
73 
74   // random matrix
75   MATRIX<<"matrix:"<<endl;
76   for(short i=0;i<rows;i++)
77   {
78     for(short j=0;j<columns;j++)
79       MATRIX<<setw(4)<<rand()%(upper_bound-lower_bound+1)+lower_bound;
80     // random entries between lower_bound and upper_bound
81     MATRIX<<endl;
82   }
83   MATRIX<<endl;
84 
85   MATRIX<<"positive row space vector:"<<endl;
86 
87   return 1;
88 
89 }
90 
91 
92 
93 
transportation_problem(const short & sources,const short & targets,const Integer & upper_bound,ofstream & MATRIX)94 int transportation_problem(const short& sources, const short& targets,
95                            const Integer& upper_bound, ofstream& MATRIX)
96 {
97   // check arguments
98 
99   if(sources<=0)
100   {
101     cerr<<"ERROR: int transportation_problem(const short&, const short&, \n"
102       "                         const Integer&, ofstream&):\n"
103       "first argument out of range: number of sources must be positive"
104         <<endl;
105     return 0;
106   }
107 
108   if(targets<=0)
109   {
110     cerr<<"ERROR: int transportation_problem(const short&, const short&, \n"
111       "                         const Integer&, ofstream&):\n"
112       "second argument out of range: number of targets must be positive"
113         <<endl;
114     return 0;
115   }
116 
117   if(upper_bound<0)
118   {
119     cerr<<"ERROR: int transportation_problem(const short&, const short&, \n"
120       "                         const Integer&, const Integer&, ofstream&):\n"
121       "third argument (upper bound for random cost vector entries) must be\n"
122       "nonnegative\n"<<endl;
123     return 0;
124   }
125 
126   // create test file
127 
128   MATRIX<<"MATRIX"<<endl<<endl;
129 
130   MATRIX<<"columns:"<<endl;
131   MATRIX<<sources*targets<<endl<<endl;
132 
133   // random cost vector
134   MATRIX<<"cost vector:"<<endl;
135   for(short j=0;j<sources*targets;j++)
136     MATRIX<<setw(4)<<rand()%(upper_bound+1);
137   // random entries between 0 and upper_bound
138   MATRIX<<endl;
139 
140   MATRIX<<"rows:"<<endl;
141   MATRIX<<sources+targets<<endl<<endl;
142 
143   // constraint matrix in the usual formulation of the transportation problem
144   // as an IP problem
145   MATRIX<<"matrix:"<<endl;
146 
147   for(int i=0;i<targets;i++)
148     // generate matrix
149   {
150     for(int k=0;k<targets;k++)
151       for(int j=0;j<sources;j++)
152         MATRIX<<setw(2)<<(int)(i==k);
153     MATRIX<<endl;
154   }
155 
156   for(int j=0;j<sources;j++)
157   {
158     for(int i=0;i<targets;i++)
159       for(int k=0;k<sources;k++)
160         MATRIX<<setw(2)<<(int)(j==k);
161     MATRIX<<endl;
162   }
163 
164   MATRIX<<endl;
165 
166   MATRIX<<"positive row space vector:"<<endl;
167   for(short j=0;j<sources*targets;j++)
168     MATRIX<<setw(2)<<1<<endl;
169   MATRIX<<endl;
170 
171   return 1;
172 }
173 
174 
175 
random_problems(const short & vector_dimension,const long & number_of_instances,const Integer & lower_bound,const Integer & upper_bound,ofstream & PROBLEM)176 int random_problems(const short& vector_dimension,
177                     const long& number_of_instances,
178                     const Integer& lower_bound, const Integer& upper_bound,
179                     ofstream& PROBLEM)
180 {
181   // check arguments
182 
183   if(vector_dimension<=0)
184   {
185     cerr<<"ERROR: int random_problems(const short&, const long&, \n"
186       "                         const Integer&, const Integer&, ofstream&):\n"
187       "first argument out of range: vector dimension must be positive"
188         <<endl;
189     return 0;
190   }
191 
192   if(number_of_instances<0)
193   {
194     cerr<<"ERROR: int random_problems(const short&, const long&, \n"
195       "                         const Integer&, const Integer&, ofstream&):\n"
196       "second argument out of range: number of instances must be nonnegative"
197         <<endl;
198     return 0;
199   }
200 
201   if(upper_bound<lower_bound)
202   {
203     cerr<<"ERROR: int random_problems(const short&, const long&, \n"
204       "                         const Integer&, const Integer&, ofstream&):\n"
205       "third argument (lower bound for random entries) must be less\n"
206       "or equal the fourth argument (upper bound)"<<endl;
207     return 0;
208   }
209 
210   // create random problems
211 
212   PROBLEM<<"PROBLEM"<<endl<<endl;
213 
214   PROBLEM<<"vector size:"<<endl;
215   PROBLEM<<vector_dimension<<endl<<endl;
216 
217   PROBLEM<<"number of instances:"<<endl;
218   PROBLEM<<number_of_instances<<endl<<endl;
219 
220   PROBLEM<<"right hand or initial solution vectors:"<<endl;
221   for(short i=0;i<number_of_instances;i++)
222   {
223     for(short j=0;j<vector_dimension;j++)
224       PROBLEM<<setw(4)<<rand()%(upper_bound+1);
225     // random entries between 0 and upper_bound
226     PROBLEM<<endl;
227   }
228   PROBLEM<<endl;
229 
230   return 1;
231 }
232 #endif  // TESTDATA_CC
233