Esempio n. 1
0
	void print() {
		for (int i = 0; i < n; i++) {
			int m = e[i]->getVal();
			printf("e_%d = %d, ", i, m);
		}
		printf("\n");
		printf("Stacks = %d\n\n", stacks->getVal());
	}
Esempio n. 2
0
	bool propagate() {
		for (int i = 0; i < new_fixed.size(); i++) {
			int r = new_fixed[i]/p.m;
			int c = new_fixed[i]%p.m;
			if (TEST && r != row) {
				row = r;
				printf("Processing %dth row\n", (int) row);
			}
			if (r != row) {
				printf("r = %d, c = %d\n", r, c);
				for (int i = 0; i < p.n; i++) {
					for (int j = 0; j < p.m; j++) {
						if (p.x[i][j]->isFixed()) printf("%d, ", p.x[i][j]->getVal());
						else printf("?, ");
					}
					printf("\n");
				}
				printf("\n");
			}


			assert(r == row);
			IntVar *v = p.x[r][c];
			for (int j = 0; j < p.m; j++) {
				if (!fixed[row][j]) continue;
				if (p.x[row][j]->getVal() != v->getVal()) continue;
				int s, b;
				if (j < c) { s = j; b = c; }
				else       { s = c; b = j; }
				int size1 = (1<<s), size2 = (1<<(b-s-1)), size3 = (1<<(p.m-b-1));
				for (int v3 = 0; v3 < size3; v3++) {
					for (int v2 = 0; v2 < size2; v2++) {
						for (int v1 = 0; v1 < size1; v1++) {
							int z = v1 + (1<<s) + (v2<<(s+1)) + (1<<b) + (v3<<(b+1));
							counts[z] = counts[z] + 1;
							if (counts[z] > limits[row+1][set_sizes[z]]) {
								printf("z = %d %x, counts[z] = %d\n", z, z, (int) counts[z]);
								printf("row+1 = %d, set_sizes[z] = %d, limit = %d\n", row+1, set_sizes[z], limits[row+1][set_sizes[z]]);
								return false;
							}
						}
					}
				}
			}
			fixed[r][c] = 1;
		}
		bool finished_row = true;
		for (int j = 0; j < p.m; j++) {
			if (!p.x[row][j]->isFixed()) { finished_row = false; break; }
		}
		if (finished_row) row = row + 1;
		return true;
	}
Esempio n. 3
0
  void print() {
#if 1
    for(int act = 0; act < acts; act++)
    {
      printf("[");
      for(int ss = 0; ss < shifts; ss++)
      {
        printf("%d",demand[ss][act]);
      }
      printf("]\n");
    }
#endif
    printf("Hours worked: %f\n",1.0*cost->getVal()/4);
    for(int ww = 0; ww < xv.size(); ww++)
    {
      printf("[");
      for (int ii = 0; ii < shifts; ii++ )
      {
//        if(ii)
//            printf(", ");
        int val(xv[ww][ii]->getVal());
        if(val < acts)
        {
          printf("%d",val);
        } else {
          switch(val - acts)
          {
#ifdef DISTINCT_REST
            case G_R:
              printf("R");
              break;
            case G_B:
              printf("B");
              break;
            case G_L:
              printf("L");
              break;
#else
            case G_R:
              printf("R");
              break;
            default:
              assert(0);
              break;
#endif
          }
        }
      }
      printf("]\n");
    }
  }