完成RecommandPoint類別(需要做單元測試)

This commit is contained in:
kobayashi 2015-01-25 19:40:10 +08:00
parent 995fa6fd1f
commit 3a0bac60d6
3 changed files with 94 additions and 5 deletions

View File

@ -89,7 +89,7 @@ class DBRecommand extends Database
/**
* 以目前的學習點編號查詢下一個學習點的資訊
* @param string $currentPoint 目前的學習點編號
* @return array 查詢結果
* @return array
*/
public function queryEdgeByID($currentPoint)
{

View File

@ -37,6 +37,8 @@ class RecommandPoint
const ALPHA=0.5;
private $recommand;
private $theme;
private $activity;
public function __construct()
@ -52,11 +54,11 @@ class RecommandPoint
private function computeNormalizationParameter($theme_number)
{
$normal = 0; //正規化之後的GAMMA值
$EntitySum = 0; //實體學習點分別算重之後的值
$VirtualSum = 0; //虛擬學習點分別算重之後的值
$EntitySum = 0; //實體學習點分別算重之後的值
$VirtualSum = 0; //虛擬學習點分別算重之後的值
$edge = $this->recommand->queryEdgeByID('0');
$theme = new Study\Theme($theme_number);
$this->theme = new Study\Theme($theme_number);
for($i=0;$i<count($edge);$i++)
{
@ -76,12 +78,86 @@ class RecommandPoint
return $EntitySum/$VirtualSum;
}
/**
* 是否為可以學習的標的
* @param $target_id 標的編號
* @return bool enable or not
*/
private function isEnableTargetId($activityObj,$target_id)
{
$target = new Target\Target($target_id);
if(!$activityObj->isTargetLearned($target_id)) return true;
else return false;
}
/**
* 過濾非法的標的
*
*/
private function excludeIrregularTarget($point_list,$activityObj)
{
$regularTarget = array();
for($i=0;$i<count($point_list);$i++)
{
$nextPoint = $point_list[$i]["next_point"];
if($this->isEnableTargetId($a)ctivityObj,$nextPoint)) array_push($reregularTarget,$point_list[i]);
}
return $regularTarget;
}
/**
* 推薦學習點
* @param int $current_point 目前的標的編號
* @param int $theme_number 主題編號
* @param int activity_number 學習活動編號
* @return array 學習點清單
*/
public function recommand($current_point,$theme_number,$activity_number)
public function recommand($current_point,$activity_number)
{
$this->activity = new Study\StudyActivity($activity_number);
$themeID = $activity->getThemeId();
$this->theme = new Study\Theme($themeID);
$this->gamma = $this->computeNormalizationParameter($themeID);
$pointList = $this->recommand->queryEdgeByID($current_point);
$targetList = $this->excludeIrregularTarget($pointList,$this->activity);
//計算路徑的權重值
$pathCost = 0;
$VirtualPathCost = 0;
$recommand = array();
$isEntity = true;
for($i=0;$i<count($targetList);$i++)
{
$next_point = $targetList[$i]["next_point"];
$moveTime = $targetList[$i]["MoveTime"];
$nextPoint = new Target\Target($next_point);
$weight = $this->theme->getWeightByNextTarget($next_point);
if($nextPoint->isFullPeople())
{
$pastCost = 0;
$virtualCost = RecommandPoint::ALPHA * $this->gamma * ($wright/$nextPoint->getLearnTime());
$isEntity=false;
}
else
{
if($nextPoint->isNumberOfPeopleZero()) $Rj = 0;
else $Rj = $nextPoint->getMj()/$nextPoint->getPLj();
$pastCost = RecommandPoint::ALPHA * $this->gamma * ($weight * ($nextPoint->getS()-$Rj+1)/$moveTime + $nextPoint->getLearnTime());
$virtualCost = RecommandPoint::ALPHA * $this->gamma * ($wright/$nextPoint->getLearnTime());
}
array_push($recommand,array("nextPoint"=>$nextPoint,
"isEntity" => $isEntity,
"PathCost"=>$pathCost,
"VirtualCost"=>$virtualCost));
}
foreach($recommand as $key=>$value)
{
$tmp[$key] = $value["PathCost"];
}
array_multisort($tmp,SORT_DESC,$recommand,SORT_DESC);
return $recommand;
}
}

View File

@ -6,6 +6,7 @@
namespace UElearning\Study;
require_once UELEARNING_LIB_ROOT.'/Database/DBTheme.php';
require_once UELEARNING_LIB_ROOT.'/Database/DBRecommand.php';
require_once UELEARNING_LIB_ROOT.'/Study/Exception.php';
use UElearning\Database;
use UElearning\Exception;
@ -166,4 +167,16 @@ class Theme {
return $this->queryResultArray['modify_time'];
}
/**
* 取得下一個標的所屬主題的權重
* @param string $next_point
* @return int weight 權重
* @since 2.0.0
*/
public function getWeightByNextTarget($next_point){
$belong = new Database\DBRecommand();
$weight = $belong->queryBelongByID($next_point,$this->id);
return $weight['weight'];
}
}