model is infeasible or unbounded
AnsweredHi there,
I have built up a simple trajectory optimization model which minimize the acceleration rate given fixed initial time step and speed, and final time step and speed. The model itself looks straightforward and the lp file I output looks fine to me. Nevertheless, Gurobipy still say the model is infeasible and unbounded. Below is my code and lp output. Thank you very much for you time and help.
def trajectory(initialSpeed, finalSpeed, timesteps, distance):
m = gp.Model("trajectory")
# claim speed variable set
v0 = m.addVars(timesteps,vtype = GRB.CONTINUOUS, name = "speed")
# define objective function, minimize the accelration rate
obj = gp.quicksum((v0[i + 1] - v0[i]) * (v0[i + 1] - v0[i]) for i in range(len(v0) - 1))
m.setObjective(obj, GRB.MINIMIZE)
# acceleration capacity limit for a vehicle
m.addConstrs((v0[i + 1] - v0[i] <= 2 for i in range(len(v0)-1)), name ="upperacc")
m.addConstrs((v0[i + 1] - v0[i] >= -1.4 for i in range(len(v0) - 1)), name="loweracc")
# fixed initial speed and final speed
m.addLConstr(v0[0], GRB.EQUAL, initialSpeed, name ="initialSpeed")
m.addLConstr(v0[len(v0)-1], GRB.EQUAL, finalSpeed, name ="finalSpeed")
# speed limits
m.addConstrs((v0[i] <=30 for i in range(len(v0))) , name ="upperspeedlimits")
m.addConstrs((v0[i] >=0 for i in range(len(v0))) , name = "lowerspeedlimits")
m.addConstr(gp.quicksum(v0[i] for i in range(len(v0))) == distance, name = "distance")
m.write("test.lp")
m.optimize()
for v in m.getVars():
print('%s %g' % (v.varName, v.x))
print('Obj: %g' % m.objVal)
#test run
trajectory(25,10,15,200)
-----------------------------------------------------------------------
LP FILE
\ Model trajectory
\ LP format - for model browsing. Use MPS format to capture full model detail.
Minimize
[ - 4 speed[0] * speed[1] + 2 speed[0] ^2 + 4 speed[1] ^2
- 4 speed[1] * speed[2] + 4 speed[2] ^2 - 4 speed[2] * speed[3]
+ 4 speed[3] ^2 - 4 speed[3] * speed[4] + 4 speed[4] ^2
- 4 speed[4] * speed[5] + 4 speed[5] ^2 - 4 speed[5] * speed[6]
+ 4 speed[6] ^2 - 4 speed[6] * speed[7] + 4 speed[7] ^2
- 4 speed[7] * speed[8] + 4 speed[8] ^2 - 4 speed[8] * speed[9]
+ 4 speed[9] ^2 - 4 speed[9] * speed[10] + 4 speed[10] ^2
- 4 speed[10] * speed[11] + 4 speed[11] ^2 - 4 speed[11] * speed[12]
+ 4 speed[12] ^2 - 4 speed[12] * speed[13] + 4 speed[13] ^2
- 4 speed[13] * speed[14] + 2 speed[14] ^2 ] / 2
Subject To
upperacc[0]: - speed[0] + speed[1] <= 2
upperacc[1]: - speed[1] + speed[2] <= 2
upperacc[2]: - speed[2] + speed[3] <= 2
upperacc[3]: - speed[3] + speed[4] <= 2
upperacc[4]: - speed[4] + speed[5] <= 2
upperacc[5]: - speed[5] + speed[6] <= 2
upperacc[6]: - speed[6] + speed[7] <= 2
upperacc[7]: - speed[7] + speed[8] <= 2
upperacc[8]: - speed[8] + speed[9] <= 2
upperacc[9]: - speed[9] + speed[10] <= 2
upperacc[10]: - speed[10] + speed[11] <= 2
upperacc[11]: - speed[11] + speed[12] <= 2
upperacc[12]: - speed[12] + speed[13] <= 2
upperacc[13]: - speed[13] + speed[14] <= 2
loweracc[0]: - speed[0] + speed[1] >= -1.4
loweracc[1]: - speed[1] + speed[2] >= -1.4
loweracc[2]: - speed[2] + speed[3] >= -1.4
loweracc[3]: - speed[3] + speed[4] >= -1.4
loweracc[4]: - speed[4] + speed[5] >= -1.4
loweracc[5]: - speed[5] + speed[6] >= -1.4
loweracc[6]: - speed[6] + speed[7] >= -1.4
loweracc[7]: - speed[7] + speed[8] >= -1.4
loweracc[8]: - speed[8] + speed[9] >= -1.4
loweracc[9]: - speed[9] + speed[10] >= -1.4
loweracc[10]: - speed[10] + speed[11] >= -1.4
loweracc[11]: - speed[11] + speed[12] >= -1.4
loweracc[12]: - speed[12] + speed[13] >= -1.4
loweracc[13]: - speed[13] + speed[14] >= -1.4
initialSpeed: speed[0] = 25
finalSpeed: speed[14] = 10
upperspeedlimits[0]: speed[0] <= 30
upperspeedlimits[1]: speed[1] <= 30
upperspeedlimits[2]: speed[2] <= 30
upperspeedlimits[3]: speed[3] <= 30
upperspeedlimits[4]: speed[4] <= 30
upperspeedlimits[5]: speed[5] <= 30
upperspeedlimits[6]: speed[6] <= 30
upperspeedlimits[7]: speed[7] <= 30
upperspeedlimits[8]: speed[8] <= 30
upperspeedlimits[9]: speed[9] <= 30
upperspeedlimits[10]: speed[10] <= 30
upperspeedlimits[11]: speed[11] <= 30
upperspeedlimits[12]: speed[12] <= 30
upperspeedlimits[13]: speed[13] <= 30
upperspeedlimits[14]: speed[14] <= 30
lowerspeedlimits[0]: speed[0] >= 0
lowerspeedlimits[1]: speed[1] >= 0
lowerspeedlimits[2]: speed[2] >= 0
lowerspeedlimits[3]: speed[3] >= 0
lowerspeedlimits[4]: speed[4] >= 0
lowerspeedlimits[5]: speed[5] >= 0
lowerspeedlimits[6]: speed[6] >= 0
lowerspeedlimits[7]: speed[7] >= 0
lowerspeedlimits[8]: speed[8] >= 0
lowerspeedlimits[9]: speed[9] >= 0
lowerspeedlimits[10]: speed[10] >= 0
lowerspeedlimits[11]: speed[11] >= 0
lowerspeedlimits[12]: speed[12] >= 0
lowerspeedlimits[13]: speed[13] >= 0
lowerspeedlimits[14]: speed[14] >= 0
distance: speed[0] + speed[1] + speed[2] + speed[3] + speed[4] + speed[5]
+ speed[6] + speed[7] + speed[8] + speed[9] + speed[10] + speed[11]
+ speed[12] + speed[13] + speed[14] = 200
Bounds
End
-----------------------------------------------------------------------
-
Official comment
This post is more than three years old. Some information may not be up to date. For current information, please check the Gurobi Documentation or Knowledge Base. If you need more help, please create a new post in the community forum. Or why not try our AI Gurobot?. -
Hi Shaojie -
First, you need to determine if the model is infeasible or unbounded. If you have a look at the documentation for Optimization Status Codes, you'll see:
> INF_OR_UNBD 4 Model was proven to be either infeasible or unbounded. To obtain a more definitive conclusion, set the DualReductions parameter to 0 and reoptimize.
If the model is infeasible, then you can follow the Knowledge Base article How do I determine why my model is infeasible? to determine the cause of the infeasibility.
Gwyneth
0 -
Thank you very much Gwyneth, I will try your suggestion out.
0
Post is closed for comments.
Comments
3 comments