public void BoltzmannChooseAction() { double[] actionProbabilities = new double[config.ActionCount - 1]; double sumProb = 0; for (int i = 0; i < actionSet.ActionSetSize - 1; i++) { actionProbabilities[i] = Math.Exp(actionSet[i].SendQvalue(state) / Tfunction(step)); sumProb += actionProbabilities[i]; } Parallel.For(0, actionProbabilities.Length, i => { actionProbabilities[i] /= sumProb; }); double randnum = RandomMan.getRand(1.0); for (int i = 0; i < actionProbabilities.Length; i++) { if (randnum < actionProbabilities[i]) { actionNum = i; return; } else { randnum -= actionProbabilities[i]; } } }
public void CheckISFlag(int agentNumother, int iSother, int[] stepTableOther) { if (iS == iSother) { //iSCount++; if (stepTable[iS] < stepTableOther[iS]) { //iSflag = 1; } else if (stepTable[iS] == stepTableOther[iS]) { if (agentnum < agentNumother) { ; //iSflag = 1; } else if (agentnum > agentNumother) { iSCount++; //iSflag = 0; } else { iSCount += RandomMan.getRand(2); //iSflag = RandomMan.getRand(2); } } else { iSCount++; //iSflag = 0; } } }
public void Goal_determining() { memory.calcRewardStability(config.GoalNum, ref meanRewards, ref stdRewards, ref rewardCounts); memory.updateStanStepTables(ref IstepTable); Parallel.For(0, config.GoalNum, i => { FstepTable[i] = false; }); for (int j = 0; j < coopRange; j++) { double tmpIminstep = double.MaxValue; int tmpIminstepIndex = -1; for (int i = 0; i < config.GoalNum; i++) { if (IstepTable[i] <= tmpIminstep && FstepTable[i] == false) { tmpIminstep = IstepTable[i]; tmpIminstepIndex = i; } } if (tmpIminstepIndex != -1) { FstepTable[tmpIminstepIndex] = true; } } int goalNum = 0; double maxBid = 0;// bidValue[0]; for (int i = 0; i < config.GoalNum; i++) { if (maxBid < bidValue[i] && FstepTable[i]) { maxBid = bidValue[i]; goalNum = i; } } if (maxBid == 0 || RandomMan.getRand(100) < config.Randomly_Probability_of_Determination) { while (true) { int randGoalnum = RandomMan.getRand(config.GoalNum); if (FstepTable[randGoalnum]) { bidCount[randGoalnum]++; iS = randGoalnum; if (config.Communication == "OFF") { if ((meanRewards[iS] > rewardTable[iS] * 0.5) || (RandomMan.getRand(100) < 30) /* && (stdRewards[iS] < rewardTable[iS] * 0.1)/**/) { iSflag = 1; } else { iSflag = 0; /**/
/// <summary> /// 行動を選ぶメソッド /// </summary> /// <returns></returns> public void ChooseAction(bool judgeFlag) { int zeroCount = 0; if (actionNum != actionSet.ActionSetSize - 1) { pastactionNum = actionNum; } if (goalFlag == true) { actionNum = actionSet.ActionSetSize - 1; maxactionNum = actionNum; } else { for (int i = 0; i < actionSet.ActionSetSize - 1; i++) { if (actionSet[i].SendQvalue(state) == 0) { zeroCount++; } if (actionSet[actionNum].SendQvalue(state) < actionSet[i].SendQvalue(state)) { actionNum = i; } else if (actionSet[actionNum].SendQvalue(state) == actionSet[i].SendQvalue(state)) { if (RandomMan.getRand(2) > 0) { actionNum = i; } } } maxactionNum = actionNum; if (RandomMan.getRand(100) < randomNum || zeroCount == config.ActionCount - 1) { actionNum = RandomMan.getRand(actionSet.ActionSetSize - 1); } //if (judgeFlag == false) /*BoltzmannChooseAction();/**/ } }