source: trunk/Clp/examples/network.cpp

Last change on this file was 2278, checked in by forrest, 9 months ago

COIN_BIG_INDEX 2 changes

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 5.8 KB
Line 
1/* $Id: network.cpp 2278 2017-10-02 09:51:14Z forrest $ */
2// Copyright (C) 2002, International Business Machines
3// Corporation and others.  All Rights Reserved.
4// This code is licensed under the terms of the Eclipse Public License (EPL).
5
6
7// The point of this example is to show how to create a model without
8// using mps files.
9
10// This reads a network problem created by netgen which can be
11// downloaded from www.netlib.org/lp/generators/netgen
12// This is a generator due to Darwin Klingman
13
14#include "ClpSimplex.hpp"
15#include "ClpFactorization.hpp"
16#include "ClpNetworkMatrix.hpp"
17#include <stdio.h>
18#include <assert.h>
19#include <cmath>
20
21int main(int argc, const char *argv[])
22{
23     int numberColumns;
24     int numberRows;
25
26     FILE * fp;
27     if (argc > 1) {
28          fp = fopen(argv[1], "r");
29          if (!fp) {
30               fprintf(stderr, "Unable to open file %s\n", argv[1]);
31               exit(1);
32          }
33     } else {
34          fp = fopen("input.130", "r");
35          if (!fp) {
36               fprintf(stderr, "Unable to open file input.l30 in Samples directory\n");
37               exit(1);
38          }
39     }
40     int problem;
41     char temp[100];
42     // read and skip
43     fscanf(fp, "%s", temp);
44     assert(!strcmp(temp, "BEGIN"));
45     fscanf(fp, "%*s %*s %d %d %*s %*s %d %*s", &problem, &numberRows,
46            &numberColumns);
47     // scan down to SUPPLY
48     while (fgets(temp, 100, fp)) {
49          if (!strncmp(temp, "SUPPLY", 6))
50               break;
51     }
52     if (strncmp(temp, "SUPPLY", 6)) {
53          fprintf(stderr, "Unable to find SUPPLY\n");
54          exit(2);
55     }
56     // get space for rhs
57     double * lower = new double[numberRows];
58     double * upper = new double[numberRows];
59     int i;
60     for (i = 0; i < numberRows; i++) {
61          lower[i] = 0.0;
62          upper[i] = 0.0;
63     }
64     // ***** Remember to convert to C notation
65     while (fgets(temp, 100, fp)) {
66          int row;
67          int value;
68          if (!strncmp(temp, "ARCS", 4))
69               break;
70          sscanf(temp, "%d %d", &row, &value);
71          upper[row-1] = -value;
72          lower[row-1] = -value;
73     }
74     if (strncmp(temp, "ARCS", 4)) {
75          fprintf(stderr, "Unable to find ARCS\n");
76          exit(2);
77     }
78     // number of columns may be underestimate
79     int * head = new int[2*numberColumns];
80     int * tail = new int[2*numberColumns];
81     int * ub = new int[2*numberColumns];
82     int * cost = new int[2*numberColumns];
83     // ***** Remember to convert to C notation
84     numberColumns = 0;
85     while (fgets(temp, 100, fp)) {
86          int iHead;
87          int iTail;
88          int iUb;
89          int iCost;
90          if (!strncmp(temp, "DEMAND", 6))
91               break;
92          sscanf(temp, "%d %d %d %d", &iHead, &iTail, &iCost, &iUb);
93          iHead--;
94          iTail--;
95          head[numberColumns] = iHead;
96          tail[numberColumns] = iTail;
97          ub[numberColumns] = iUb;
98          cost[numberColumns] = iCost;
99          numberColumns++;
100     }
101     if (strncmp(temp, "DEMAND", 6)) {
102          fprintf(stderr, "Unable to find DEMAND\n");
103          exit(2);
104     }
105     // ***** Remember to convert to C notation
106     while (fgets(temp, 100, fp)) {
107          int row;
108          int value;
109          if (!strncmp(temp, "END", 3))
110               break;
111          sscanf(temp, "%d %d", &row, &value);
112          upper[row-1] = value;
113          lower[row-1] = value;
114     }
115     if (strncmp(temp, "END", 3)) {
116          fprintf(stderr, "Unable to find END\n");
117          exit(2);
118     }
119     printf("Problem %d has %d rows and %d columns\n", problem,
120            numberRows, numberColumns);
121     fclose(fp);
122     ClpSimplex  model;
123     // now build model - we have rhs so build columns - two elements
124     // per column
125
126     double * objective = new double[numberColumns];
127     double * lowerColumn = new double[numberColumns];
128     double * upperColumn = new double[numberColumns];
129
130     double * element = new double [2*numberColumns];
131     CoinBigIndex * start = new CoinBigIndex[numberColumns+1];
132     int * row = new int[2*numberColumns];
133     start[numberColumns] = 2 * numberColumns;
134     for (i = 0; i < numberColumns; i++) {
135          start[i] = 2 * i;
136          element[2*i] = -1.0;
137          element[2*i+1] = 1.0;
138          row[2*i] = head[i];
139          row[2*i+1] = tail[i];
140          lowerColumn[i] = 0.0;
141          upperColumn[i] = ub[i];
142          objective[i] = cost[i];
143     }
144     // Create Packed Matrix
145     CoinPackedMatrix matrix;
146     int * lengths = NULL;
147     matrix.assignMatrix(true, numberRows, numberColumns,
148                         2 * numberColumns, element, row, start, lengths);
149     ClpNetworkMatrix network(matrix);
150     // load model
151
152     model.loadProblem(network,
153                       lowerColumn, upperColumn, objective,
154                       lower, upper);
155
156     delete [] lower;
157     delete [] upper;
158     delete [] head;
159     delete [] tail;
160     delete [] ub;
161     delete [] cost;
162     delete [] objective;
163     delete [] lowerColumn;
164     delete [] upperColumn;
165     delete [] element;
166     delete [] start;
167     delete [] row;
168
169     /* The confusing flow below is in to exercise both dual and primal
170        when ClpNetworkMatrix storage used.
171
172        For practical use just one call e.g. model.dual(); would be used.
173
174        If network then factorization scheme is changed
175        to be much faster.
176
177        Still not as fast as a real network code, but more flexible
178     */
179     model.factorization()->maximumPivots(200 + model.numberRows() / 100);
180     model.factorization()->maximumPivots(1000);
181     //model.factorization()->maximumPivots(1);
182     if (model.numberRows() < 50)
183          model.messageHandler()->setLogLevel(63);
184     model.dual();
185     model.setOptimizationDirection(-1);
186     //model.messageHandler()->setLogLevel(63);
187     model.primal();
188     model.setOptimizationDirection(1);
189     model.primal();
190     return 0;
191}
Note: See TracBrowser for help on using the repository browser.