/home/coin/SVN-release/OS-2.4.0/Bcp/examples/MaxCut/Generators/gen3.cpp

Go to the documentation of this file.
00001 // Copyright (C) 2000, International Business Machines
00002 // Corporation and others.  All Rights Reserved.
00003 /* This gnerator generates $Q_{maxw,dens}$ :
00004 */
00005 
00006 #include <cstdio>
00007 #include <cstdlib>
00008 #include <algorithm>
00009 
00010 int
00011 main(int argc, char* argv[])
00012 {
00013    if (argc != 5) {
00014       printf("Usage: gen3 <nodenum> <density> <maxweight> <seed>\n");
00015       return -1;
00016    }
00017 
00018    int i, j, k;
00019 
00020    const int    num  = atoi(argv[1]);
00021    const double dens = atof(argv[2]);
00022    const int    maxw = atoi(argv[3]);
00023    const int    seed = atoi(argv[4]);
00024 
00025    srand48(seed);
00026 
00027    const int maxedgenum = (num*(num-1)) / 2;
00028    int * pick = new int[maxedgenum];
00029    k = 0;
00030    for (i = 0; i < num; ++i) {
00031       for (j = i + 1; j < num; ++j) {
00032          pick[k++] = (i << 16) + j;
00033       }
00034    }
00035 
00036    random_shuffle(pick, pick + maxedgenum);
00037    const int edgenum = static_cast<int>(maxedgenum * dens);
00038 
00039    printf("%i %i\n", num + 1, num + edgenum);
00040 
00041    double *matrix = new double[num * num];
00042    for (i = 0; i < num; ++i)
00043       matrix[i*num+i] = (2*maxw+1)*drand48() - maxw;
00044 
00045    for (k = 0; k < edgenum; ++k) {
00046       const int i = pick[k] >> 16;
00047       const int j = pick[k] & 0xffff;
00048       matrix[i*num+j] = matrix[j*num+i] = (2*maxw+1)*drand48() - maxw;
00049    }
00050    for (; k < edgenum; ++k) {
00051       const int i = pick[k] >> 16;
00052       const int j = pick[k] & 0xffff;
00053       matrix[i*num+j] = matrix[j*num+i] = 0.0;
00054    }
00055 
00056    for (i = 0; i < num; ++i) {
00057       double sum = 2 * matrix[i*num+i];
00058       for (j = 0; j < i; ++j)
00059          sum += matrix[i*num+j];
00060       for (j = i+1; j < num; ++j)
00061          sum += matrix[i*num+j];
00062       matrix[i*num+i] = sum;
00063    }
00064 
00065    for (i = 0; i < num; ++i) {
00066       printf("%3i %3i %i\n", 0, i+1, static_cast<int>(matrix[i*num+i]));
00067    }
00068    for (i = 0; i < num; ++i) {
00069       for (j = i+1; j < num; ++j) {
00070          if (matrix[i*num+j] != 0.0) {
00071             printf("%3i %3i %i\n", i+1,j+1, static_cast<int>(matrix[i*num+j]));
00072          }
00073       }
00074    }
00075 
00076    return 0;
00077 }

Generated on Thu Sep 22 03:05:50 2011 by  doxygen 1.4.7