Supply Chain Optimization package in python using PuLP.
Make sure you have Python 3.6.x (or higher) installed on your system. You can download it here.
pip install scoptimize
The Technical Docs can be found here.
from scoptimize.network import Model, Node, Flow
model = Model(name='MyModel')
model.add_object(Node(name="Factory_1", origin=True, cashflow_per_unit=-1, max_units=15))
model.add_object(Node(name="Customer_1", destination=True, min_units=10))
model.add_object(Flow(name="Factory_1__Customer_1", cashflow_per_unit=-1, max_units=15, start='Factory_1', end='Customer_1'))
model.solve()
print(model.objective) #=> 20.0
Input:
from scoptimize.network import Model, Node, Flow
from pprint import pp
model = Model(name='MyAdvancedModel')
model.add_object(Node(name="F1", origin=True, cashflow_for_use=-8, cashflow_per_unit=-1, max_units=5))
model.add_object(Node(name="F2", origin=True, cashflow_per_unit=-2, max_units=10))
model.add_object(Node(name="W1", cashflow_per_unit=-1, max_units=10))
model.add_object(Node(name="D1", destination=True, cashflow_per_unit=0, min_units=8, max_units=10))
model.add_object(Flow(name="F1_W1", cashflow_per_unit=-1, max_units=15, start='F1', end='W1'))
model.add_object(Flow(name="F2_W1", cashflow_per_unit=-1, max_units=15, start='F2', end='W1'))
model.add_object(Flow(name="W1_D1", cashflow_per_unit=-1, max_units=15, start='W1', end='D1'))
model.solve()
pp(model.get_object_stats())
Output:
{'F1': {'name': 'F1',
'class': 'Node',
'origin': True,
'destination': False,
'inflows': 0.0,
'outflows': 0.0,
'reflows_in': 0.0,
'reflows_out': 0.0,
'use': 0.0,
'variable_cashflow': -0.0,
'fixed_cashflow': -0.0},
'F2': {'name': 'F2',
'class': 'Node',
'origin': True,
'destination': False,
'inflows': 0.0,
'outflows': 8.0,
'reflows_in': 0.0,
'reflows_out': 0.0,
'use': 1.0,
'variable_cashflow': -16.0,
'fixed_cashflow': 0.0},
'W1': {'name': 'W1',
'class': 'Node',
'origin': False,
'destination': False,
'inflows': 8.0,
'outflows': 8.0,
'reflows_in': 0.0,
'reflows_out': 0.0,
'use': 1.0,
'variable_cashflow': -8.0,
'fixed_cashflow': 0.0},
'D1': {'name': 'D1',
'class': 'Node',
'origin': False,
'destination': True,
'inflows': 8.0,
'outflows': 0,
'reflows_in': 0.0,
'reflows_out': 0.0,
'use': 1.0,
'variable_cashflow': 0.0,
'fixed_cashflow': 0.0},
'F1_W1': {'name': 'F1_W1',
'class': 'Flow',
'reflow': False,
'start': 'F1',
'end': 'W1',
'flow': 0.0,
'use': 1.0,
'variable_cashflow': -0.0,
'fixed_cashflow': 0.0},
'F2_W1': {'name': 'F2_W1',
'class': 'Flow',
'reflow': False,
'start': 'F2',
'end': 'W1',
'flow': 8.0,
'use': 1.0,
'variable_cashflow': -8.0,
'fixed_cashflow': 0.0},
'W1_D1': {'name': 'W1_D1',
'class': 'Flow',
'reflow': False,
'start': 'W1',
'end': 'D1',
'flow': 8.0,
'use': 1.0,
'variable_cashflow': -8.0,
'fixed_cashflow': 0.0}}
Docker:
docker build . --tag scoptimize_docker_test
docker run scoptimize_docker_test bash ./test.sh
Local:
python3.11 -m virtualenv venv
source venv/bin/activate
pip install -e .
./test.sh