Advertisement
Guest User

Untitled

a guest
May 19th, 2022
31
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 0.95 KB | None | 0 0
  1. import gurobipy as gp
  2. from gurobipy import GRB
  3.  
  4.  
  5. def solve(points):
  6.     pts_min_x = min(z[0] for z in points)
  7.     pts_min_y = min(z[1] for z in points)
  8.     offset_points = tuple((x - pts_min_x, y - pts_min_y) for x, y in points)
  9.  
  10.     model = gp.Model(f"geometric_median_{len(offset_points)}")
  11.     x, y = model.addVar(name="x"), model.addVar(name="y")
  12.     model.addConstr(0 <= x), model.addConstr(0 <= y)
  13.     D = tuple(model.addVar(name=f"d_{i}") for i in range(len(offset_points)))
  14.  
  15.     for i, (point, d) in enumerate(zip(offset_points, D)):
  16.         model.addConstr((x - point[0]) ** 2 + (y - point[1]) ** 2 <= d ** 2, f"dist_const_{i}")
  17.         model.addConstr(0 <= d)
  18.    
  19.     model.setObjective(gp.quicksum(D), GRB.MINIMIZE)
  20.     model.optimize()
  21.  
  22.     x_opt, y_opt = model.getVarByName("x").X, model.getVarByName("y").X
  23.     return x_opt + pts_min_x, y_opt + pts_min_y
  24.  
  25.  
  26. points = (
  27.     (0, 0),
  28.     (1, 4),
  29.     (3, 2)
  30. )
  31. print(solve(points))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement