Exemplo n.º 1
0
  protected void convert(Linear linear, IloLinearNumExpr lin, Map<Object, IloNumVar> varToNum)
      throws IloException {
    for (Term term : linear) {
      Number coeff = term.getCoefficient();
      Object variable = term.getVariable();

      IloNumVar num = varToNum.get(variable);
      lin.addTerm(coeff.doubleValue(), num);
    }
  }
  @Override
  protected CPlexVariables makeModel(IloCplex cplex, int[] order) throws IloException {
    QAInstanceSampled orderedInst = _instSampled.reorder(order);
    int agentIndex = orderedInst.getAgentIndex();
    int agentImpressions = orderedInst.getImpressions();

    // System.out.println(Arrays.toString(_instanceExact.getAvgPos()));
    // System.out.println(Arrays.toString(orderedInst.getAvgPos()));

    int advertisers = orderedInst.getNumAdvetisers();
    int slots = orderedInst.getNumSlots();
    int M = orderedInst.getImpressionsUB();

    double[] avgPos = orderedInst.getAvgPos();
    double[] avgPosLB = orderedInst.getAvgPosLB();
    double[] avgPosUB = orderedInst.getAvgPosUB();

    double[] I_a = new double[advertisers];
    Arrays.fill(I_a, -1);

    I_a[agentIndex] = orderedInst.getImpressions();

    int[] minDropOut = new int[advertisers];
    int[] maxDropOut = new int[advertisers];

    // set default values
    for (int a = 0; a < advertisers; a++) {
      int ceilingSlot = ((int) Math.ceil(avgPosUB[a])) - 1;
      int floorSlot = ((int) Math.floor(avgPosLB[a])) - 1;
      if (ceilingSlot - floorSlot == 0 && (ceilingSlot == a || floorSlot == slots - 1)) {
        minDropOut[a] = ceilingSlot;
      } else {
        minDropOut[a] = 0; // 0 becouse 0 is the top slot, slots are 0 indexed like agents
      }
      maxDropOut[a] = Math.min(Math.min(a, slots - 1), floorSlot);
    }

    System.out.println(Arrays.toString(avgPosLB));
    System.out.println(Arrays.toString(avgPosUB));
    System.out.println(Arrays.toString(minDropOut));
    System.out.println(Arrays.toString(maxDropOut));

    // -------------------------------- CREATE DECISION VARIABLES
    // -------------------------------------
    CPlexVariables vars = makeModelVariables(cplex, advertisers, M);

    postDropoutConstraints(cplex, vars, advertisers, M, minDropOut, maxDropOut);

    postCascadeConstraints(cplex, vars, advertisers, slots);

    // System.out.println(agentIndex+" - "+agentImpressions);
    cplex.addEq(vars.T_a[agentIndex], agentImpressions);

    for (int a = 0; a < advertisers; a++) {

      IloLinearNumExpr lhs = cplex.linearNumExpr();
      for (int s = 0; s <= Math.min(a, slots - 1); s++) {
        lhs.addTerm(s + 1, vars.I_a_s[a][s]);
      }

      if (a == agentIndex) {
        IloNumExpr rhs = cplex.prod(avgPos[a], vars.T_a[a]);
        cplex.addEq(lhs, rhs);
      } else {
        IloNumExpr rhs;
        rhs = cplex.prod(avgPosLB[a], vars.T_a[a]);
        cplex.addGe(lhs, rhs);

        rhs = cplex.prod(avgPosUB[a], vars.T_a[a]);
        cplex.addLe(lhs, rhs);
      }
    }

    // -------------------------------- CREATE OBJECTIVE FUNCITON
    // -------------------------------------
    // postObjective(cplex, vars, effectiveNumAgents, bestObj);
    postObjective(cplex, vars, advertisers, slots, M);

    return vars;
  }