私のプログラムでは、リスト要素がnullの影響を受ける可能性があることを理解できません。要件リストで呼び出し階層を実行すると、次のようになります。
1:
private void checkCompletion(int bidId){
Bid bid = BidOperation.removeBid(getRunningAgrts(), bidId);
BidOperation.addBidToList(getExecutedRes(), bid);
if (BidOperation.difference(getRequirements(),
getExecutedRes()).size() == 0){
finishExecution();
SimTable.incrementSucessRate();
}
}
2 :
public boolean checkFirstSetComplete(){
if (BidOperation.difference(getRequirements(),
getTentAndFinaPartialRes()).size() == 0)
return true;
else return false;
}
3 :
boolean equality2 = BidOperation.equality(bid.getResourceList(),
getRequirements());
4 :
protected double expectedCost(){
double sum = 0;
for (ResChar elt : getRequirements()){
sum += elt.getNbCopies() * elt.getUnitCost() * usageTime();
}
return sum;
}
5 :
public Bid generateOffer(Integer sellerId, List<ResChar> sellerSpec){
...
if ((getFullFinalAgrts().size() + getFullTentAgrts().size() == 0) &&
(BidOperation.difference(getRequirements(), sellerSpec).size() == 0))
...
}
6 :
private boolean intersectSellerBuyer(List<ResChar> sellerRes){
for (ResChar sellerResource : sellerRes){
for (ResChar buyerResource : getRequirements()){
if (sellerResource.getTypeId() == buyerResource.getTypeId()){
return true;
}
}
}
return false;
}
7 :
private void mainLoop(){
int t = (int)CloudSim.clock();
for ( Map.Entry<Integer, List<ResChar>> entry : sellerCharacteristicsList.entrySet()){
if (intersectSellerBuyer(entry.getValue()) &&
!negociateWithSeller(entry.getKey())){
sendNow(entry.getKey(), CSBTs.BUYER_OFFER,
generateOffer (entry.getKey(),entry.getValue()));
}
}
if ((estpB != -1) && (t > estpB)){
decommitAndOrCancelAllPartialBids(t);
}
if (t > tBK){
k--; tBK = (bTimes.getDlB() - t) / k + t;
if (BidOperation.difference(getRequirements(),
getTentAndFinaPartialRes()).size() > 0){
decommitAndOrCancelAllPartialBids(t);
}
}
}
8:
private double partDenominator(){
double sum = 0;
for (ResChar elt : getRequirements()){
sum += elt.getNbCopies() * unitCost(elt) * BidOperation.ratio(elt);
}
return sum;
}
9 :
private boolean runningTask(){
boolean runningTask = false;
if (isRunningTask())
return true;
else if (BidOperation.difference(getRequirements(), getRunningRes()).size() == 0){
System.out.println("The running resource :" +getRunningRes().size());
System.out.println("The requirements :" +getRequirements().size());
setRunningTask(true);
runningTask = true;
}
return runningTask;
}
そして最後に BidOperation.diferrence メソッド:
public static List<ResChar> difference(List<ResChar> list1, List<ResChar> list2){
ResourceList list = new ResourceList(list1);
Iterator<ResChar> listItr = list.resourceList.listIterator();
Iterator<ResChar> listItr2 = list2.listIterator();
int diff;
while (listItr.hasNext()){
ResChar elt = listItr.next();
while (listItr2.hasNext()){
ResChar elt2 = listItr2.next();
if (elt2.getTypeId() == elt.getTypeId()){
diff = elt.getNbCopies() - elt2.getNbCopies();
if (diff > 0)
elt.setNbCopies(diff);
else
listItr.remove();
break;
}
}
}
return list.resourceList;
}
最後の方法は、要件リストを直接変更しないために使用されます。そのため、コピー コンストラクターを使用しました。ランタイム中の要件要素への null の非常に混乱した割り当てを説明するのに十分な時間を誰かに教えてもらえますか?
ありがとうございました。