File: how_to_mip_start.rst

package info (click to toggle)
python-pulp 2.6.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 14,720 kB
  • sloc: python: 7,505; makefile: 16; sh: 16
file content (75 lines) | stat: -rw-r--r-- 2,560 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
How to warm-start a solver
======================================

Many solvers permit the possibility of giving a valid (or parcially valid in some cases) solution so the solver can start from that solution. This can lead to performance gains.


Supported solver APIs
-----------------------

The present solver APIs that work with PuLP warm-start are the following: ``CPLEX_CMD``, ``GUROBI_CMD``, ``PULP_CBC_CMD``, ``CBC_CMD``, ``CPLEX_PY``, ``GUROBI``.

Example problem
----------------

We will use as example the model in :ref:`set-partitioning-problem`. At the end is the complete modified code.


Filling a variable with a value
--------------------------------

If a model has been previously solved, each variable has already a value. To check the value of a variable we can do it via the ``value`` method of the variable.

In our example, if we solve the problem, we could just do the following afterwards:

.. code-block:: python

    x[('O', 'P', 'Q', 'R')].value() # 1.0
    x[('K', 'N', 'O', 'R')].value() # 0.0

If we have not yet solved the model, we can use the ``setInitialValue`` method to assign a value to the variable.

In our example, if we want to get those two same values, we would do the following:

.. code-block:: python

    x[('O', 'P', 'Q', 'R')].setInitialValue(1)
    x[('K', 'N', 'O', 'R')].setInitialValue(0)


Activating MIP start
---------------------

Once we have assigned values to all variables and we want to run a model while reusing those values, we just need to pass the ``warmStart=True`` argument to the solver when initiating it.

For example, using the default PuLP solver we would do:

.. code-block:: python

    seating_model.solve(pulp.PULP_CBC_CMD(msg=True, warmStart=True))

I usually turn ``msg=True`` so I can see the messages from the solver confirming it loaded the solution correctly.

Fixing a variable
-------------------

Assigning values to variables also permits fixing those variables to that value. In order to do that, we use the ``fixValue`` method of the variable.

For our example, if we know some variable needs to be 1, we can do:


.. code-block:: python

    _variable = x[('O', 'P', 'Q', 'R')]
    _variable.setInitialValue(1)
    _variable.fixValue()

This implies setting the lower bound and the upperbound to the value of the variable.


Whole Example
-------------

If you want to see the complete code of the warm start version of the example, :download:`click here <../../../examples/wedding_initial.py>` or see below.

.. literalinclude:: ../../../examples/wedding_initial.py