velliz/timetables

使用二维笛卡尔图实现的时刻表算法

0.1.0 2018-11-14 02:21 UTC

This package is auto-updated.

Last update: 2024-09-14 19:09:36 UTC


README

使用二维笛卡尔图实现的时刻表算法。

安装

composer require velliz/timetables

使用

标准

使用提供的示例,为X和Y维度创建一个实例标准。您可以创建自定义的 TimeDatumRoomDatum 类,通过扩展到 Datum 抽象来创建。

$criteriaX = new \tests\TimeDatum();
$criteriaX->data = 5;
$criteriaX->closeData = array(4, 6);
$criteriaY = new \tests\RoomDatum();
$criteriaY->data = 93;
$criteriaY->closeData = array(92, 94);

$criteriaY->data 是您想要搜索的确切内容,而 $criteriaY->closeData 如果在XY维度中未找到数据则可接受。

驱动程序

$timetable = new \timetables\TimetableDriver();

维度

此示例创建了一个长度为900的随机 TimeDatum,其值范围从0到100。

$dimenX = new timetables\cartesius\Dimensions();
for ($i = 0; $i < 900; $i++) {
    $data = new \tests\TimeDatum();
    $data->data = rand(0, 100);
    $timetable->addDimenX($data);
}

此示例创建了一个长度为100的随机 RoomDatum,其值范围从0到100。

$dimenY = new timetables\cartesius\Dimensions();
for ($i = 0; $i < 500; $i++) {
    $data = new \tests\RoomDatum();
    $data->data = rand(0, 100);
    $timetable->addDimenY($data);
}

结果

算法将找到值为5的 TimeDatum 和值为93的 RoomDatum

$result = $timetable->setCriteriaX($criteriaX)->setCriteriaY($criteriaY)->CalculateTimeTable();

计算结果

array(6) {
  ["BestX"]=>
  int(893)
  ["BestY"]=>
  int(83)
  ["Criteria"]=>
  array(2) {
    ["X"]=>
    int(5)
    ["Y"]=>
    int(93)
  }
  ["Result"]=>
  array(2) {
    ["X"]=>
    int(5)
    ["Y"]=>
    int(93)
  }
  ["Iteration"]=>
  int(13812)
  ["Remark"]=>
  string(5) "CLEAR"
}

计算

要创建自定义比较规则,您可以实现自定义类并将其 扩展Datum

class CustomRoomDatum extends Datum

并实现 CalculateFits 函数。

public function CalculateFits(Datum $comparator)
{
    //simple comparison logic
    if ($comparator->data === $this->data) {
        return Datum::EQUALS;
    } else if (in_array($this->data, $comparator->closeData)) {
        return Datum::CLOSE;
    }
    return Datum::NOT_MATCH;
}
  • $comparator->data 是从函数参数传递的您的标准
  • $this->data 是比较的主要用途,并从 Dimensions 中填充

然后返回提供的常数

  • Datum::EQUALS 如果数据匹配
  • Datum::CLOSE 如果数据接近匹配
  • Datum::NOT_MATCH 如果数据不匹配