Exemplo n.º 1
0
  private Bid getBidABMPsimple(double targetUtility) throws Exception {
    // Value[] lIssueIndex = new Value[nrOfIssues];
    HashMap<Integer, Value> lIssueIndex = new HashMap<Integer, Value>();
    ArrayList<Issue> issues = utilitySpace.getDomain().getIssues();
    double[] lIssueAlpha = new double[issues.size()];
    double[] lBE = new double[issues.size()];
    double[] lBTE = new double[issues.size()];
    double[] lTE = new double[issues.size()];
    double lUtility = 0, lNF = 0, lAlpha, lUtilityGap, lTotalConcession = 0;

    // ASSUMPTION: Method computes a second bid. Method proposeInitialBid is used to compute first
    // bid.
    lUtilityGap = targetUtility - utilitySpace.getUtility(myLastBid);
    for (int i = 0; i < issues.size(); i++) {
      lBE[i] =
          (Double)
              (utilitySpace
                  .getEvaluator(issues.get(i).getNumber())
                  .getEvaluation(utilitySpace, myLastBid, issues.get(i).getNumber()));
    }

    // STEP 1: Retrieve issue value for last bid and compute concession on each issue.
    int i = 0;
    for (Issue lIssue : issues) {
      lAlpha =
          (1 - utilitySpace.getWeight(lIssue.getNumber()))
              * lBE[i]; // CHECK: (1 - lBE[i]); This factor is not right??
      lNF = lNF + utilitySpace.getWeight(lIssue.getNumber()) * lAlpha;
      lIssueAlpha[i] = lAlpha;
      i++;
    }

    // Compute basic target evaluations per issue
    for (i = 0; i < issues.size(); i++) {
      lBTE[i] = lBE[i] + (lIssueAlpha[i] / lNF) * lUtilityGap;
    }

    // STEP 2: Add configuration tolerance for opponent's bid
    for (i = 0; i < issues.size(); i++) {
      lUtility =
          (Double)
              (utilitySpace
                  .getEvaluator(issues.get(i).getNumber())
                  .getEvaluation(
                      utilitySpace, ((Offer) messageOpponent).getBid(), issues.get(i).getNumber()));
      lTE[i] = (1 - CONFTOLERANCE) * lBTE[i] + CONFTOLERANCE * lUtility;
    }

    // STEP 3: Find bid in outcome space with issue target utilities corresponding with those
    // computed above.
    // ASSUMPTION: There is always a UNIQUE issue value with utility closest to the target
    // evaluation.
    // First determine new values for discrete-valued issues.
    double lEvalValue;
    int lNrOfRealIssues = 0;
    for (i = 0; i < issues.size(); i++) {
      lUtility = 1; // ASSUMPTION: Max utility = 1.
      Objective lIssue = issues.get(i);
      if (lIssue.getType() == ISSUETYPE.DISCRETE) {
        IssueDiscrete lIssueDiscrete = (IssueDiscrete) lIssue;
        for (int j = 0; j < lIssueDiscrete.getNumberOfValues(); j++) {
          lEvalValue =
              ((EvaluatorDiscrete) utilitySpace.getEvaluator(lIssue.getNumber()))
                  .getEvaluation(lIssueDiscrete.getValue(j));
          if (Math.abs(lTE[i] - lEvalValue) < lUtility) {
            //						lIssueIndex[i] = lIssueDiscrete.getValue(j);
            lIssueIndex.put(new Integer(lIssue.getNumber()), lIssueDiscrete.getValue(j));
            lUtility = Math.abs(lTE[i] - lEvalValue);
          } // if
        } // for

        lTotalConcession +=
            utilitySpace.getWeight(lIssue.getNumber())
                * (lBE[i]
                    - ((EvaluatorDiscrete) utilitySpace.getEvaluator(lIssue.getNumber()))
                        .getEvaluation((ValueDiscrete) (lIssueIndex.get(lIssue.getNumber()))));
      } else if (lIssue.getType() == ISSUETYPE.REAL) lNrOfRealIssues += 1;
    }

    // TODO: Still need to integrate integer-valued issues somewhere here. Low priority.

    // STEP 4: RECOMPUTE size of remaining concession step
    // Reason: Issue value may not provide exact match with basic target evaluation value.
    // NOTE: This recomputation also includes any concession due to configuration tolerance
    // parameter...
    // First compute difference between actual concession on issue and target evaluation.
    // TODO: Think about how to (re)distribute remaining concession over MULTIPLE real issues. In
    // car example
    // not important. Low priority.
    double lRestUtitility = lUtilityGap + lTotalConcession;
    // Distribute remaining utility of real and/or price issues. Integers still to be done. See
    // above.
    for (i = 0; i < issues.size(); i++) {
      Objective lIssue = issues.get(i);
      if (lIssue.getType() == ISSUETYPE.REAL) {
        lTE[i] += lRestUtitility / lNrOfRealIssues;
        switch (utilitySpace.getEvaluator(lIssue.getNumber()).getType()) {
          case REAL:
            EvaluatorReal lRealEvaluator =
                (EvaluatorReal) (utilitySpace.getEvaluator(lIssue.getNumber()));
            double r = lRealEvaluator.getValueByEvaluation(lTE[i]);
            //					lIssueIndex[i] = new ValueReal(r);
            lIssueIndex.put(new Integer(lIssue.getNumber()), new ValueReal(r));
            break;
          case PRICE:
            EvaluatorPrice lPriceEvaluator =
                (EvaluatorPrice) (utilitySpace.getEvaluator(lIssue.getNumber()));
            //					lIssueIndex [i] =  new ValueReal(lPriceEvaluator.getLowerBound());
            lIssueIndex.put(
                new Integer(lIssue.getNumber()), new ValueReal(lPriceEvaluator.getLowerBound()));
            Bid lTempBid = new Bid(utilitySpace.getDomain(), lIssueIndex);
            //					lIssueIndex[i] =  lPriceEvaluator.getValueByEvaluation(utilitySpace, lTempBid,
            // lTE[i]);
            lIssueIndex.put(
                new Integer(lIssue.getNumber()),
                lPriceEvaluator.getValueByEvaluation(utilitySpace, lTempBid, lTE[i]));
            break;
        }
      }
    }

    return new Bid(utilitySpace.getDomain(), lIssueIndex);
  }