PHP算法学习(2) 轮训加权算法

2019年1月8日16:10:51

svn地址:svn://gitee.com/zxadmin/live_z    代码在code里面

<?php

/*
 * 加权轮训算法
 *
 *
 * $arr = array(
  array(‘id‘ => ‘A‘, ‘weight‘ => 3),
  array(‘id‘ => ‘B‘, ‘weight‘ => 3),
  array(‘id‘ => ‘C‘, ‘weight‘ => 6),
  array(‘id‘ => ‘D‘, ‘weight‘ => 4),
  array(‘id‘ => ‘E‘, ‘weight‘ => 1),
  );
 * $arr = array(
  array(‘id‘ => ‘192.168.1.1‘, ‘weight‘ => 3),
  array(‘id‘ => ‘192.168.1.1‘, ‘weight‘ => 3),
  array(‘id‘ => ‘192.168.1.1‘, ‘weight‘ => 6),
  array(‘id‘ => ‘192.168.1.1‘, ‘weight‘ => 4),
  array(‘id‘ => ‘192.168.1.1‘, ‘weight‘ => 1),
  );
 */

class ZxWeightedRoundRobin {

    private static $_weightArray = array();
    private static $_i = -1; //代表上一次选择的服务器
    private static $_gcd; //表示集合S中所有服务器权值的最大公约数
    private static $_cw = 0; //当前调度的权值
    private static $_max; //最大元素的值
    private static $_n; //总元素个数

    public function __construct(array $weightArray) {
        self::$_weightArray = $weightArray;
        self::$_gcd = self::getGcd(self::$_weightArray);
    }

    public function getWeight() {
        while (true) {
            self::$_i = ((int) self::$_i + 1) % (int) self::$_n;
            if (self::$_i == 0) {
                self::$_cw = (int) self::$_cw - (int) self::$_gcd;
                if (self::$_cw <= 0) {
                    self::$_cw = (int) self::$_max;
                    if (self::$_cw == 0) {
                        return null;
                    }
                }
            }

            if ((int) (self::$_weightArray[self::$_i][‘weight‘]) >= self::$_cw) {
                return self::$_weightArray[self::$_i];
            }
        }
    }

    //获取最大公约数 Greatest common divisor  最大共同被除数
    private static function getGcd(array $weightArray) {
        if (empty($weightArray)) {
            throw new \Exception(‘数组不能为空‘);
        }
        $weight = [];
        //权重只能为正整数
        foreach ($weightArray as $k => $v) {
            if (!is_int($v[‘weight‘]) || $v[‘weight‘] <= 0) {
                throw new \Exception(‘权限不合法‘);
            }
            $weight[] = $v[‘weight‘];
        }
        $min = min($weight);
        self::$_max = max($weight);
        self::$_n = count($weight);
        //如果最小值是1,最小公约数就必定是1
        if ($min == 1) {
            return 1;
        }
        //如果不是1,就每个元素,循环查询对最小值往下做整除处理,如果全可以整除,如果有一个不能就中断
        for ($i = $min; $i > 1; $i--) {
            foreach ($weight as $k1 => $v1) {
                if ($v1 % $i == 0) {
                    $status = true;
                } else {
                    $status = false;
                    break;
                }
            }
            if ($status) {
                return $i;
            } else {
                return 1;
            }
        }
    }

}

这个方法,我理解了最大公约数,但是 getWeight 方法还没有彻底理解,最小公约的话,就只需要修改

for ($i = $min; $i > 1; $i--) {遍历就可以

测试调用方法
$arr = array(
    array(‘id‘ => ‘A‘, ‘weight‘ => 3),
    array(‘id‘ => ‘B‘, ‘weight‘ => 3),
    array(‘id‘ => ‘C‘, ‘weight‘ => 6),
    array(‘id‘ => ‘D‘, ‘weight‘ => 4),
    array(‘id‘ => ‘E‘, ‘weight‘ => 2),
);
$weight = new ZxWeightedRoundRobin($arr);
$a = 0;
$b = 0;
$c = 0;
$d = 0;
$e = 0;
for ($j = 0; $j < 100; $j++) {
    $weightInfo = $weight->getWeight();
    print_r($weightInfo);
    echo $weightInfo[‘id‘] . ‘----------------------weight:‘ . $weightInfo[‘weight‘] . ‘<br/>‘;
    if ($weightInfo[‘id‘] == ‘A‘) {
        $a++;
    }
    if ($weightInfo[‘id‘] == ‘B‘) {
        $b++;
    }
    if ($weightInfo[‘id‘] == ‘C‘) {
        $c++;
    }
    if ($weightInfo[‘id‘] == ‘D‘) {
        $d++;
    }
    if ($weightInfo[‘id‘] == ‘E‘) {
        $e++;
    }
}
echo ‘A:‘ . $a . ‘<br/>‘;
echo ‘B:‘ . $b . ‘<br/>‘;
echo ‘C:‘ . $c . ‘<br/>‘;
echo ‘D:‘ . $d . ‘<br/>‘;
echo ‘E:‘ . $e . ‘<br/>‘;
exit;
 

原文地址:https://www.cnblogs.com/zx-admin/p/10239570.html

时间: 2024-10-10 22:15:47

PHP算法学习(2) 轮训加权算法的相关文章

常见经典排序算法学习总结,附算法原理及实现代码(插入、shell、冒泡、选择、归并、快排等)

博主在学习过程中深感基础的重要,经典排序算法是数据结构与算法学习过程中重要的一环,这里对笔试面试最常涉及到的7种排序算法(包括插入排序.希尔排序.选择排序.冒泡排序.快速排序.堆排序.归并排序)进行了详解.每一种算法都有基本介绍.算法原理分析.算法代码. 转载请注明出处:http://blog.csdn.net/lsh_2013/article/details/47280135 插入排序 1)算法简介 插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法.它的工作原理是通过

机器学习算法学习---推荐系统的常用算法(一)

概括分类: 1)基于内容的推荐:这一类一般依赖于自然语言处理NLP的一些知识,通过挖掘文本的TF-IDF特征向量,来得到用户的偏好,进而做推荐.这类推荐算法可以找到用户独特的小众喜好,而且还有较好的解释性.这一类由于需要NLP的基础,本文就不多讲,在后面专门讲NLP的时候再讨论. 2)协调过滤推荐:本文后面要专门讲的内容.协调过滤是推荐算法中目前最主流的种类,花样繁多,在工业 界已经有了很多广泛的应用.它的优点是不需要太多特定领域的知识,可以通过基于统计的机器学习算法来得到较好的推荐效果.最大的

Kmeans算法学习与SparkMlLib Kmeans算法尝试

K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一.K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果.该算法接受参数 k :然后将事先输入的n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高:而不同聚类中的对象相似度较小.聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的. 算法描述: 假设要把样本集分为c个类别

Python之路,Day21 - 常用算法学习

Python之路,Day21 - 常用算法学习 本节内容 算法定义 时间复杂度 空间复杂度 常用算法实例 1.算法定义 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间.空间或效率来完成同样的任务.一个算法的优劣可以用空间复杂度与时间复杂度来衡量. 一个算

推荐引擎算法学习导论:协同过滤、聚类、分类

作者:July.出处:结构之法算法之道 本文转自互联网,仅供学习收藏只用,如有侵权,请联系本人删除. 引言 昨日看到几个关键词:语义分析,协同过滤,智能推荐,想着想着便兴奋了.于是昨天下午开始到今天凌晨3点,便研究了一下推荐引擎,做了初步了解.日后,自会慢慢深入仔细研究(日后的工作亦与此相关).当然,此文也会慢慢补充完善. 本文作为对推荐引擎的初步介绍的一篇导论性的文章,将略去大部分的具体细节,侧重用最简单的语言简要介绍推荐引擎的工作原理以及其相关算法思想,且为了着重浅显易懂有些援引自本人1月7

推荐算法 学习笔记一

“未来 30 年最大的财富会出现在这一领域:内容扩张得越多,就越需要过滤,以便使得注意力聚焦.注意力流到哪里,金钱就跟到哪里.”——摘自某笔记的博文 大学期间因为课题冲突(只要还是人懒欠思考),没有深入地去学习“机器学习”相关知识.近期看到很多关于推荐的博文,也与牛人同学有相关方面的接触,以前的懈怠令我大有悔意.亡羊补牢,犹未晚矣. 不过讲真,抛开主观因素,学点推荐相关的知识,对从事信息技术这个行业真的大有裨益. 言归正传,这篇文章介绍推荐算法(建议直接看英文原文,链接在最后). ## 算法分类

数据挖掘算法学习(八)Adaboost

本文不定期更新.原创文章,转载请注明出处,谢谢. Adaboost是一种迭代算法,其核心思想是针对同一个训练集训练不同的分类器(弱分类器),然后把这些弱分类器集合起来,构成一个更强的最终分类器(强分类器).Adaboost算法本身是通过改变数据分布来实现的,它根据每次训练集之中每个样本的分类是否正确,以及上次的总体分类的准确率,来确定每个样本的权值.将修改过权值的新数据集送给下层分类器进行训练,最后将每次得到的分类器最后融合起来,作为最后的决策分类器. 算法概述 1.先通过对N个训练样本的学习得

学习笔记:聚类算法Kmeans

前记 Kmeans是最简单的聚类算法之一,但是运用十分广泛,最近看到别人找实习笔试时有考到Kmeans,故复习一下顺手整理成一篇笔记.Kmeans的目标是:把n 个样本点划分到k 个类簇中,使得每个点都属于离它最近的质心对应的类簇,以之作为聚类的标准.质心,是指一个类簇内部所有样本点的均值. 算法描述 Step 1. 从数据集中随机选取K个点作为初始质心         将每个点指派到最近的质心,形成k个类簇 Step 2. repeat             重新计算各个类簇的质心(即类内部

算法学习 - 表达树的建立(后缀表达式法),树的先序遍历,中序遍历,后序遍历

表达树就是根据后缀表达式来建立一个二叉树. 这个二叉树的每个叶子节点就是数,真祖先都是操作符. 通过栈来建立的,所以这里也会有很多栈的操作. 树的先序遍历,中序遍历,后序遍历的概念我就不讲了,不会的自行百度,不然也看不懂我的代码. 下面是代码: // // main.cpp // expressionTree // // Created by Alps on 14-7-29. // Copyright (c) 2014年 chen. All rights reserved. // #includ