public boolean changeOK(Moveable me, Moveable fOld, Moveable fNew, Moveable bNew) { // fOld: front veh on old lane; // fNew,bNew: front,back vehicle on new lane; double gapFront = fNew.position() - me.position() - me.length(); if (gapFront <= gapMin) { return false; } double gapBack = me.position() - bNew.position() - bNew.length(); if (gapBack <= gapMin) { return false; } // safety criterion (a>-bsave); double bNew_acc = bNew.model().calcAcc(bNew, me); if (bNew_acc < -bsave) { return false; } double my_acc = me.model().calcAcc(me, fNew); if (my_acc < -bsaveSelf) { return false; } // incentive criterion (always model of BACK vehicle used!!) // works also for on-ramp: on-ramp has 1 lane with index 0 // === LEFT on main road -> strong desired to change = // large positive biasRight for lcModel of ramp vehicles double my_adv = my_acc - me.model().calcAcc(me, fOld) + ((me.lane() == LEFT) ? 1 : -1) * biasRight; double others_disadv = bNew.model().calcAcc(bNew, fNew) - bNew_acc; if (others_disadv < 0) { others_disadv = 0; } return my_adv - p * others_disadv > db ? true : false; }