|
@@ -1,10 +1,12 @@
|
|
package psoAlgoCode;
|
|
package psoAlgoCode;
|
|
|
|
|
|
|
|
+import java.util.ArrayList;
|
|
import java.util.Vector;
|
|
import java.util.Vector;
|
|
|
|
|
|
import classes.AbstractCpsObject;
|
|
import classes.AbstractCpsObject;
|
|
import classes.HolonElement;
|
|
import classes.HolonElement;
|
|
import classes.HolonObject;
|
|
import classes.HolonObject;
|
|
|
|
+import classes.SubNet;
|
|
import ui.controller.Control;
|
|
import ui.controller.Control;
|
|
import ui.model.Model;
|
|
import ui.model.Model;
|
|
|
|
|
|
@@ -45,7 +47,13 @@ public class SGFunctions {
|
|
implementState();
|
|
implementState();
|
|
HelpFunctions.calculateStateForTimeStepPSO(model, control);
|
|
HelpFunctions.calculateStateForTimeStepPSO(model, control);
|
|
double value = 0.0;
|
|
double value = 0.0;
|
|
- for (AbstractCpsObject obj : model.getObjectsOnCanvas()) {
|
|
|
|
|
|
+
|
|
|
|
+ //int nrOfSubnets = control.getSimManager().getSubNets().size();
|
|
|
|
+ //System.out.println("nr of subnets: " + nrOfSubnets);
|
|
|
|
+ networkFitness();
|
|
|
|
+ value += holonObjectFitness();
|
|
|
|
+
|
|
|
|
+ /*for (AbstractCpsObject obj : model.getObjectsOnCanvas()) {
|
|
if (obj instanceof HolonObject) {
|
|
if (obj instanceof HolonObject) {
|
|
int state = ((HolonObject) obj).getState();
|
|
int state = ((HolonObject) obj).getState();
|
|
double suppliedPerc = ((HolonObject) obj).getSuppliedPercentage();
|
|
double suppliedPerc = ((HolonObject) obj).getSuppliedPercentage();
|
|
@@ -74,19 +82,110 @@ public class SGFunctions {
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
- }
|
|
|
|
|
|
+ }*/
|
|
return value;
|
|
return value;
|
|
}
|
|
}
|
|
|
|
|
|
- // Check the amount of HolonElements that are active
|
|
|
|
- private int elementsActive(HolonObject obj) {
|
|
|
|
- int counter = 0;
|
|
|
|
- for (HolonElement ele : obj.getElements()) {
|
|
|
|
- if (ele.isActive()) {
|
|
|
|
- counter++;
|
|
|
|
|
|
+ /**
|
|
|
|
+ * Calculates a fitness value for the overall abstract network
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private double networkFitness() {
|
|
|
|
+ double result = 0.0;
|
|
|
|
+ ArrayList<SubNet> tmp_sn = control.getSimManager().getSubNets();
|
|
|
|
+ int totalNrOfObjects = model.getObjectsOnCanvas().size();
|
|
|
|
+
|
|
|
|
+ System.out.println("Total number of objects is: " + totalNrOfObjects);
|
|
|
|
+ for (SubNet subNet : tmp_sn) {
|
|
|
|
+ System.out.println("Subnetsize: " + (subNet.getObjects().size()));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * Calculate a fitnessvalue concerned with the performance of individual holons of the network
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private double holonFitness() {
|
|
|
|
+ double result = 0.0;
|
|
|
|
+
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+ /**
|
|
|
|
+ * Calculates a fitnessvalue for the individual holon objects in the holons
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private double holonObjectFitness() {
|
|
|
|
+ double result = 0.0;
|
|
|
|
+ ArrayList<AbstractCpsObject> objList = model.getObjectsOnCanvas();
|
|
|
|
+ System.out.println("total consumption works: " + control.getTotalConsumption(objList));
|
|
|
|
+ //TODO Annoying as fuck... think think
|
|
|
|
+ for (AbstractCpsObject obj : objList) {
|
|
|
|
+ if (obj instanceof HolonObject) {
|
|
|
|
+ float supply = ((HolonObject) obj).getCurrentSupply();
|
|
|
|
+ float energy =((HolonObject) obj).getMaxActiveEnergy();
|
|
|
|
+ float suppPercentage = ((HolonObject) obj).getSuppliedPercentage();
|
|
|
|
+ float ownProduction = ((HolonObject) obj).getSelfMadeEnergy(model.getCurIteration());
|
|
|
|
+ float maxEnergy = ((HolonObject) obj).getMaxPossibleConsumption();
|
|
|
|
+
|
|
|
|
+ System.out.println(obj.getName());
|
|
|
|
+ if(!(obj.getName().contains("Plant"))) {
|
|
|
|
+ result += holonObjectSupplyPenaltyFunction(suppPercentage);
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+ result += inactiveHolonElementPenalty((HolonObject)obj);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ System.out.println("min ele" + ((HolonObject) obj).getMinimalConsumingElement().toString());
|
|
|
|
+ //if(((HolonObject) obj).getCurrentEnergyAtTimeStep(model.getCurIteration())/maxEnergy <;
|
|
|
|
+
|
|
|
|
+ System.out.println("Own production: " + ownProduction + "Provided Supply and energy: " + supply + " and " + energy + " with total possible energy: " + maxEnergy
|
|
|
|
+ + " is supply percentage: " + suppPercentage);
|
|
}
|
|
}
|
|
|
|
+
|
|
}
|
|
}
|
|
- return counter;
|
|
|
|
|
|
+
|
|
|
|
+ return result;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * Calculates a penalty value based on the HOs current supply percentage
|
|
|
|
+ * @param supplyPercentage
|
|
|
|
+ * @return
|
|
|
|
+ */
|
|
|
|
+ private double holonObjectSupplyPenaltyFunction(float supplyPercentage) {
|
|
|
|
+ float result = 0;
|
|
|
|
+ if(supplyPercentage == 1)
|
|
|
|
+ return result;
|
|
|
|
+ else if(supplyPercentage < 1 && supplyPercentage >= 0.25)
|
|
|
|
+ result = 100/supplyPercentage;
|
|
|
|
+ else if (supplyPercentage < 0.25)
|
|
|
|
+ result = 100/supplyPercentage * 2; //Scalar value might be problematic for large/specific examples
|
|
|
|
+ else if (supplyPercentage < 1.25)
|
|
|
|
+ result = 100 * supplyPercentage *2 ;
|
|
|
|
+ else result = 100 * supplyPercentage * 3;
|
|
|
|
+ if(Float.isInfinite(result) || Float.isNaN(result))
|
|
|
|
+ result = 10000;
|
|
|
|
+ System.out.println("Low penalty function value: " + result + " with supply value: " + supplyPercentage);
|
|
|
|
+ return result;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+ private double inactiveHolonElementPenalty(HolonObject obj) {
|
|
|
|
+ float result = 0;
|
|
|
|
+ int activeElements = obj.getNumberOfActiveElements();
|
|
|
|
+ int maxElements = obj.getElements().size();
|
|
|
|
+
|
|
|
|
+ if(activeElements == maxElements)
|
|
|
|
+ result =0;
|
|
|
|
+ else if(activeElements == 0) {
|
|
|
|
+ result = 10000;
|
|
|
|
+ }else result = ((maxElements -activeElements)*600);
|
|
|
|
+
|
|
|
|
+ return result;
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
|
|
}
|
|
}
|