Skip to main content

Ant Colony Power Systems Optimizer

Project description

PyPI version

Ant Colony Power Systems Optimizer

This library aims to provide a tool to obtain an optimal dispach of a Power System comprised of Thermal Generation Units. The approach combines the Ant Colony Optimizer with a non-linear solver provided by CVXOPT.

This is an under development library

Installation instructions

PyPi

A pre-built binary wheel package can be installed using pip:

pip install acopoweropt

Poetry

Poetry is a tool for dependency management and packaging in Python. acopoweropt can be installed in a poetry managed project:

poetry add acopoweropt

Usage

From a domain perspective, there should be a complete decoupling between an Ant Colony and a Power System, after all ants do not have knowledge of power systems. This approach, although more elegant, is far from trivial to be implemented, mainly because the enviroment where the ants would look for food gets deeply entangled with the domain. For example, the modeling of pheromone matrix for the traveler salesman might not be adequate for a Power Systems Unit Commitment problem.

For that reason, the initial approach was to create two main Entities: A Power System and a PowerColony, where the first must be a Power System which can be solved by a mathematical method and the second should be an Ant Colony initialized to seek optimal results of a Power System problem.

Since the dispatch of "multi operative zone" Thermal Generation Units (TGUs) bring non-linearities to the formulation, obtaining a global optimal financial dispach of the system is not a trivial task. The Ant Colony algorithm came in hand as a tool to iteractively seek a global optimal result without having to rely on brute computational force.

Defining Systems

The systems configuration should be defined in the systems.json file. In the example provided, 3 systems where defined: 's10', 's15' and 's40', the names were chosen for convention and will be used by the PowerSystem class to initialize the desired configuration.

Example

The code below samples a possible configuration which can be used to operate the system and solves this configuration.

from acopoweropt import system

# Instance a PowerSystem class from a configuration file where 's10` defines a system configuration
PSystem = system.PowerSystem(name='s10')

# Randomly selects a possible system operation (there are cases where more than a single unit can be operated in diferent configurations)
operation = PSystem.sample_operation()

# Solve the Economic Dispatch of the units of a specific configuration of the system, in this case, let's use the previously sampled one:
solution = PSystem.solve(operation=operation)

# Prints total financial cost of the operation
print("Total Financial Cost: {}".format(solution.get('Ft')))

# Prints the operation with its power dispach values
print(solution.get('operation'))

Another option is to bring your own sequence of operative zones (1 for each TGU) and build the operation data from it:

from acopoweropt import system

# Intance a PowerSystem class from a configuration file where 's10` defines a system configuration
PSystem = system.PowerSystem(name='s10')

# Define a sequence of operative zones for each of the 10 TGUs
opzs = [2, 3, 1, 2, 1, 1, 3, 1, 1, 3]

# Build a configuration that represents such sequence of operative zones
operation = PSystem.get_operation(operative_zones=opzs)

# Solve the Economic Dispatch of the specific configuration:
solution = PSystem.solve(operation=operation)

# Prints total financial cost of the operation
print("Total Financial Cost: {}".format(solution.get('Ft')))

# Prints the operation with its power dispach values
print(solution.get('operation'))

Defining Power Colonies

An Ant Colony should seek for a global optimal solution or "the optimal source of food". The algorithm was proposed by Marco Dorigo, check Wiki for more details.

Example

The code below initializes a PowerColony with a desired PowerSystem as the "environment" for the ants to seek their food. Once instantiated, the PowerColony immediately unleashes their ants for a first seek for solutions, therefore PowerColony.paths and PowerColony.pheromone can be observed.

from acopoweropt import colony, system

PSystem = system.PowerSystem(name='s15')
PColony = colony.PowerColony(n_ants=100,
                            pheromone_evp_rate={'worst': 0.75, 'mean': 0.25, 'best': 0.05},
                            power_system=PSystem)

Now a PowerColony can seek for optimal sources of food:

PColony.seek(max_iter=20, power_system=PSystem, show_progress=True)

ax = PColony.paths.groupby('iteration').distance.min().plot(y='distance')

PColony.create_pheromone_movie(duration=0.25)

License

See the LICENSE file for license rights and limitations (MIT).

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

acopoweropt-0.3.1.tar.gz (12.2 kB view details)

Uploaded Source

Built Distribution

acopoweropt-0.3.1-py3-none-any.whl (10.1 kB view details)

Uploaded Python 3

File details

Details for the file acopoweropt-0.3.1.tar.gz.

File metadata

  • Download URL: acopoweropt-0.3.1.tar.gz
  • Upload date:
  • Size: 12.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.4 CPython/3.8.6 Linux/5.10.41-1-MANJARO

File hashes

Hashes for acopoweropt-0.3.1.tar.gz
Algorithm Hash digest
SHA256 b9d1321ca57f8c57b727374814923b4e96cefcda9f892317863e4fb94ad81317
MD5 bc728920fd1f384541b2f9bffb1c50d8
BLAKE2b-256 3724746d9a83d681d6ef2d2f71b23510881d99064c290b2dafdbb847143bc1e9

See more details on using hashes here.

File details

Details for the file acopoweropt-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: acopoweropt-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 10.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/1.1.4 CPython/3.8.6 Linux/5.10.41-1-MANJARO

File hashes

Hashes for acopoweropt-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 28cbd45d35df7b1a0d06b760ec45daa9025d66145db1106a6e857fa8d27139b4
MD5 8d9de6a4931f72c20af5585b2da5b3ea
BLAKE2b-256 727c94e62abf3f367592e2d0f769c5ce2aebc76af42481adaa0653a1218c5ec3

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page