# genetic-nodejs-multithread

> Advanced genetic and evolutionary algorithm library

Latest version **0.3.7** (published 2020-01-12) · BSD license · 0 weekly downloads

## Install

```sh
npm install genetic-nodejs-multithread
pnpm add genetic-nodejs-multithread
yarn add genetic-nodejs-multithread
bun add genetic-nodejs-multithread
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.3.7 |
| Published | 2020-01-12 |
| First published | 2019-04-11 |
| Weekly downloads | 0 |
| License | BSD |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 0 |
| Unpacked size | 35.1 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | subprotocol |
| Maintainers | whateverhow |
| Keywords | genetic, evolution, algorithm, nodejs |

## Links

- npm: https://www.npmjs.com/package/genetic-nodejs-multithread
- Repository: https://github.com/z-hao-wang/genetic-js
- Homepage: https://github.com/z-hao-wang/genetic-js#readme
- Issues: https://github.com/z-hao-wang/genetic-js/issues
- npm.io page: https://npm.io/package/genetic-nodejs-multithread

## Recent versions

- 0.3.7 (latest) — 2020-01-12
- 0.3.6 — 2020-01-12
- 0.3.5 — 2019-12-29
- 0.3.4 — 2019-12-29
- 0.3.3 — 2019-12-28
- 0.3.2 — 2019-12-28
- 0.3.1 — 2019-12-28
- 0.3.0 — 2019-04-11

## README

# Genetic-multithread.js

Advanced genetic and evolutionary algorithm library written in Javascript by [Sub Protocol](http://subprotocol.com/).

### Changes from original version
This is a modified genetic repo optimized for nodejs with multi thread performance optimization.
it uses experimental feature worker_threads
This version only supports genetic with node js, doesn't support running in browser.

requires to run program with `node --experimental-worker`



#### Examples

example in nodejs ```node --experimental-worker  examples/nodeJsFitting.js```

#### Install

```bash
npm install genetic-nodejs-multithread
```

## Population Functions

The genetic-js interface exposes a few simple concepts and primitives, you just fill in the details/features you want to use.
		
| Function                                  | Return Type              | Required   | Description
| ----------------------------------------- | ------------------------ | ---------- | -----------
| seed()                                    | Individual               | Yes        | Called to create an individual, can be of any type (int, float, string, array, object)
| fitness(individual)                       | Float                    | Yes        | Computes a fitness score for an individual
| mutate(individual)                        | Individual               | Optional   | Called when an individual has been selected for mutation
| crossover(mother, father)                 | [Son, Daughter]          | Optional   | Called when two individuals are selected for mating. Two children should always returned
| optimize(fitness, fitness)                | Boolean                  | Yes        | Determines if the first fitness score is better than the second. See [Optimizer](#optimizer) section below
| select1(population)                       | Individual               | Yes        | See [Selection](#selection) section below
| select2(population)                       | Individual               | Optional   | Selects a pair of individuals from a population. [Selection](#selection)
| generation(pop, gen, stats)               | Boolean                  | Optional   | Called for each generation.  Return false to terminate end algorithm (ie- if goal state is reached)
| notification(pop, gen, stats, isFinished) | Void                     | Optional   | Runs in the calling context. All functions other than this one are run in a web worker.


## Optimizer

The optimizer specifies how to rank individuals against each other based on an arbitrary fitness score.  For example, minimizing the sum of squared error for a regression curve `Genetic.Optimize.Minimize` would be used, as a smaller fitness score is indicative of better fit.

| Optimizer                  | Description
| -------------------------- | -----------
| Genetic.Optimize.Minimizer | The smaller fitness score of two individuals is best
| Genetic.Optimize.Maximizer | The greater fitness score of two individuals is best


## Selection

An algorithm can be either genetic or evolutionary depending on which selection operations are used.  An algorithm is evolutionary if it only uses a Single (select1) operator.  If both Single and Pair-wise operations are used (and if crossover is implemented) it is genetic.


| Select Type         | Required    | Description
| ------------------- | ----------- | -----------
| select1 (Single)    | Yes         | Selects a single individual for survival from a population
| select2 (Pair-wise) | Optional    | Selects two individuals from a population for mating/crossover


### Selection Operators

| Single Selectors                 | Description
| -------------------------------- | -----------
| Genetic.Select1.Tournament2      | Fittest of two random individuals
| Genetic.Select1.Tournament3      | Fittest of three random individuals
| Genetic.Select1.Fittest          | Always selects the Fittest individual
| Genetic.Select1.Random           | Randomly selects an individual
| Genetic.Select1.RandomLinearRank | Select random individual where probability is a linear function of rank
| Genetic.Select1.Sequential       | Sequentially selects an individual

| Pair-wise Selectors              | Description
| -------------------------------- | -----------
| Genetic.Select2.Tournament2      | Pairs two individuals, each the best from a random pair
| Genetic.Select2.Tournament3      | Pairs two individuals, each the best from a random triplett
| Genetic.Select2.Random           | Randomly pairs two individuals
| Genetic.Select2.RandomLinearRank | Pairs two individuals, each randomly selected from a linear rank
| Genetic.Select2.Sequential       | Selects adjacent pairs
| Genetic.Select2.FittestRandom    | Pairs the most fit individual with random individuals


```javascript
var genetic = Genetic.create();

// more likely allows the most fit individuals to survive between generations
genetic.select1 = Genetic.Select1.RandomLinearRank;

// always mates the most fit individual with random individuals
genetic.select2 = Genetic.Select2.FittestRandom;

// ...
```

## Configuration Parameters

| Parameter             | Default  | Range/Type  | Description
| --------------------- | -------- | ----------  | -----------
| size                  | 250      | Real Number | Population size
| crossover             | 0.9      | [0.0, 1.0]  | Probability of crossover
| mutation              | 0.2      | [0.0, 1.0]  | Probability of mutation
| iterations            | 100      | Real Number | Maximum number of iterations before finishing
| fittestAlwaysSurvives | true     | Boolean     | Prevents losing the best fit between generations
| skip                  | 0        | Real Number | Setting this higher throttles back how frequently `genetic.notification` gets called in the main thread.
| workerPath            | ''       | String      | NodeJS only, set a custom fitness worker path
| workersCount          | 0        | number      | NodeJS only, set how many multi thread workers to use, set 0 to disable multi threading

## Building

To clone, build, and test Genetic.js issue the following command:

```bash
git clone git@github.com:subprotocol/genetic-js.git && make distcheck
```

| Command               | Description
| --------------------- | -----------
| make                  | Automatically install dev-dependencies

## Contributing

Feel free to open issues and send pull-requests.

---
_Source: https://npm.io/package/genetic-nodejs-multithread · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
