Python Forum
Code freez if more inputs - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Code freez if more inputs (/thread-39696.html)



Code freez if more inputs - kiko058 - Mar-28-2023

Hello I found this code. The code should calculate how to divide given lengths into pieces with the smallest possible waste, based on the specified lengths and quantities. For example, if I have a list of required pieces and I know that only 6,000mm pieces are available in stock, I need to divide them into 6,000mm-long pieces with the smallest possible waste.

The problem is that the code works excellently for a smaller number of pieces, but sometimes just one extra piece causes the program to freeze and not complete the calculation.

Can you please advise me on how to make the program able to calculate even with a larger number of inputs?

If:
 [(3650, 10), (1110, 25), (1248, 10), (1480, 10)]
work excellent

But if:
[(3650, 10), (1110, 25), (1248, 10), (1480, 20)]
Program cant count it :(


from ortools.linear_solver import pywraplp

# Final message
result = ''
rod_length = 6000

# Stored numbers for counting
numbers = [(3650, 10), (1110, 25), (1248, 10), (1480, 10)]

def create_length_list(numbers):
    result_list = []
    for num, count in numbers:
        for i in range(count):
            result_list.append(num)
    return result_list


def create_data_model():
    """Create the data for the example."""
    global rod_length
    data = {}
    weights = create_length_list(numbers)
    data['weights'] = weights
    data['items'] = list(range(len(weights)))
    data['bins'] = data['items']
    data['bin_capacity'] = rod_length
    return data


def main():
    data = create_data_model()
    global result

    # Create the mip solver with the SCIP backend.
    solver = pywraplp.Solver.CreateSolver('SCIP')

    if not solver:
        return

    # Variables
    # x[i, j] = 1 if item i is packed in bin j.
    x = {}
    for i in data['items']:
        for j in data['bins']:
            x[(i, j)] = solver.IntVar(0, 1, 'x_%i_%i' % (i, j))

    # y[j] = 1 if bin j is used.
    y = {}
    for j in data['bins']:
        y[j] = solver.IntVar(0, 1, 'y[%i]' % j)

    # Constraints
    # Each item must be in exactly one bin.
    for i in data['items']:
        solver.Add(sum(x[i, j] for j in data['bins']) == 1)

    # The amount packed in each bin cannot exceed its capacity.
    for j in data['bins']:
        solver.Add(
            sum(x[(i, j)] * data['weights'][i] for i in data['items']) <= y[j] *
            data['bin_capacity'])

    # Objective: minimize the number of bins used.
    solver.Minimize(solver.Sum([y[j] for j in data['bins']]))

    status = solver.Solve()

    if status == pywraplp.Solver.OPTIMAL:
        num_bins = 0
        for j in data['bins']:
            if y[j].solution_value() == 1:
                bin_items = []
                bin_weight = 0
                for i in data['items']:
                    if x[i, j].solution_value() > 0:
                        bin_items.append(data['weights'][i])
                        bin_weight += data['weights'][i]
                if bin_items:
                    num_bins += 1
                    result += ('\n Rod number: ' + str(num_bins) + 'Length: ' + str(
                        bin_items) + 'Used length:' + str(bin_weight))
        result += ('\n \n Number of used ' + str(rod_length) + 'mm rods: ' + str(num_bins))
    else:
        result += 'Optimal solution does not exist'


main()
print(result)



RE: Code freez if more inputs - deanhystad - Mar-28-2023

The solver also freezes if there are fewer inputs. I found many combinations of numbers, some less than half as large, that caused the solver to "freeze".


RE: Code freez if more inputs - kiko058 - Mar-28-2023

(Mar-28-2023, 06:30 AM)deanhystad Wrote: The solver also freezes if there are fewer inputs. I found many combinations of numbers, some less than half as large, that caused the solver to "freeze".

Hello, and could you help me ? How to solve it?

I am new in programming and tryed lot of forums to find solver of this problem but idk... :/

Thanks