0

I am trying to make clusters of sites based on their distance from each other. I am using or tools cp solver to achieve this. The program runs fine for 40 to 50 number of sites but when i try to run for about 200 sites with each cluster containing 10 sites the program gets stuck and does not give any output. I am using the cp_model for this.

Please below the code I am using :

from ortools.sat.python import cp_model
import pandas as pd,sys,os,requests,re

matrix_data = pd.read_csv(''.join([filepath,'//matrix.csv']), 
matrix = matrix_data.values.tolist()
#data = {}
#data['distance_matrix'] = []
distance_matrix = []
for i in matrix:   
    distance_matrix.append(i)

def main():
    """Entry point of the program."""
    num_nodes = len(distance_matrix)
    print('Num nodes =', num_nodes)

    # Number of groups to split the nodes, must divide num_nodes.
    num_groups = 10
    

    # Model.
    model = cp_model.CpModel()

    # Variables.
    neighbors = {}
    obj_vars = []
    obj_coeffs = []
    for n1 in range(num_nodes - 1):
        for n2 in range(n1 + 1, num_nodes):
            same = model.NewBoolVar('neighbors_%i_%i' % (n1, n2))
            neighbors[n1, n2] = same
            obj_vars.append(same)
            obj_coeffs.append(distance_matrix[n1][n2] + distance_matrix[n2][n1])

    # Number of neighborss:
    for n in range(num_nodes):
        model.Add(sum(neighbors[m, n] for m in range(n)) + 
                  sum(neighbors[n, m] for m in range(n + 1, num_nodes)) ==
                  group_size - 1)
    
    # Enforce transivity on all triplets.
    for n1 in range(num_nodes - 2):
        for n2 in range(n1 + 1, num_nodes - 1):
            for n3 in range(n2 + 1, num_nodes):
                model.Add(
                    neighbors[n1, n3] + neighbors[n2, n3] + neighbors[n1, n2] != 2)

    # Redundant constraints on total sum of neighborss.
    model.Add(sum(obj_vars) == num_groups * group_size * (group_size - 1) // 2)

    # Minimize weighted sum of arcs.
    model.Minimize(
        sum(obj_vars[i] * obj_coeffs[i] for i in range(len(obj_vars))))

    # Solve and print out the solution.
    solver = cp_model.CpSolver()
    solver.parameters.log_search_progress = True
    solver.parameters.num_search_workers = 6

    status = solver.Solve(model)
    print(solver.ResponseStats())

    visited = set()

    for g in range(num_groups):
        flonglist = []
        flatlist = []
        for n in range(num_nodes):

            if not n in visited:
                
                visited.add(n)
                output = str(n)
                
                for o in range(n + 1, num_nodes):
                    if solver.BooleanValue(neighbors[n, o]):
                        visited.add(o)
                        output += ' ' + str(o)  
                print('Group', g, ':', output)
                print(site_list)      
                break
    

if __name__ == '__main__':
    main()
    print("-- %s seconds ---" % (time.time() - start_time))

The matrix file contain the distance of sites from each other in matrix format.

need some help.

zxcv
  • 79
  • 1
  • 6

0 Answers0