rugleb/phpgpss

控制系统建模

dev-master 2018-10-13 20:39 UTC

This package is not auto-updated.

Last update: 2024-09-29 05:14:56 UTC


README

phpGPSS - 一个用PHP编写的库,是GPSS建模语言的类似物。使用这个库,您可以轻松模拟和分析您的系统,了解您的流程有多有效。

例如,创建一个交通模拟器。

首先,我们定义事务 - 汽车

use GPSS\Foundation\Transact\Transact;

/**
 * The Car class.
 */
class Car extends Transact
{
    //
}

接下来,定义一个将生成新的 事务(在我们的情况下是 汽车)的 生成器,在某个时间点

use GPSS\Foundation\Generator;

/**
 * The CarGenerator class.
 *
 * @package App
 */
class CarGenerator extends Generator
{

    /**
     * Get delay time.
     *
     * @return int
     */
    public function getDelayTime(): int
    {
        return rand(5, 9) * 10;
    }

    /**
     * Get transact class name.
     *
     * @return string
     */
    public function getTransactName(): string
    {
        return Car::class;
    }

}

接下来,定义一个将处理由 汽车生成器 创建的 汽车 事务的 服务
这里我们添加了一个 HasModel,它将允许我们使用 队列 将设备: RoadService 输入。
最重要的逗号是定义 handle 方法,其中包含服务处理事务的逻辑。
此外,我们还设置了设备的事务处理时间,使用 getDelayTime 方法。

use GPSS\Foundation\Service\Service;
use GPSS\Foundation\Service\HasQueue;
use GPSS\Foundation\Transact\Transact;

/**
 * The RoadService class.
 */
class RoadService extends Service
{
    use HasQueue;

    /**
     * Handle input transact.
     *
     * @param Transact $transact
     * @return mixed
     */
    public function handle(Transact &$transact)
    {
        if ($this->isFree()) {
            return $this->seize($transact);
        }

        if ($this->isProcessing($transact)) {

            if ($this->canRelease($transact)) {
                return $this->release()->terminate($transact);
            }

            return $this;
        }
        
        return $this->queue($transact);
    }

    /**
     * Get delay time.
     *
     * @return int
     */
    public function getDelayTime(): int
    {
        return rand(2, 8) * 10;
    }

}

现在,一切准备就绪。剩下的就是创建一个 Model 实例并运行模拟。
请注意 Model 接受的 config
此配置连接服务、事务和生成器。

require_once __DIR__ . '/vendor/autoload.php';

use App\Car;
use App\RoadService;
use App\CarGenerator;
use GPSS\Foundation\Model;

$config = [
    'map' => [
        Car::class => RoadService::class,
    ],
    'services' => [
        RoadService::class,
    ],
    'generators' => [
        CarGenerator::class,
        CarGenerator::class,
    ],
];

$model = new Model($config);
$model->simulate(200);