Setup and Objective#

To optimize a system, it is necessary to define a quantitative measure of the system’s performance, known as the objective function. The objective function is a mathematical representation of the system’s “goodness” and depends on the decision variables — the degrees of freedom that can be adjusted to optimize the system. Depending on the problem, the objective function can be maximized or minimized.

In the context of Life Cycle Optimization (LCO), the objective function can represent any impact category, quantified using the characterization factors of a life cycle impact assessment (LCIA) method (e.g., global warming potential, acidification potential). The objective function can also combine multiple impact categories to address more complex optimization goals.

Warning

The functionality for specifying objectives is being expanded to facilitate the calculation and visualization of trade-offs between multiple objectives. Additionally, ongoing work aims to integrate economic and social indicators, advancing from LCO to Life Cycle Sustainability Optimization (LCSO), encompassing all three pillars of sustainability.

Setup#

The objective is specified when creating a pulpo object, often referred to as pulpo_worker. Below is an example of how to create and fully specify a pulpo_worker.

import os
from pulpo import pulpo

# Define the working directory
notebook_dir = os.path.dirname(os.getcwd())
directory = os.path.join(notebook_dir, 'data')

# (Optional) Define the path to GAMS
GAMS_PATH = r"C:\APPS\GAMS\win64\40.1\gams.exe"

# Specify the project and database name
project = "pulpo_bw25"
database = "ecoinvent-3.8-cutoff"

These are the general specification, to indicate the project and database to be used. It is also possible to specify multiple databases (e.g. fore- and background):

databases = ["ecoinvent-3.8-cutoff",
            "foreground_inventories"]

Objective#

The next step is to define the method/objective function.

# Specify the method/objective
methods = "('ecoinvent-3.8', 'IPCC 2013', 'climate change', 'GWP 100a')"

In this example, the pulpo_worker is created with the objective of minimizing the global warming potential, specified as "('ecoinvent-3.8', 'IPCC 2013', 'climate change', 'GWP 100a')". Once the pointers are set, the pulpo_worker can be created, and the lci data loaded:

# Create the pulpo_worker object
pulpo_worker = pulpo.PulpoOptimizer(project, database, methods, directory)

# Retrieve the LCI data
pulpo_worker.get_lci_data()

Multiple Objectives#

It is also possible to specify multiple objectives as a weighted sum. This is achieved by using a dictionary to define the methods and their respective weights. Setting the weights of other objectives to 0 enables single-objective optimization while calculating the other indicators for reference:

methods = {
    "('IPCC 2013', 'climate change', 'GWP 100a')": 1,
    "('ReCiPe Endpoint (E,A)', 'resources', 'total')": 0,
    "('ReCiPe Endpoint (E,A)', 'human health', 'total')": 0,
    "('ReCiPe Endpoint (E,A)', 'ecosystem quality', 'total')": 0
}

With the pulpo_worker created, the next step is to define the functional unit, which will be covered in the following section.