понедельник, 25 июля 2011 г.

Алгоритм ближайшего соседа

#Алгоритм ближайшего соседа, для поиска наименьшего (субоптимального) гамильтонового цикла

cls

$m = @(
    @(0,  5,  6,  8),
    @(5,  0,  7,  10),
    @(6,  7,  0,  3),
    @(8,  10, 3,  0)
)

function minel($vect){
    $mini = 0
    $min = $vect[$mini]
   
    for ($i = 1; $i -lt $vect.Length; $i++){
        if (($min -gt $vect[$i] -and $vect[$i] -ne 0) -or $min -eq 0){
            $min = $vect[$i]
            $mini = $i
        }
    }
    return $mini
}

function clnei($matrix, $v){
    #Алгоритм ближайшего соседа, для поиска наименьшего (субоптимального) гамильтонового цикла
    $sum = 0
    $mini = $v
    $path = @($mini)
    for($i = 0; $i -lt ($matrix.Length - 1); $i++){
        $a = $mini
        $mini = minel -vect $matrix[$mini]
        $sum += $matrix[$a][$mini]
        $path += $mini
        $matrix[$a][$mini] = 0
        $matrix[$mini][$a] = 0
    }
    $path += $v
    $sum += $matrix[$mini][$v]
    $path
    $sum
}

$res = clnei -matrix $m -v 0
[System.String]::Join(",", $res)

Комментариев нет:

Отправить комментарий