<?php
/*************************************************************************************************
* 本程åºæ˜¯ä¸“门用æ¥å¤„ç†è§£é‡Šç»“构模型ISMä¸ç›¸å…³çš„矩阵è¿ç®—,主è¦æ¦‚念有如
* ç®—å:
* å•ä½çŸ©é˜µï¼š
* å¯è¾¾çŸ©é˜µï¼š
* å¯è¾¾æ¥éª¤ä»¥åŠå¯¹åº”的矩阵:
* λ 截è·ï¼š
* 先行集åˆï¼š
* å¯è¾¾é›†åˆï¼š
* 骨架矩阵:
* è¦ç´ 抽å–获得缩å‡çŸ©é˜µï¼š
*/
class ism_mat
{
//全局å˜
var $array_number = array(); //以数组形å¼è¡¨è¾¾çŸ©é˜µ
var $element = 1; //布尔矩阵ä¸çš„è¦ç´ 默认为1,表示1*1的矩阵
var $numColumns = 0; //矩阵列的数目 这个是冗余的å‚数本矩阵就是ç‰äºŽè¦ç´ çš„
var $numRows = 0; //矩阵行的
var $element_name= array(); // è¦ç´ çš„å称
/***********************************************************************
*æž„é€ ism_matrix 的类型
* å‚数类型 ( 二维数组,整型) (array(1=>array(1,2,2,3,)2=>array(4,6,5,7)),6)
* 对值大于1的强制转æ¢æˆæ¨¡ç³Šæ•°å—åž‹
* new ism_mat(6) 类似的给出一个6*6的矩阵
***********************************************************************/
function ism_mat()
{
$nArgs = func_num_args();
if ($nArgs == 0)
{
$array_number=array();
$this->element = 3;
$this->numRows = 3; //行 从 获得第二
$this->numColumns = 3;//列 从 第二个å‚数获
}
if ($nArgs == 1 )
{
if(is_array(func_get_arg(0)))
{
$array_number = func_get_arg(0);
}
else
{
if(is_int(func_get_arg(0)))
{
$this->element = func_get_arg(0);
}
$array_number=array();
}
}
if($nArgs == 2) //如果是2
{
$array_number = func_get_arg(0);
$this->element = func_get_arg(1); //è¦ç´ 从第二个å‚数获
$this->numRows = func_get_arg(1); //行 从 获得第二
$this->numColumns = func_get_arg(1);//列 从 第二个å‚数获
}
if($nArgs > 2) //如果是3
{
$array_number = func_get_arg(0);
$this->element = func_get_arg(1); //è¦ç´ 从第二个å‚数获
$this->numRows = func_get_arg(1); //行 从 获得第二
$this->numColumns = func_get_arg(1);//列 从 第二个å‚数获
$this->element_name=func_get_arg(2);//è¦ç´ çš„å称
}
$numberColumns = 0; //
$numberRows = 0; //
if(empty($array_number) == false) //数组内容ä¸ä¸ºç©º
{
foreach($array_number as $i => $rows) //检查
{
foreach($rows as $j => $number) //如果值为0则移除
{
if($number != 0 && abs($number)<=1 )
{
$this->array_number[$i][$j] = $number;
}
if ($number != 0 && abs($number)>1)
{
$this->array_number[$i][$j] = 1;
}
if($j >= $numberColumns)
{
$numberColumns = $j;
}
}
if($i >=$numberRows)
{
$numberRows = $i;
}
}
//phpçš„æ•°ç»„ä¸‹æ ‡å®šä¹‰ä¸º0å¼€å§‹ï¼ŒåŠ 1符åˆæ•°å¦ä¸Šçš„ä¹ æƒ¯
$numberRows++;
$numberColumns++;
}
$name_count=count($this->element_name);
$maxlen=max($numberRows , $this->numRows,$numberColumns ,$this->numColumns,$this->element,$name_count);
$this->numRows = $maxlen;
$this->numColumns = $maxlen;
$this->element = $maxlen;
if($name_count <=$maxlen)
{
$i=0;
$name=$this->element_name;
//print_r($name);
unset($this->element_name);
foreach($name as $v)
{
$this->element_name[$i]=$v;
$i++;
}
for ($i=$name_count;$i<$maxlen;$i++)
{
$this->element_name[$i]=$i.'å·';
}
}
}
/***************************************************************
* ISM矩阵å˜æ¢
* 输入新的åå—数组$arrayname(name1…… name_n )
* 这个åå—数组必须与原æ¥çš„ ism对象ä¸çš„ ä¸€æ ·ï¼Œé¡ºåº
* æ ¹æ®æ–°çš„排列,返回一个新的 ism矩阵
**************************************************************/
function transform_by_name($new_name_array)
{
$old_name_array=$this->element_name;
$numb=$this->array_number;
$result = array_diff($old_name_array, $new_name_array);
$e=$this->element;
if(empty($result)== true && $this->element==count($new_name_array))
{
//检查输入的åå—列表是
$get_name_old_num=array();
for($k=0;$k<$e;$k++)
{
//获得å称原æ¥çš„åºå·
$get_name_old_num[$k] = array_search($new_name_array[$k], $old_name_array);
}
for($i=0;$i<$e;$i++)
{
for($j=0;$j<$e;$j++)
{
$old_x=$get_name_old_num[$i];
$old_y=$get_name_old_num[$j];
if(empty($numb[$old_x][$old_y]) == false)
{
$new_array_number[$i][$j]=1;
}
else
{
unset($new_array_number[$i][$j]);
}
}
}
}
else
{
echo" 输入的åå—跟原æ¥å˜æ¢çš„ä¸åŒï¼Œæ‰€æœ‰çš„åå—è¦ç›¸åŒï¼";
}
$new_mat=new ism_mat($new_array_number,$e,$new_name_array);
return $new_mat ;
}
/***************************************************************
*å…ƒç´ äº’æ¢ï¼ŒèŽ·å¾—一个新的矩阵
* 0 7 表示第1个与 第8个交æ¢
**************************************************************/
function exchange_e_by_num($num_1, $num_2)
{
$e=$this->element;
$new_mat=new ism_mat($this->array_number,$e,$this->element_name);
if($num_1<$e and $num_2<$e and $num_1!=$num_2)
{
for($i=0;$i<$e;$i++)
{
if($i!=$num_1 and $i!=$num_2)
{
$new_mat->array_number[$num_2][$i]=$this->array_number[$num_1][$i];
$new_mat->array_number[$i][$num_2]=$this->array_number[$i][$num_1];
$new_mat->array_number[$num_1][$i]=$this->array_number[$num_2][$i];
$new_mat->array_number[$i][$num_1]=$this->array_number[$i][$num_2];
}
else
{
$new_mat->array_number[$num_2][$num_1]=$this->array_number[$num_1][$num_2];
$new_mat->array_number[$num_2][$num_2]=$this->array_number[$num_1][$num_1];
$new_mat->array_number[$num_1][$num_1]=$this->array_number[$num_2][$num_2];
$new_mat->array_number[$num_1][$num_2]=$this->array_number[$num_2][$num_1];
}
}
$new_mat->element_name[$num_2]=$this->element_name[$num_1];
$new_mat->element_name[$num_1]=$this->element_name[$num_2];
}
return $new_mat ;
}
/***************************************************************
* é€šè¿‡å…ƒç´ å称交æ¢ï¼ŒèŽ·å¾— ismä¸çš„布尔矩阵的值,返回矩阵ä¸æ‰€æœ‰çš„
**************************************************************/
function exchange_e_by_name($name_1, $name_2)
{
$e=$this->element;
$num_1 = array_search($name_1, $this->element_name);
$num_2 = array_search($name_2, $this->element_name);
//print_r($num_2);
if( $num_1>=0 and $num_2>=0 )
{
$new_mat=$this->exchange_e_by_num($num_1,$num_2);
//print_r($new_mat);
}
else
{
echo "输入的è¦æ¢çš„è¦ç´ å称有错误,滴点眼è¯æ°´ï¼Œçœ‹çœ‹ã€‚为了ä¸å½±å“您计算,返回原æ¥çš„矩阵";
//$new_mat=$this;
//$new_mat=new ism_mat($this->array_number,$this->element,$this->element_name);
}
return $new_mat ;
}
/***************************************************************
* 获得 ismä¸çš„布尔矩阵的值,返回矩阵ä¸æ‰€æœ‰çš„
**************************************************************/
function get_data()
{
for($i = 0; $i < $this->element; $i++)
{
for($j = 0; $j < $this->element; $j++)
{
if(empty($this->array_number[$i][$j]) == false)
{
$the_numbers[$i][$j] = $this->array_number[$i][$j];
$the_numbers[$i][$j]>=1 ? 1: $the_numbers[$i][$j];
$the_numbers[$i][$j]<=0.0001? 0: $the_numbers[$i][$j];
$the_numbers[$i][$j]=='' ? 0:$the_numbers[$i][$j];
}
else
{
$the_numbers[$i][$j] = 0;
}
}
}
return $the_numbers;
}
/***************************************************************
* 得到相乘矩阵 å³åŽŸå§‹çŸ©é˜µ+å•ä½çŸ©é˜µ
**************************************************************/
function b()
{
for($i = 0; $i < $this->element; $i++)
{
for($j = 0; $j < $this->element; $j++)
{
if(empty($this->array_number[$i][$j]) == false )
{
$the_numbers[$i][$j] = $this->array_number[$i][$j];
$the_numbers[$i][$j]>=1?1:$the_numbers[$i][$j];
$the_numbers[$i][$j]<=0?0:$the_numbers[$i][$j];
}
else
{
$the_numbers[$i][$j] = 0;
}
}
}
for($i = 0; $i < $this->element; $i++)
{
$the_numbers[$i][$i]=1;
}
$the_b_mat=new ism_mat($the_numbers,$this->element,$this->element_name);
return $the_b_mat;
}
/**************************************************************************
* 返回æŸä¸ªçŸ©é˜µåæ ‡çš„å€¼ å³å¯¹åº”è¡Œä¸Žåˆ—å…ƒç´ çš„å€¼ï¼Œæ³¨æ„ä¸‹æ ‡
*************************************************************************/
function get_value($i, $j)
{
$the_value = 0;
if($i-1 < $this->get_num_rows() and $j-1 < $this->get_num_columns())
{
if(empty($this->array_number[$i-1][$j-1]) == false)
{
$the_value = $this->number[$i-1][$j-1];
}
}
else
{
echo "<br><br>\n\n\n æžé”™äº†æ³¨æ„å‚数,超过了ism矩阵ä¸çš„è¦ç´ 的值的范围 !\n\n\n\<br><br>";
}
return $the_value;
}
/**************************************************************************
* 返回ism_矩阵的求解å¯è¾¾çŸ©é˜µ,过程ä¸æ‰€æœ‰çš„矩阵
* è¿”å›žçŸ©é˜µæ ¼å¼å¯¹è±¡
* æ ¼å¼ä¸º array(1=>ism_mat(data1),
2=>ism_mat(data2),……)
*************************************************************************/
function get_r_mat_step_data()
{
$i=1;
$i_mat= $this->i();
$b=$this->plus($i_mat);
$r_mat_step_data[1]=$b;
while ($i < 50 and $r_mat_step_data[$i]!=$r_mat_step_data[$i-1])
{
$r_mat_step_data[$i+1]=$r_mat_step_data[$i]->muti($b);
$i++;
}
return $r_mat_step_data;
}
/**************************************************************************
* 返回å¯è¾¾çŸ©é˜µ
* 矩阵
*************************************************************************/
function r_mat()
{
$r_step=$this->get_r_mat_step_data();
$the_last=$r_step[count($r_step)-1];
$the_reached_matrix =new ism_mat ($the_last->array_number,$the_last->element,$the_last->element_name);
return $the_reached_matrix;
}
/**************************************************************************
* 返回层次分解模型的å„个æ¥éª¤ï¼Œè¶…级傻逼的一个过程ï¼ï¼ï¼æ¤è¿‡ç¨‹ä¸ºç»“果优先
* 返回 一个数组
* æ ¼å¼ä¸º array(1=>array( å¯è¾¾çŸ©é˜µï¼ˆï¼‰, å¯è¾¾çŸ©é˜µè½¬ç½®ï¼Œ 上é¢ä¸¤ä¸ªçš„交集, lev_e=),
* 2=>array( å¯è¾¾çŸ©é˜µï¼ˆï¼‰, å¯è¾¾çŸ©é˜µè½¬ç½®ï¼Œ 上é¢ä¸¤ä¸ªçš„交集, lev_e=),
* )
*
*************************************************************************/
function get_r_f_level_data()
{
if($this->is_r_mat($this)==true)
{
$reached_matrix=$this;
}
else
{
$reached_matrix=$this->r_mat();//å¯è¾¾çŸ©é˜µ
}
$reached_transpose_matrix = $reached_matrix->transpose();//å¯è¾¾çŸ©é˜µçš„转置矩阵
$reached_meet_matrix = $reached_matrix->meet($reached_transpose_matrix);//交集矩阵
$array_e_zero =array();
//$the_mat_level_data[1]= array(r_mat=>$reached_matrix,t_mat=>$reached_transpose_matrix,m_mat=>$reached_meet_matrix,lev=>$level_element);
//print_r($the_mat_level_data[1]);
$j=1;
do
{
$array_e_zero=array();
for ($len=0;$len<$reached_matrix->element;$len++)
{
$a_line = $reached_matrix->array_number[$len];
$meet_line = $reached_meet_matrix->array_number[$len];
if($a_line==$meet_line and empty($a_line)==false)
{
$array_e_zero[$len]=$len;
}
}
if (empty($array_e_zero)==false)
{
$the_mat_level_data[$j][r_mat]=$reached_matrix;
$the_mat_level_data[$j][t_mat]=$reached_transpose_matrix;
$the_mat_level_data[$j][m_mat]=$reached_meet_matrix;
$the_mat_level_data[$j][lev]=$array_e_zero;
$reached_matrix = $reached_matrix->set_e_zero($array_e_zero);
$reached_transpose_matrix = $reached_transpose_matrix->set_e_zero($array_e_zero);
$reached_meet_matrix=$reached_meet_matrix->set_e_zero($array_e_zero);
}
$j++;
}
while( empty($array_e_zero)==false and $j <= $reached_matrix->element);
return $the_mat_level_data;
}
/**************************************************************************
* 返回层次分解模型的å„个æ¥éª¤ï¼Œçš„一个过程ï¼ï¼ï¼æ¤è¿‡ç¨‹ä¸ºåŽŸå› 优先g_frist_
* 返回 一个数组
* æ ¼å¼ä¸º array(1=>array( å¯è¾¾çŸ©é˜µï¼ˆï¼‰, å¯è¾¾çŸ©é˜µè½¬ç½®ï¼Œ 上é¢ä¸¤ä¸ªçš„交集, lev_e=),
* 2=>array( å¯è¾¾çŸ©é˜µï¼ˆï¼‰, å¯è¾¾çŸ©é˜µè½¬ç½®ï¼Œ 上é¢ä¸¤ä¸ªçš„交集, lev_e=),
* )
*************************************************************************/
function get_g_f_level_data()
{
if($this->is_r_mat($this)==true)
{
$reached_matrix=$this;
}
else
{
$reached_matrix=$this->r_mat();//å¯è¾¾çŸ©é˜µ
}
$reached_transpose_matrix = $reached_matrix->transpose();//å¯è¾¾çŸ©é˜µçš„转置矩阵
$reached_meet_matrix = $reached_matrix->meet($reached_transpose_matrix);//交集矩阵
$array_e_zero =array();
//$the_mat_level_data[1]= array(r_mat=>$reached_matrix,t_mat=>$reached_transpose_matrix,m_mat=>$reached_meet_matrix,lev=>$level_element);
//print_r($the_mat_level_data[1]);
$j=1;
do
{
$array_e_zero=array();
for ($len=0;$len<$reached_matrix->element;$len++)
{
$a_line = $reached_transpose_matrix->array_number[$len];//就这个地方
$meet_line = $reached_meet_matrix->array_number[$len];
if($a_line==$meet_line and empty($a_line)==false)
{
$array_e_zero[$len]=$len;
}
}
if (empty($array_e_zero)==false)
{
$the_mat_level_data[$j][r_mat]=$reached_matrix;
$the_mat_level_data[$j][t_mat]=$reached_transpose_matrix;
$the_mat_level_data[$j][m_mat]=$reached_meet_matrix;
$the_mat_level_data[$j][lev]=$array_e_zero;
$reached_matrix = $reached_matrix->set_e_zero($array_e_zero);
$reached_transpose_matrix = $reached_transpose_matrix->set_e_zero($array_e_zero);
$reached_meet_matrix=$reached_meet_matrix->set_e_zero($array_e_zero);
}
$j++;
}
while( empty($array_e_zero)==false and $j <= $reached_matrix->element);
return $the_mat_level_data;
}
/**************************************************************************
* 返回ism的区域划分,也就是,系统个数,å„个系统有什么è¦ç´ 组æˆ
* 返回二维数组,
*************************************************************************/
function get_group()
{
$arraygroup=array();
$bmatrix= $this->b();
$transpose=$this->transpose();
$u=$bmatrix->plus($transpose);
$g=$u->r_mat();
$data=$g->get_data();
for ($k=0;$k<count($data);$k++)
{
$is_in=false;
for($j=0;$j<$k;$j++)
{
if($data[$j]==$data[$k])
{
$is_in=true;
}
}
if($is_in==false)
{
$arraydata[$k]=$data[$k];
}
}
$i=0;
foreach($arraydata as $v1)
{
$j=0;
foreach($v1 as $key=>$v)
{
if($v==1)
{
$arraygroup[$i][$j]=$key;
}
$j++;
}
$i++;
}
return $arraygroup;
}
/*****************************************************************************
* 获得矩阵内最大的独立系统
* 返回其ä¸çš„
***************************************************************************/
function get_max_group_mat ()
{
$arraygroup=$this->get_group();
$size=array();
foreach($arraygroup as $k=>$v)
{
$size[$k]=count($v);
}
$max_group_size=max($size);
$max_group_size_index=array_search($max_group_size, $size);
$max_group=$arraygroup[$max_group_size_index];
$the_tmp_mat= $this;
$the_max_group_mat=$the_tmp_mat->group_mat_by_num ($max_group);
$the_max_group_mat= new ism_mat($the_max_group_mat->array_number,$the_max_group_mat->element,$the_max_group_mat->element_name);
return $the_max_group_mat;
}
/*****************************************************************************
* 输入一个数组
* 或者输入一组 æ•°å—的系列。 如 0ã€1ã€2ã€3ã€4ã€æ²¡æœ‰æ£€æŸ¥é‡å¤åº¦ï¼Œè¯·è°ƒç”¨çš„时候自动检测
* çŸ©é˜µæ˜¯ä¸‹æ ‡ä»¥ 0开始的
* 返回 矩阵,è¦ç´ 是里é¢å¯¹åº”çš„è¦ç´ çš„
* 给出一个新的矩阵, è¦ç´ 为输入的里é¢çš„è¦ç´
***************************************************************************/
function group_mat_by_num ()
{
$nArgs = func_num_args();
// print_r($nArgs);
if ($nArgs == 0)
{
echo "没有输入的è¦ç´ ";
}
if ($nArgs == 1 )
{
if(is_array(func_get_arg(0)))
{
$array_num = func_get_arg(0);
}
elseif(is_int(func_get_arg(0)))
{
$array_num[0] =func_get_arg(0);
}
else
{
echo"输入è¦ç´ çš„æ ¼å¼é”™è¯¯";
}
}
if ( $nArgs >1 )
{
for($i=0;$i<$nArgs;$i++)
{
$array_num[$i]=func_get_arg($i);
}
}
//对输入的è¦ç´ çš„å称排åº
sort($array_num);
for ($i=0; $i<count($array_num);$i++)
{
$element_name[$i]= $this->element_name[$array_num[$i]];
}
// print_r($element_name);
// echo '<br>';
// print_r($array_num);
$the_new_group_mat=new ism_mat(array(),count($array_num),$element_name);
$the_new_e= count($array_num);
for ($x=0; $x<$the_new_e;$x++)
{
$old_x=$array_num[$x];
for ($y=0; $y<$the_new_e;$y++)
{
$old_y=$array_num[$y];
$the_new_group_mat->array_number[$x][$y]=$this->array_number[$old_x][$old_y];
}
}
$the_new_group_mat=new ism_mat($the_new_group_mat->array_number,count($array_num),$element_name);
return $the_new_group_mat;
}
/**************************************************************************
* 返回ism的区域划分,也就是,系统个数,å„个系统有什么è¦ç´ 组æˆ
* 返回二维数组,
* 数组由,è¦ç´ å称组æˆ
*************************************************************************/
function get_group_e_name()
{
$arraygroup=array();
$bmatrix= $this->b();
$transpose=$this->transpose();
$u=$bmatrix->plus($transpose);
$g=$u->r_mat();
$data=$g->get_data();
for ($k=0;$k<count($data);$k++)
{
$is_in=false;
for($j=0;$j<$k;$j++)
{
if($data[$j]==$data[$k])
{
$is_in=true;
}
}
if($is_in==false)
{
$arraydata[$k]=$data[$k];
}
}
$i=0;
foreach($arraydata as $v1)
{
$j=0;
foreach($v1 as $key=>$v)
{
if($v==1)
{
$arraygroup[$i][$j]=$key;
}
$j++;
}
$i++;
}
foreach($arraygroup as $i=>$group)
{
foreach($group as $j=>$num)
{
$arraygroup_name[$i][$j]=$this->element_name[$num];
}
}
return $arraygroup_name;
}
/*****************************************************************************
* 输入的是一个数组,数组ä¸æ¯ä¸ªå€¼æ˜¯æ•´æ•° 为è¦ç´ ç´ çš„åºå·
*
* 这个东西å°å¿ƒä½¿ç”¨ï¼Œæ¯”å¦‚åˆ é™¤ array(0,0,0,0,0,0,0,0,0,0)è¡¨ç¤ºä¸€ç›´åˆ é™¤ç¬¬ä¸€ä¸ªè¦ç´
*æ„义
**************************************************************************/
function del_e_by_some_num ($array_element_num)
{
$the_deduce=$this;
foreach($array_element_num as $v)
{
$the_deduce=$the_deduce->del_e_by_num($v);
}
return $the_deduce;
}
/*****************************************************************************
* è¾“å…¥çš„æ˜¯ä¸€ä¸ªå…ƒç´ ï¼Œå€¼æ˜¯æ•´æ•° 为è¦ç´ çš„åºå·
* çŸ©é˜µæ˜¯ä¸‹æ ‡ä»¥ 0开始的
* 返回 çŸ©é˜µï¼Œå¯¹åº”çš„è¡Œä¸Žåˆ—åˆ é™¤ï¼Œå…¶å®ƒå€¼ï¼Œå¯¹åº”çš„å·¦ç§»ï¼Œä¸Žå³ç§»åŠ¨ï¼Œ
* 矩阵å˜å°
***************************************************************************/
function del_e_by_num ($element_num)
{
$e=$this->element;
$element_name=$this->element_name;
$new_element=$e-1;
$new_element_name=array();
$new_array_number=array();
if(0<=$element_num and $element_num<$e)
{
for ($i=0;$i<$element_num;$i++)
{
$new_element_name[$i]=$element_name[$i];
}
for ($i=$element_num;$i<$e-1;$i++)
{
$new_element_name[$i]=$element_name[$i+1];
}
for ($i=0;$i<$e-1;$i++)
{
for ($j=0;$j<$e-1;$j++)
{
if( $i<$element_num and $j<$element_num)
{
$new_array_number[$i][$j]=$this->array_number[$i][$j];
}
elseif( $i<$element_num and $j>=$element_num)
{
$new_array_number[$i][$j]=$this->array_number[$i][$j+1];
}
elseif( $i>=$element_num and $j<$element_num)
{
$new_array_number[$i][$j]=$this->array_number[$i+1][$j];
}
elseif( $i>=$element_num and $j>=$element_num)
{
$new_array_number[$i][$j]=$this->array_number[$i+1][$j+1];
}
}
}
$the_new_deduce_mat=new ism_mat($new_array_number,$new_element,$new_element_name);
}
else
{
echo "<br><br>\n\n\næžé”™äº†å‚数,回去é¢å£ä¸‹ï¼Œè®¤çœŸæ£€æŸ¥ï¼è¦åˆ 除的è¦ç´ 的值, çš„å‚数请注æ„!\n\n\n\<br><br>";
}
//$set_e_zero_mat = new ism_mat($this->array_number,$e );
return $the_new_deduce_mat;
}
/*****************************************************************************
* è¾“å…¥å…ƒç´ çš„å称,值是整数 为è¦ç´ çš„åºå·
* çŸ©é˜µæ˜¯ä¸‹æ ‡ä»¥ 0开始的
* 返回 çŸ©é˜µï¼Œå¯¹åº”çš„è¡Œä¸Žåˆ—åˆ é™¤ï¼Œå…¶å®ƒå€¼ï¼Œå¯¹åº”çš„å·¦ç§»ï¼Œä¸Žå³ç§»åŠ¨ï¼Œ
* 矩阵å˜å°
***************************************************************************/
function del_e_by_name ($name)
{
$element_num=array_search($name,$this->element_name);
$the_new_deduce_mat=$this->del_e_by_num($element_num);
return $the_new_deduce_mat;
}
/*****************************************************************************
* è¾“å…¥å…ƒç´ çš„å称,值是整数 为è¦ç´ çš„åºå·
* çŸ©é˜µæ˜¯ä¸‹æ ‡ä»¥ 0开始的
* 返回 çŸ©é˜µï¼Œå¯¹åº”çš„è¡Œä¸Žåˆ—åˆ é™¤ï¼Œå…¶å®ƒå€¼ï¼Œå¯¹åº”çš„å·¦ç§»ï¼Œä¸Žå³ç§»åŠ¨ï¼Œ
* 矩阵å˜å°
***************************************************************************/
function del_e_by_array_name ($arrayname)
{
$the_new_deduce_mat=$this;
foreach($arrayname as $name)
{
$the_new_deduce_mat=$the_new_deduce_mat->del_e_by_name($name);
}
return $the_new_deduce_mat;
}
/*****************************************************************************
* 输入一个数组
* 或者输入一组 æ•°å—的系列。 如 0ã€1ã€2ã€3ã€4ã€æ²¡æœ‰æ£€æŸ¥é‡å¤åº¦ï¼Œè¯·è°ƒç”¨çš„时候自动检测
* çŸ©é˜µæ˜¯ä¸‹æ ‡ä»¥ 0开始的
* 返回 çŸ©é˜µï¼Œå¯¹åº”çš„è¡Œä¸Žåˆ—åˆ é™¤ï¼Œå…¶å®ƒå€¼ï¼Œå¯¹åº”çš„å·¦ç§»ï¼Œä¸Žå³ç§»åŠ¨ï¼Œ
* 矩阵å˜å°
***************************************************************************/
function del_e_by_array_num ()
{
$nArgs = func_num_args();
// print_r($nArgs);
if ($nArgs == 0)
{
echo "没有è¦åˆ 除的è¦ç´ ";
}
if ($nArgs == 1 )
{
if(is_array(func_get_arg(0)))
{
$array_num = func_get_arg(0);
}
elseif(is_int(func_get_arg(0)))
{
$array_num[0] =func_get_arg(0);
}
else
{
echo"输入è¦ç´ çš„æ ¼å¼é”™è¯¯";
}
}
if ( $nArgs >1 )
{
for($i=0;$i<$nArgs;$i++)
{
$array_num[$i]=func_get_arg($i);
}
}
$the_new_deduce_mat=$this;
// print_r($array_num);
foreach($array_num as $num)
{
$arrayname[$num]=$the_new_deduce_mat->element_name[$num];
}
$the_new_deduce_mat=$the_new_deduce_mat->del_e_by_array_name($arrayname);
return $the_new_deduce_mat;
}
/*****************************************************************************
* 输入的是一个数组,这里暂时ä¸åšä¸¥æ ¼è¾¹ç•Œå¤„ç†ï¼Œæ¯ä¸ªæ•°ç»„必须整
* çŸ©é˜µæ˜¯ä¸‹æ ‡ä»¥ 0开始的
* 返回 矩阵,对应的行与列清零的矩阵
***************************************************************************/
function deduce_e_by_ring ($array_element_num)
{
$e=$this->element;
$element_name=$this->element_name;
$size=count($array_element_num);
if($size<$e)
{
$new_e=$e-$size+1;
}
$min_num=min($array_element_num);
$set_e_zero_mat = new ism_mat($this->array_number,$e ,$this->element_name);
foreach($array_element_num as $i)
{
$the_group_name=$set_e_zero_mat->element_name[$i].'+'.$the_group_name;
}
$set_e_zero_mat->element_name[$min_num]=$the_group_name;
if( 0<=min($array_element_num) and max($array_element_num)<$this->element )
{
foreach( $array_element_num as $the_num)
{
for($i=0;$i<$e;$i++)
{
if ($i==$min_num)
{
for ($j=0;$j<$e;$j++)
{
if ($set_e_zero_mat->array_number[$the_num][$j]==1 )
{
$set_e_zero_mat->array_number[$min_num][$j]=1;
}
if ( $set_e_zero_mat->array_number[$j][$the_num]==1)
{
$set_e_zero_mat->array_number[$j][$min_num]=1;
}
}
}
}
}
$the_new_mat=new ism_mat($set_e_zero_mat->array_number,$set_e_zero_mat->element,$set_e_zero_mat->element_name);
foreach($array_element_num as $k=>$num)
{
if($num==$min_num)
{
unset($array_element_num[$k]);
}
}
$the_new_mat=$the_new_mat->del_e_by_array_num($array_element_num);
}
else
{
echo "<br><br>\n\n\næžé”™äº†å‚数,回去é¢å£ä¸‹ï¼Œè®¤çœŸæ£€æŸ¥ï¼$array_element_num çš„å‚数请注æ„!\n\n\n\<br><br>";
}
$the_new_mat=new ism_mat($the_new_mat->array_number,$the_new_mat->element,$the_new_mat->element_name);
return $the_new_mat;
}
/**************************************************************************************
* 输入的是一个数组,数组里é¢ä¸ºçŽ¯è·¯ ç”¨å…ƒç´ çš„åç§°æ ‡è¯†,这里没有åšä¸¥æ ¼çš„é‡å¤æ£€æŸ¥ç‰ç‰ï¼Œè°ƒç”¨çš„时候请注æ„
* çŸ©é˜µæ˜¯ä¸‹æ ‡ä»¥ 0开始的
* 返回 矩阵,对应的行与列清零的矩阵
***************************************************************************/
function deduce_e_by_ring_name ($array_ring_name)
{
$array_ring_num=array();
foreach($array_ring_name as $key=>$name)
{
$array_ring_num[$key]=array_search($name,$this->element_name);
}
$the_new_mat=$this->deduce_e_by_ring($array_ring_num);
return $the_new_mat;
}
/**************************************************************************
* 返回ism的强连通å集,系统ä¸æž„æˆçŽ¯è·¯çš„个数以åŠå¯¹åº”的组æˆ
* 本处用的是一个ç»å…¸çš„Tarjan算法 http://www.byvoid.com/blog/scc-tarjan/
* Robert Tarjan 的官方网站 http://www.cs.princeton.edu/~ret/
* 返回二维数组,
*************************************************************************/
function get_ring_use_Tarjan()
{
}
/**************************************************************************
* 返回ism的强连通å集,系统ä¸æž„æˆçŽ¯è·¯çš„个数以åŠå¯¹åº”的组æˆ
* 返回二维数组,
*************************************************************************/
function get_ring()
{
$arrayring=array();
$m=$this->r_mat(); //获得å¯è¾¾çŸ©é˜µ
$m_t=$m->transpose(); //å¯è¾¾çŸ©é˜µçš„转置矩阵
$u=$m->meet($m_t); //å¯è¾¾çŸ©é˜µ 与 å¯è¾¾çŸ©é˜µçš„转置矩阵 çš„ 交集 矩阵
$data=$u->get_data();
for ($k=0;$k<count($data);$k++)
{
$is_in=false;
for($j=0;$j<$k;$j++)
{
if($data[$j]==$data[$k])
{
$is_in=true;
}
}
if($is_in==false)
{
$arraydata[$k]=$data[$k];
}
}
$i=0;
foreach($arraydata as $v1)
{
$j=0;
foreach($v1 as $key=>$v)
{
if($v==1)
{
$arraytmp[$i][$j]=$key;
}
$j++;
}
if(count($arraytmp[$i])>1)
{
$arrayring[$i]=$arraytmp[$i];
}
$i++;
}
return $arrayring;
}
/**************************************************************************
* 返回ism的强连通å集,系统ä¸æž„æˆçŽ¯è·¯çš„个数以åŠå¯¹åº”çš„è¦ç´ å称
* 返回二维数组,
*************************************************************************/
function get_ring_e_name()
{
$arrayring_e_name=array();
$arrayring_e_number=$this->get_ring();
foreach($arrayring_e_number as $k=>$array_name_index)
{
foreach($array_name_index as $j=>$num)
{
$arrayring_e_name[$k][$j]=$this->element_name[$num];
}
}
return $arrayring_e_name;
}
/*****************************************************************************
* 给矩阵æŸä¸€è¡ŒæŸä¸€åˆ— 的关系 赋值 $value ç»å¯¹å€¼å°äºŽç‰äºŽ1,以åŽç”¨æ¥æ‹“展的
***************************************************************************/
function set_value($i, $j, $value)
{
if($i-1 < $this->get_num_rows() and $j-1 < $this->get_num_columns())
{
if($value != 0 and abs($value)<=1)
{
$this->array_number[$i-1][$j-1] = $value;
}
elseif(abs($value)>1)
{
$this->array_number[$i-1][$j-1] = 1;
}
else
{
unset($this->array_number[$i-1][$j-1]);
}
}
else
{
echo "<br><br>\n\n\næžé”™äº†å‚数,回去é¢å£ä¸‹ï¼Œè®¤çœŸæ£€æŸ¥ï¼set_value çš„å‚数请注æ„!\n\n\n\<br><br>";
}
}
/*****************************************************************************
* 清除æŸä¸ªè¦ç´ ,但是ä¸å‡å°‘矩阵的大å°,注æ„æ¤è¿‡ç¨‹åªæ˜¯æŠŠå¯¹åº”的行与列清零
* 输入的是一个数组,这里暂时ä¸åšä¸¥æ ¼è¾¹ç•Œå¤„ç†ï¼Œæ¯ä¸ªæ•°ç»„必须整
* çŸ©é˜µæ˜¯ä¸‹æ ‡ä»¥ 0开始的
* 返回 矩阵,对应的行与列清零的矩阵
***************************************************************************/
function set_e_zero ($array_element_num)
{
$e=$this->element;
$set_e_zero_mat = new ism_mat($this->array_number,$e ,$this->element_name);
if( 0<=min($array_element_num) and max($array_element_num)<$this->element )
{
foreach( $array_element_num as $the_num)
{
for($i=0;$i<$e;$i++)
{
unset($set_e_zero_mat->array_number[$the_num][$i]);
unset($set_e_zero_mat->array_number[$i][$the_num]);
}
}
}
else
{
echo "<br><br>\n\n\næžé”™äº†å‚数,回去é¢å£ä¸‹ï¼Œè®¤çœŸæ£€æŸ¥ï¼$array_element_num çš„å‚数请注æ„!\n\n\n\<br><br>";
}
return $set_e_zero_mat;
}
/*************************************************************************
*éšæœºå¡«å……æ ¹æ®çŸ©é˜µè¦ç´ 的个数按比例填充,大于1çš„å…ƒç´
**********************************************************************/
function rand_mat( $rate )
{
$random_numbers = array();
$e = $this->element;
if($rate==null || $rate<0)
{
$rate=2;
}
$totalnum=$rate * $e;
for ($i=0; $i<$totalnum; $i++)
{
$x = mt_rand(0,$e-1);
$y = mt_rand(0,$e-1);
$random_numbers[$x][$y] = 1; //æ¤å¤„专门用æ¥ä¿®æ”¹çš„,比如更改æˆæ¨¡ç³ŠçŸ©é˜µçš„æ–¹
}
$the_random_matrix = new ism_mat($random_numbers, $e,$this->element_name);
return $the_random_matrix;
}
/*******************************************
* 满阵 , 布尔矩阵ä¸æ‰€æœ‰çš„值都为 1
*******************************************/
function ones()
{
$array_fill = array();
$e= $this->element;
for($i = 0; $i < $e; $i++)
{
for($j = 0; $j < $e; $j++)
{
$array_fill[$i][$j] = 1;
}
}
$a_matrix_fill_ones = new ism_mat($array_fill,$e,$this->element_name);
return $a_matrix_fill_ones;
}
/*****************************************************
* 我日个去,查了下å•ä½çŸ©é˜µå±…ç„¶æ˜¯å« identity matrix.
* 矩阵ä¸å¯¹è§’线的全部为1,其它的全部为0
*****************************************************/
function i()
{
$e = $this->element;
for($i = 0; $i < $e; $i++)
{
$id_numbers[$i][$i] = 1;
}
$the_identity_matrix = new ism_mat($id_numbers, $e,$this->element_name);
return $the_identity_matrix;
}
/***************************************************
* 计算转置矩阵 A_ij å˜æˆ A_ji
* A' is $A->transpose() 转置矩阵
*****************************************************/
function transpose()
{
foreach($this->array_number as $i => $row)
{
foreach($row as $j => $number)
{
$the_transpose_data[$j][$i] = $number;
}
}
$the_transpose = new ism_mat($the_transpose_data, $this->element,$this->element_name);
return $the_transpose;
}
/************************************************************************
* 布尔矩阵相乘没有è¿ç”¨åˆ°å…·ä½“çš„ç®—å 采用的是大于1å°±ç‰äºŽ1的截 çš„æ–¹
* A x B is $A->muti($B) 乘è¿ç®—⊙(product
*如果对æŸä¸ªk,有 a_ik ï¼1且b_kj ï¼1,1≤k≤element
************************************************************************/
function muti($some_mat)
{
$easier = $some_mat->transpose();
if($this->get_num_columns() == $some_mat->get_num_rows() and $this->get_num_rows() == $some_mat->get_num_columns())
{
foreach($this->array_number as $i => $row)
{
foreach($easier->array_number as $j => $column)
{
$total = 0;
foreach($row as $k => $number)
{
if(empty($column[$k]) == false)
{
$total += $number * $column[$k];
}
}
$the_product_data[$i][$j] = $total;
if ($the_product_data[$i][$j]>1)
{
$the_product_data[$i][$j]=1;
}
}
}
$the_product = new ism_mat($the_product_data,$this->get_num_columns(),$this->element_name);
}
else
{
echo "\n\n\n 貌似出错了,请检查å‚æ•° \n\n\n";
}
return $the_product;
}
/************************************************************************
* 布尔矩阵交集没有è¿ç”¨åˆ°å…·ä½“çš„ç®—å 采用的是大于1å°±ç‰äºŽ1的截 çš„æ–¹
* A x B is $A->meet($B)
*如果对æŸä¸ªk,有 a_ij ï¼1且b_ij ï¼1, c_ij =1 å¦åˆ™ä¸º0
************************************************************************/
function meet($some_mat)
{
$e=$this->element;
if($this->get_num_columns() == $some_mat->get_num_rows() and $this->get_num_rows() == $some_mat->get_num_columns())
{
for($i=0; $i<$e;$i++)
{
for($j=0; $j<$e;$j++)
{
if(empty($this->array_number[$i][$j]) == false)
{
if(empty($some_mat->array_number[$i][$j]) == false)
{
if($this->array_number[$i][$j]==1 and $some_mat->array_number[$i][$j]==1)
{
$the_data[$i][$j]=1;
}
}
}
else
{
if(empty($some_mat->array_number[$i][$j]) == false)
{
$the_data[$i][$j]=0;
}
}
}
}
$the_meet_mat = new ism_mat($the_data,$e,$this->element_name);
}
else
{
echo "\n\n\n 貌似出错了,请检查å‚æ•° \n\n\n";
}
return $the_meet_mat;
}
/***********************************************
* 矩阵大å°æ£€æŸ¥ï¼Œæ£€æŸ¥çŸ©é˜µçš„行与列,是
************************************************/
function size_eq($some_mat)
{
$return = false;
if ($some_mat->get_num_rows() == $this->get_num_rows() and $some_mat->get_num_columns() == $this->get_num_columns())
{
$return = true;
}
return $return;
}
/**************************************************
* 检查是å¦ä¸ºå¯è¾¾çŸ©é˜µ 自身相乘 ä¸å˜è®¤ä¸ºæ˜¯å¯è¾¾çŸ©é˜µ
************************************************/
function is_r_mat($some_mat)
{
$return = false;
$check =$some_mat->muti($some_mat);
if ( $check == $some_mat)
{
$return = true;
}
return $return;
}
/*************************************************
* 一个常数乘以矩阵 A * n = $A->s_times($n)
*没有什么鸟用,一个ä¸é—´
************************************/
function s_times($value)
{
$the_mat = new ism_mat($this->array_number, $this->element,$this->element_name);
foreach($this->array_number as $i => $column)
{
foreach($column as $j => $number)
{
$the_mat->array_number[$i][$j] *= $value;
}
}
return $the_mat;
}
/**************************************************************
*çŸ©é˜µä¸ŽçŸ©é˜µç›¸å‡ A - B is $A->minus($B) 注æ„å‰ææ¡
****************************************************************/
function minus($some_mat)
{
$substract = new ism_mat(array(), $this->element,$this->element_name);
if($this->size_eq($some_mat))
{
for($i = 0; $i < $this->get_num_rows(); $i++)
{
for($j = 0; $j < $this->get_num_columns(); $j++)
{
if(empty($this->array_number[$i][$j]) == false)
{
if(empty($some_mat->array_number[$i][$j]) == false)
{
$substract->array_number[$i][$j] = $this->array_number[$i][$j] - $some_mat->array_number[$i][$j];
if ($substract->array_number[$i][$j] >1)
{
$substract->array_number[$i][$j]=1;
}
if ($substract->array_number[$i][$j] <0)
{
$substract->array_number[$i][$j]=0;
}
}
else
{
$substract->array_number[$i][$j] = $this->array_number[$i][$j];
if ($substract->array_number[$i][$j] >1)
{
$substract->array_number[$i][$j]=1;
}
if ($substract->array_number[$i][$j] <0)
{
$substract->array_number[$i][$j]=0;
}
}
}
else
{
if(empty($some_mat->array_number[$i][$j]) == false)
{
$substract->array_number[$i][$j] = -1*$some_mat->array_number[$i][$j];
if ($substract->array_number[$i][$j] >1)
{
$substract->array_number[$i][$j]=1;
}
if ($substract->array_number[$i][$j] <0)
{
$substract->array_number[$i][$j]=0;
}
}
}
}
}
}
else
{
echo "\n\n\n 维度ä¸åŒï¼ŒçŸ©é˜µæ— æ³•ç›¸å‡ \n\n\n";
}
return $substract;
}
/*********************************************************************
* å¸ƒå°”çŸ©é˜µç›¸åŠ A + B 对应的函数是 $A->plus($B) 注æ„两个的大å°è¦ç›¸
**********************************************************************/
function plus($some_mat)
{
$add = new ism_mat($this->array_number, $this->get_num_rows(),$this->element_name);
if($this->size_eq($some_mat))
{
$some_mat = $some_mat->s_times(-1);
$add = $this->minus($some_mat);
}
else
{
echo "\n\n\n 大å°ä¸åŒï¼Œæˆ–者其它错误 \n\n\n";
}
return $add;
}
/*********************************************************************
* 获得骨架矩阵 S
* 对于å¯è¾¾çŸ©é˜µï¼ˆç¼©å‡çŸ©é˜µï¼‰ R I表示å•ä½çŸ©é˜µ
* S=R-(R-I)(R-I)
**********************************************************************/
function s_mat()
{
$R=$this->r_mat();
$I=$R->i();
$tmp=$R->minus($I);
$tmp2=$tmp->muti($tmp);
$s_mat=$R->minus($tmp2);
return $s_mat;
}
/**********************************************************
* 获得行的
***********************************************************/
function get_num_rows()
{
return $this->numRows;
}
/**********************************************************
* 获得列的
***********************************************************/
function get_num_columns()
{
return $this->numColumns;
}
/******************************************************************
* 显示矩阵内容以0 1çš„æ–¹å¼æ˜¾ç¤º
*
********************************************************************/
function echo_mat()
{
$numb = $this->array_number;
echo '<table border="1" bgColor="#EEEE00">'."\n";
echo '<tr><td></td>';
for($i=0;$i<$this->element;$i++)
{
echo '<td>'.$this->element_name[$i].'</td>';
}
echo '</tr>'."\r\n";
for($i = 0; $i < $this->get_num_rows();$i++)
{
//echo '<tr>';
echo '<tr><td>'.$this->element_name[$i].'</td>';
for($j = 0; $j < $this->get_num_columns(); $j++)
{
if(empty($numb[$i][$j]) == false)
{
echo "<td><font color=red>".$numb[$i][$j]."</font></td>";
}
else
{
echo "<td>  </td>";
}
}
echo "</tr>\n";
}
echo "</table>\n";
}
/******************************************************************
* 显示矩阵内容 以 è¦ç´ çš„å称方å¼æ˜¾ç¤ºå…¼å®¹éžæ–¹é˜µçš„显示
*
********************************************************************/
function echo_e()
{
$numb = $this->array_number;
echo '<table border="1" bgColor="#EEEE00">'."\n";
for($i = 0; $i < $this->get_num_rows();$i++)
{
if(empty($numb[$i])==false)
{
echo '<tr><td>'.$this->element_name[$i].'</td><td>';
for($j = 0; $j < $this->get_num_columns(); $j++)
{
if(empty($numb[$i][$j]) == false)
{
echo "<font color=red>".$this->element_name[$j]."ã€</font>";
}
else
{
echo "";
}
}
echo "</td></tr>\n";
}
}
echo "</table>\n";
}
/******************************************************************
* 用图形方å¼æ˜¾ç¤º
* 返回的是 一列 ||(6:g)- (>[1,5,7,11]) () 这
********************************************************************/
function show_graphy()
{
$numb = $this->array_number;
for($i = 0; $i <$this->element;$i++)
{
echo "(".$i.':'.$this->element_name[$i].")";
if(empty($numb[$i]) == false)
{
$x=1;//判æ–一行ä¸å¯è¾¾æ•°ç›®çš„æ ‡å°º
echo '- (>[';
for($j=0;$j<$this->element;$j++)
{
if( empty($this->array_number[$i][$j])==false and count($numb[$i])>$x)
{
echo $j;
echo',';
$x++;
}
elseif( empty($this->array_number[$i][$j])==false and count($numb[$i])==$x)
{
echo $j;
}
}
echo ']) ';
}
echo '()';
echo "\r\n";
echo "||";
}
}
/******************************************************************
* 用图形方å¼æ˜¾ç¤º
* 返回的是 一列 ||(6:g)- (>[1,5,7,11]) 这
********************************************************************/
function show_rand_pos_graphy()
{
$numb = $this->array_number;
for($i = 0; $i <$this->element;$i++)
{
$null_num=mt_rand(0,5);
for($n=0;$n<$null_num;$n++)
{
echo "()";
}
if(empty($numb[$i]) == false)
{
$x=1;//判æ–一行ä¸å¯è¾¾æ•°ç›®çš„æ ‡å°º
echo "(".$i.':'.$this->element_name[$i]."";
echo '>[';
for($j=0;$j<$this->element;$j++)
{
if( empty($this->array_number[$i][$j])==false and count($numb[$i])>$x)
{
echo $j;
echo',';
$x++;
}
elseif( empty($this->array_number[$i][$j])==false and count($numb[$i])==$x)
{
echo $j;
}
}
echo ']) ';
}
else
{
echo "(".$i.':'.$this->element_name[$i].")";
}
echo '()';
echo "\r\n";
echo "||";
}
}
}
?>
|