Dear Mike, There is already a minimize function in the global namespace of Sage. You can not overload it with your own code. But you can extend its functionalities.
To contribute to sage, you should start reading http://doc.sagemath.org/html/en/developer/ Vincent Le 14/08/2019 à 17:50, Mike a écrit :
I've written a user-friendly front-end to MixedIntegerLinearProgram (intended for student use in a sage cell.) If this seems to be generally useful, I'd be happy to submit it to the sage code base, but I'm not sure how to proceed. This is not a patch to existing sage code, just some additional code. What I've currently got appears below - I'd happily accept comments and suggestions. Mike r""" Print the solution to a mixed integer linear program. Variables are assumed real unless specified as integer, and all variables are assumed to be nonnegative. EXAMPLES:: var('x1 x2') maximize(20*x1 + 10*x2, {3*x1 + x2 <= 1300, x1 + 2*x2 <= 600, x2 <= 250}) # Z = 9000.0, x1 = 400.0, x2 = 100.0 var('s h a u') maximize(0.05*s + 0.08*h + 0.10*a + 0.13*u, {a <= 0.30*(h+a), s <= 300, u <= s, u <= 0.20*(h+a+u), s+h+a+u <= 2000}) # Z = 174.4, s = 300.0, u = 300.0, h = 980.0, a = 420.0 var('a b c d', domain='integer') maximize(5*a + 7*b + 2*c + 10*d, {2*a + 4*b + 7*c + 10*d <= 15, a <= 1, b <= 1, c <= 1, d <=1 }) # Z = 17.0, a = 0, b = 1, c = 0, d = 1 (Note that integer variables <=1 are binary.) var('x y') minimize(x + y, {x + 2*y >= 7, 2*x + y >= 6}) # Z = 4.33333333333, x = 1.66666666667, y = 2.66666666667 var('x') var('y', domain='integer') minimize(x + y, {x + 2*y >= 7, 2*x + y >= 6}) # Z = 4.5, x = 1.5, y = 3 var('x y', domain='integer') minimize(x + y, {x + 2*y >= 7, 2*x + y >= 6}) # Z = 5.0, x = 2, y = 3 var('x y', domain='integer') maximize(x + y, {x + 2*y >= 7, 2*x + y >= 6}) # GLPK: Objective is unbounded var('x y', domain='integer') maximize(x + y, {x + 2*y >= 7, 2*x + y <= 3}) # GLPK: Problem has no feasible solution AUTHORS: - Michael Miller (2019-Aug-11): initial version """ # **************************************************************************** # Copyright (C) 2019 Michael Miller # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 2 of the License, or # (at your option) any later version. # https://www.gnu.org/licenses/ # **************************************************************************** from sage.numerical.mip import MIPSolverException def maximize(objective, constraints): maxmin(objective, constraints, true) def minimize(objective, constraints): maxmin(objective, constraints, false) def maxmin(objective, constraints, flag): # Create a set of the original variables variables = set(objective.variables()) for c in constraints: variables.update(c.variables()) integer_variables = [v for v in variables if v.is_integer()] real_variables = [v for v in variables if not v.is_integer()] # Create the MILP variables p = MixedIntegerLinearProgram(maximization=flag) MILP_integer_variables = p.new_variable(integer=True, nonnegative=True) MILP_real_variables = p.new_variable(real=True, nonnegative=True) # Substitute the MILP variables for the original variables # (Inconveniently, the built-in subs fails with a TypeError) def Subs(expr): const = RDF(expr.subs({v:0 for v in variables})) # the constant term sum_integer = sum(expr.coefficient(v) * MILP_integer_variables[v] for v in integer_variables) sum_real = sum(expr.coefficient(v) * MILP_real_variables[v] for v in real_variables) return sum_real + sum_integer + const objective = Subs(objective) constraints = [c.operator()(Subs(c.lhs()), Subs(c.rhs())) for c in constraints] # Set up the MILP problem p.set_objective(objective) for c in constraints: p.add_constraint(c) # Solve the MILP problem and print the results try: Z = p.solve() print "Z =", Z for v in integer_variables: print v, "=", int(p.get_values(MILP_integer_variables[v])) for v in real_variables: print v, "=", p.get_values(MILP_real_variables[v]) print except MIPSolverException as msg: if str(msg)=="GLPK: The LP (relaxation) problem has no dual feasible solution": print "GLPK: Objective is unbounded" print else: print str(msg) print
-- You received this message because you are subscribed to the Google Groups "sage-devel" group. To unsubscribe from this group and stop receiving emails from it, send an email to sage-devel+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/sage-devel/d29c3878-5629-4457-5692-85b6820f9a18%40gmail.com.