예제 #1
0
def compute_sol():
    intVars = range(N_vars)
    lb = zeros(N_vars)
    ub = ones(N_vars)

    def denseRow(r):
        row = zeros(N_vars)
        for i, v in r.items():
            row[i] = v
        return row

    A = map(denseRow, A_lt)
    Aeq = map(denseRow, A_eq)
    ff = denseRow(f)

    p = MILP(f=ff,
             lb=lb,
             ub=ub,
             A=A,
             b=b_lt,
             Aeq=Aeq,
             beq=b_eq,
             intVars=intVars,
             goal='min')
    r = p.solve('glpk', iprint=-1)
    return r.xf
예제 #2
0
    def optimize(
        self, solver="ralg", plot=0, maxIter=1e5, maxCPUTime=3600, maxFunEvals=1e12
    ):
        if self.mtype == "LP" or self.mtype == "MILP":
            p = MILP(
                self.objective,
                self.init,
                constraints=self.constraints,
                maxIter=maxIter,
                maxCPUTime=maxCPUTime,
                maxFunEvals=maxFunEvals,
            )
        elif self.mtype == "NLP":
            p = NLP(
                self.objective,
                self.init,
                constraints=self.constraints,
                maxIter=maxIter,
                maxCPUTime=maxCPUTime,
                maxFunEvals=maxFunEvals,
            )
        else:
            print("Model Type Error")
            raise TypeError

        if self.sense == GRB.MAXIMIZE:
            self.Results = p.maximize(solver, plot=plot)
        else:
            self.Results = p.minimize(solver, plot=plot)
        # print(self.Results)
        self.ObjVal = self.Results.ff

        if self.Results.isFeasible:
            self.Status = GRB.OPTIMAL
        else:
            self.Status = GRB.INFEASIBLE

        for v in self.variables:
            v.VarName = v.name
            v.X = self.Results.xf[v]
        return self.Status
예제 #3
0
    y: 25,
    z: 80
}  # however, using numpy.arrays is more recommended than Python lists

# Define some constraints
cons = [
    x + 5 * y < 15, x[0] < -5,
    f1 < [25, 35], f1 > -100, 2 * f1 + 4 * z < [80, 800], 5 * f2 + 4 * z < 100,
    [-5.5, -4.5] < x, x < 1, -17 < y, y < 20, -4000 < z, z < 4
]

# Create prob
# old-style:
#p = MILP(obj, startPoint, intVars = [y, z], constraints=cons)
# new (OpenOpt v 0.37+):
p = MILP(obj, startPoint, constraints=cons)

# Solve
r = p.minimize(
    'lpSolve', iprint=-1
)  # glpk is name of the solver involved, see OOF doc for more arguments

# Decode solution
s = r.xf
print('Solution: x = %s   y = %f  z = %f' % (str(s[x]), s[y], s[z]))
# Solution: x = [-5.25 -4.5 ]   y = 3.000000  z = -33.000000

# OPTIONAL: you can export the problem into MPS format file
# (lpsolve and its Python binding should be properly installed,
# you may take a look at the instructions from openopt.org/LP)
# if file name not ends with '.MPS' or '.mps'
    # first trip is free
    b = b + [NUMDRIFTERS]
    for pidx in range(0, len(boattrips[0])):
        A[optlabs, pidx] = 1

    # [mask of paths starting at bidx] * x_paths <= [mask of paths ending for bidx] * x_paths
    for bidx in range(1, TIME / BOATTIME / 2):
        for pidx in range(0, len(boattrips[bidx])):
            A[optlabs + bidx, boatoptstart[bidx] + pidx] = 1

        for pidx in boatends[bidx]:
            A[optlabs + bidx, pidx] = -1

    b = b + [0] * (TIME / BOATTIME / 2 - 1)

    p = MILP(f=f, lb=lb, ub=ub, A=A, b=b, intVars=intVars, goal='max')
    #r = p.solve('lpSolve')
    curtime = time_module.time()
    r = p.solve('cplex')
    print "Solver done. Took %.5f real time." % (time_module.time() - curtime)
    optlabels_hit = r.ff

# Decode solution
labs_got = []
if (optlabs > 0):
    for lidx in range(0, optlabs):
        if (r.xf[lidx + numpaths] == 1):
            labs_got.append(rlmap[lidx])

paths_taken = []
boat_carrying = [0] * (TIME / BOATTIME / 2)
예제 #5
0
f = [1, 2, 3, 4, 5, 4, 2, 1]

# indexing starts from ZERO!
# while in native lpsolve-python wrapper from 1
# so if you used [5,8] for native lp_solve python binding
# you should use [4,7] instead
intVars = [4, 7]

lb = -1.5 * ones(8)
ub = 15 * ones(8)
A = zeros((5, 8))
b = zeros(5)
for i in xrange(5):
    for j in xrange(8):
        A[i, j] = -8 + sin(8 * i) + cos(15 * j)
    b[i] = -150 + 80 * sin(80 * i)

p = MILP(f=f, lb=lb, ub=ub, A=A, b=b, intVars=intVars)

# if file name not ends with '.MPS' or '.mps'
# then '.mps' will be appended
success = p.exportToMPS('/home/dmitrey/PyTest/milp_1')
# or write into current dir:
# success = p.exportToMPS('milp')
# success is False if a error occurred (read-only file system, no write access, etc)
# elseware success is True

# f_opt is 25.801450769161505
# x_opt is [ 15. 10.15072538 -1.5 -1.5 -1.  -1.5 -1.5 15.]
예제 #6
0
    def schedule_all(self, timelimit=None):
        if not self.reservation_list:
            return self.schedule_dict

        self.build_data_structures()
        # allocate A & b
        # find the row size of A:
        # first find the number of reservations participating in oneofs
        oneof_reservation_num = 0
        for c in self.oneof_constraints:
            oneof_reservation_num += len(c)
        A_numrows = len(self.reservation_list) + len(self.aikt) + len(
            self.oneof_constraints) - oneof_reservation_num
        A_rows = []
        A_cols = []
        A_data = []
        #        try:
        #            A = numpy.zeros((A_numrows, len(self.Yik)), dtype=numpy.int)
        #        except ValueError:
        #            print("Number of A rows: {}".format(A_numrows)
        b = numpy.zeros(A_numrows, dtype=numpy.int16)
        # build A & b
        row = 0

        # constraint 5: oneof
        for c in self.oneof_constraints:
            for r in c:
                for entry in r.Yik_entries:
                    A_rows.append(row)
                    A_cols.append(entry)
                    A_data.append(1)
                #                    A[row,entry] = 1
                r.skip_constraint2 = True
            b[row] = 1
            row += 1

            # constraint 2: each res should have one start:
        # optimization:
        # if the reservation participates in a oneof, then this is
        # redundant with the oneof constraint added above, so don't add it.
        for r in self.reservation_list:
            if hasattr(r, 'skip_constraint2'):
                continue
            for entry in r.Yik_entries:
                A_rows.append(row)
                A_cols.append(entry)
                A_data.append(1)
                # A[row,entry] = 1
            b[row] = 1
            row += 1

        # constraint 3: each slice should only have one sched. reservation:
        for s in self.aikt.keys():
            for entry in self.aikt[s]:
                A_rows.append(row)
                A_cols.append(entry)
                A_data.append(1)
            #                A[row,entry] = 1
            b[row] = 1
            row += 1

        A = coo_matrix((A_data, (A_rows, A_cols)),
                       shape=(A_numrows, len(self.Yik)))
        # constraint 6: and
        # figure out size of constraint matrix

        if not self.and_constraints:
            Aeq = []
            beq = []
        else:
            Aeq_numrows = 0
            for c in self.and_constraints:
                Aeq_numrows += len(c) - 1
            # allocate Aeq and beq
            #        Aeq = numpy.zeros((Aeq_numrows, len(self.Yik)), dtype=numpy.int)
            Aeq_rows = []
            Aeq_cols = []
            Aeq_data = []
            beq = numpy.zeros(Aeq_numrows, dtype=numpy.int16)
            row = 0
            for c in self.and_constraints:
                constraint_size = len(c)
                left_idx = 0
                right_idx = 1
                while right_idx < constraint_size:
                    left_r = c[left_idx]
                    right_r = c[right_idx]
                    for entry in left_r.Yik_entries:
                        #                    Aeq[row, entry] = 1
                        Aeq_rows.append(row)
                        Aeq_cols.append(entry)
                        Aeq_data.append(1)
                    for entry in right_r.Yik_entries:
                        Aeq_rows.append(row)
                        Aeq_cols.append(entry)
                        Aeq_data.append(-1)
                    #                    Aeq[row, entry] = -1
                    left_idx += 1
                    right_idx += 1
                    row += 1
            #            print(Aeq_numrows)
            Aeq = coo_matrix((Aeq_data, (Aeq_rows, Aeq_cols)),
                             shape=(Aeq_numrows, len(self.Yik)))

        # bounds:
        lb = numpy.zeros(len(self.Yik))
        ub = numpy.ones(len(self.Yik))

        # objective function:
        f = numpy.zeros(len(self.Yik))
        row = 0
        for entry in self.Yik:
            f[row] = entry[2]  # priority
            row += 1

        dump_matrix_sizes(f, A, Aeq, b, beq, lb, ub,
                          len(self.compound_reservation_list))
        p = MILP(f=f,
                 A=A,
                 Aeq=Aeq,
                 b=b,
                 beq=beq,
                 lb=lb,
                 ub=ub,
                 intVars=list(range(len(self.Yik))),
                 binVars=list(range(len(self.Yik))))

        r = p.maximize('glpk', iprint=-1)
        #        r = p.maximize('bintprog')
        #        r = p.maximize('lpsolve')
        return self.unpack_result(r)