SwitchObjectiveFunction.java 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package holeg.algorithm.objective_function;
  2. import holeg.model.Holon;
  3. import holeg.model.HolonObject;
  4. import holeg.model.Model;
  5. public class SwitchObjectiveFunction {
  6. //weights
  7. static double w_eb = .5, w_state = .5;
  8. static double k_eb = 1050000.f, k_state = 10000;
  9. static double squash_subtract = 1.0f / (1.f + (float) Math.exp(5.0));
  10. static public float getFitnessValueForState(Model model) {
  11. double f_eb = 0;
  12. double f_state = 0;
  13. double elementCountInNetwork = model.getAllHolonElements().size();
  14. //sum over all objects
  15. for (Holon holon : model.holons) {
  16. //weigt
  17. double w_network = holon.getAmountOfElements() / elementCountInNetwork;
  18. //f_eb
  19. double netEnergyDifference = holon.holonObjects.stream()
  20. .map(hO -> Math.abs(hO.getActualEnergy())).reduce(0.0f, Float::sum);
  21. //abs
  22. f_eb += w_network * Math.abs(netEnergyDifference);
  23. //f_state
  24. f_state += w_network * holon.holonObjects.stream().filter(HolonObject::isConsumer)
  25. .map(con -> supplyPenalty(con.getSupplyBarPercentage())).reduce(0., Double::sum);
  26. }
  27. return (float) (w_eb * squash(f_eb, k_eb) + w_state * squash(f_state, k_state));
  28. }
  29. /**
  30. * f_sup in paper
  31. *
  32. * @param supply from 0 to 1
  33. */
  34. static public double supplyPenalty(double supply) {
  35. double supplyPercentage = 100 * supply;
  36. return (supplyPercentage < 100) ? -0.5 * supplyPercentage + 50 : supplyPercentage - 100;
  37. }
  38. /**
  39. * The squashing function in paper
  40. *
  41. * @param x the input
  42. * @param kappa the corresponding kappa
  43. */
  44. static public double squash(double x, double kappa) {
  45. return 100.f / (1.0f + Math.exp(-(10.f * (x - kappa / 2.f)) / kappa)) - squash_subtract;
  46. }
  47. }