1. Go to this page and download the library: Download sedatsevgili/charlie library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
sedatsevgili / charlie example snippets
class Item implements \Charlie\Gene\GeneInterface
{
private bool $picked;
public function __construct(private int $weight, private int $value)
{
$this->weight = $weight;
$this->value = $value;
$this->picked = false;
}
public function getWeight(): int
{
return $this->weight;
}
public function setWeight(int $weight): self
{
$this->weight = $weight;
return $this;
}
public function getValue(): int
{
return $this->value;
}
public function setValue(int $value): self
{
$this->value = $value;
return $this;
}
public function isPicked(): bool
{
return $this->picked;
}
public function set(mixed $data): \Charlie\Gene\GeneInterface
{
$this->setValue($data['value'] ?? 0);
$this->setWeight($data['weight'] ?? 0);
return $this;
}
public function get(): mixed
{
return [
'value' => $this->getValue(),
'weight' => $this->getWeight(),
];
}
public function mutate(): \Charlie\Gene\GeneInterface
{
$this->picked = !$this->picked;
return $this;
}
public function __toString(): string
{
return sprintf('Value: %s, Weight: %s, Picked: %s', $this->getValue(), $this->getWeight(), $this->isPicked() ? 'Yes' : 'No');
}
public function isEqual(\Charlie\Gene\GeneInterface $gene): bool
{
return $this->getValue() === $gene->getValue() && $this->getWeight() === $gene->getWeight();
}
}
class KnapsackFitnessFunction implements \Charlie\Fitness\CalculatorInterface
{
public function calculate(\Charlie\Chromosome\Chromosome $chromosome): int
{
$items = $chromosome->getData();
$items = array_filter($items, function (Item $item) {
return $item->isPicked();
});
$totalValue = array_reduce($items, function ($carry, $item) {
return $carry + $item->getValue();
}, 0);
$totalWeight = array_reduce($items, function ($carry, $item) {
return $carry + $item->getWeight();
}, 0);
if ($totalWeight > 15) {
$totalValue = 0;
}
return $totalValue;
}
}
re_once __DIR__ . '/KnapsackFitnessFunction.php';
3),
new Item(3, 5),
new Item(4, 7),
new Item(5, 9),
new Item(6, 11),
new Item(7, 13),
];
$combination2 = [
new Item(1, 1),
new Item(2, 3),
new Item(3, 5),
new Item(4, 7),
new Item(4, 6),
new Item(6, 11),
new Item(7, 13),
];
$combination3 = [
new Item(1, 1),
new Item(2, 3),
new Item(3, 5),
new Item(4, 7),
new Item(4, 7),
new Item(6, 10),
new Item(7, 13),
];
$combination4 = [
new Item(1, 1),
new Item(2, 3),
new Item(4, 5),
new Item(4, 7),
new Item(5, 9),
new Item(3, 1),
new Item(7, 13),
];
$combination5 = [
new Item(1, 1),
new Item(2, 3),
new Item(4, 5),
new Item(6, 7),
new Item(5, 9),
new Item(3, 10),
new Item(7, 13),
];
$population = new \Charlie\Population\Population([
new \Charlie\Individual\Individual(new \Charlie\Chromosome\Chromosome($combination1)),
new \Charlie\Individual\Individual(new \Charlie\Chromosome\Chromosome($combination2)),
new \Charlie\Individual\Individual(new \Charlie\Chromosome\Chromosome($combination3)),
new \Charlie\Individual\Individual(new \Charlie\Chromosome\Chromosome($combination4)),
new \Charlie\Individual\Individual(new \Charlie\Chromosome\Chromosome($combination5)),
]);
$fitnessFunction = new KnapsackFitnessFunction();
$selection = new \Charlie\Actions\PairSelection();
$problem = new \Charlie\Actions\Problem\Problem();
$problem->setCalculator($fitnessFunction);
$problem->setCrossOver(new \Charlie\Actions\CrossOver(new \Charlie\Randomizer\MtRandomizer()));
$problem->setMutator(new \Charlie\Actions\Mutator(new \Charlie\Randomizer\MtRandomizer()));
$problem->setSelection($selection);
$problem->setMaxEvolveCount(100);
$problem->setPopulation($population);
$problem->solve();
echo "SOLUTION: " . PHP_EOL;
$bestParents = $selection->selectBest($population, $fitnessFunction);
echo (string) $bestParents->getIndividual1() . PHP_EOL;
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.