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); }