Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

"Cutting Stock" section errors out in multiple places #75

Open
IndyHouseGuy opened this issue Dec 16, 2023 · 0 comments
Open

"Cutting Stock" section errors out in multiple places #75

IndyHouseGuy opened this issue Dec 16, 2023 · 0 comments

Comments

@IndyHouseGuy
Copy link

IndyHouseGuy commented Dec 16, 2023

If you take the code on this section:

https://mobook.github.io/MO-book/notebooks/05/06-cutting-stock.html

And place it in Google Colab, it works up to "Cutting Stock Problem: Bilinear reformulation" and then most of the sections error out after that. Any advice? 8 of the code sections in total error out for a variety of reasons.

My best guess is it's related to the version of the solver.

If you want to see the errors, you can see my notebook here:

https://github.com/IndyHouseGuy/Pyomo/blob/main/06_cutting_stock_NO_EDITS_NO_MODIFICATIONS.ipynb

That said, the first block to error out is:

def bilinear_cut_stock(stocks, finish, Np=len(finish)):
    m = pyo.ConcreteModel()

    m.S = pyo.Set(initialize=list(stocks.keys()))
    m.F = pyo.Set(initialize=list(finish.keys()))
    m.P = pyo.RangeSet(0, Np - 1)

    # sum of all finished parts
    f_total_demand = max([finish[f]["demand"] for f in m.F])

    # define a with bounded values
    def a_bounds(m, f, p):
        return (0, max([int(stocks[s]["length"] / finish[f]["length"]) for s in m.S]))

    m.a = pyo.Var(m.F, m.P, domain=pyo.NonNegativeIntegers, bounds=a_bounds)
    m.b = pyo.Var(m.S, m.P, domain=pyo.Binary)
    m.x = pyo.Var(m.P, domain=pyo.NonNegativeIntegers, bounds=(0, f_total_demand))

    # minimize cost
    @m.Objective(sense=pyo.minimize)
    def cost(m):
        c = {s: stocks[s]["cost"] for s in m.S}
        return sum(c[s] * m.b[s, p] * m.x[p] for s in m.S for p in m.P)

    # assign one stock to each pattern
    @m.Constraint(m.P)
    def assign_each_stock_to_pattern(m, p):
        return sum(m.b[s, p] for s in m.S) == 1

    # pattern feasibility
    @m.Constraint(m.P)
    def feasible_pattern(m, p):
        return sum(m.a[f, p] * finish[f]["length"] for f in m.F) <= sum(
            m.b[s, p] * stocks[s]["length"] for s in m.S
        )

    # demand constraints
    @m.Constraint(m.F)
    def demand(m, f):
        return sum(m.a[f, p] * m.x[p] for p in m.P) >= finish[f]["demand"]

    # order the patterns to reduce symmetries
    @m.Constraint(m.P)
    def order(m, p):
        if p == 0:
            return pyo.Constraint.Skip
        return m.x[p] >= m.x[p - 1]

    # upper bound on sum of all patterns
    @m.Constraint()
    def max_patterns(m):
        return sum(m.x[p] for p in m.P) <= f_total_demand

    MINLO_SOLVER.solve(m)

    cost = m.cost()
    x = [m.x[p]() for p in m.P]
    patterns = []
    for p in m.P:
        a = {f: round(m.a[f, p]()) for f in m.F}
        patterns.append({"stock": [s for s in m.S if m.b[s, p]() > 0][0], "cuts": a})

    return patterns, x, cost


patterns, x, cost = bilinear_cut_stock(stocks, finish, 2)
plot_nonzero_patterns(stocks, finish, patterns, x, cost)

which gets this error:

ERROR:pyomo.opt:Solver (asl) returned non-zero return code (-6)
ERROR:pyomo.opt:Solver log:
Couenne 0.5.8 -- an Open-Source solver for Mixed Integer Nonlinear Optimization
Mailing list: [couenne@list.coin-or.org](mailto:couenne@list.coin-or.org)
Instructions: http://www.coin-or.org/Couenne
munmap_chunk(): invalid pointer
couenne: 
---------------------------------------------------------------------------
ApplicationError                          Traceback (most recent call last)
[<ipython-input-12-36f29ff97f2b>](https://localhost:8080/#) in <cell line: 66>()
     64 
     65 
---> 66 patterns, x, cost = bilinear_cut_stock(stocks, finish, 2)
     67 plot_nonzero_patterns(stocks, finish, patterns, x, cost)

1 frames
[/usr/local/lib/python3.10/dist-packages/pyomo/opt/base/solvers.py](https://localhost:8080/#) in solve(self, *args, **kwds)
    625                 elif hasattr(_status, 'log') and _status.log:
    626                     logger.error("Solver log:\n" + str(_status.log))
--> 627                 raise ApplicationError("Solver (%s) did not exit normally" % self.name)
    628             solve_completion_time = time.time()
    629             if self._report_timing:

ApplicationError: Solver (asl) did not exit normally

I must empasize that multiple of the other sections error out as well.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant