`
javawebsoa
  • 浏览: 409396 次
社区版块
存档分类
最新评论

一个领导者选举算法

阅读更多
根据Matrix67的"囚徒与灯泡"文章而写:
public class Wakeup {
	static class People {
		//记录第一次进入时确定的位置 0未确定,-1 左边 1右边.
		public int Position;
		//手上的球
		public int BallNum;
		//标识
		public int Id;
		//是否还在参与跷跷板游戏
		public boolean OnLine;

		public People(int Id) {
			this.Id = Id;
			Position = 0;
			BallNum = 2;
			OnLine = true;
		}

	}

	private static int PeopleCount=100;//参与者人数
	
	private static boolean BoxIsEmpty = true;// 盒子是否是空的
	private static boolean LeftIsWeight = false;//跷跷板左边低

	public static void main(String[] args) {

		People[] thePeoples = new People[100];
		for (int i = 0; i < PeopleCount; i++) {
			thePeoples[i] = new People(i);
		}
		boolean finished = false;
		int k = 0;
		int i = 0;
		int outNum = 0;
		
		while (!finished) {
			k++;
			i = (new Random().nextInt(PeopleCount)) % PeopleCount;
			People theP = thePeoples[i];
			if (theP.OnLine) {
				if (theP.Position == 0) {
					theP.Position = LeftIsWeight ? -1 : 1;
					LeftIsWeight = !LeftIsWeight;
				} else {

					if (theP.Position == -1) {
						if (LeftIsWeight) { // 左边本侧低,如果有球则取
							if (!BoxIsEmpty) {
								BoxIsEmpty = true;
								theP.BallNum++;

							}

						} else {// 本侧高,空就放球
							if (BoxIsEmpty) {
								if (theP.BallNum > 0) {
									theP.BallNum--;
									BoxIsEmpty = false;

								}

							}
						}

					} else {

						if (LeftIsWeight) {// 本侧高,空就放球
							if (BoxIsEmpty) {
								if (theP.BallNum > 0) {
									theP.BallNum--;
									BoxIsEmpty = false;

								}

							}

						} else {// 本侧低,非空就取球
							if (!BoxIsEmpty) {
								BoxIsEmpty = true;
								theP.BallNum++;
							}

						}

					}

				}
				//如果没有球,则退出,什么都不做
				if (theP.BallNum <= 0) {
					LeftIsWeight = !LeftIsWeight;
					theP.OnLine = false;
					outNum++;
					System.out.println("Out:" + theP.Id);
				}
				//如果收集到200个球或者199个球,另外一个球在盒子里,则表示获得胜利.
				if (theP.BallNum + (BoxIsEmpty ? 0 : 1) >= PeopleCount * 2) {
					System.out.println("胜利者:" + theP.Id + ",共执行:" + k);
					finished = true;
				}
			}

		}
	}

}

PS:这个算法提供了一种很好的思路,但在实际选举策略中一般都不会用,因为条件不会如文章所假设的那种苛刻的场景。

分享到:
评论

相关推荐

    一种基于无线网络的改进自稳定领导者选举算法 (2015年)

    对IISLE算法进行了分析,IISLE算法的时间复杂度为O(n),针对无线网络环境的高断接概率,改进了IISLE算法,提出了一种适用于无线网络的改进自稳定领导者选举算法( ISLEABWN) .该算法结合移动主机断接概率模型,修改了IISLE...

    分布式系统中基于领导者选举的死锁检测算法

    分布式系统中基于领导者选举的死锁检测算法

    bully-algorithm:用于从一组分布式计算机节点中动态选举领导者的欺凌算法的实现

    恶霸算法的实现欺负算法是一种从一组分布式计算机进程中动态选举协调员或领导者的方法。 此算法适用于每个进程都可以向系统中的每个其他进程发送消息的系统。入门仅使用以下命令为该过程构建映像并创建Docker容器: ...

    分布式算法 作者:(美)Nancy A.Lynch 舒继武 李国东part1

    15.5.9 应用到领导者选举算法中 302 15.6 参考文献注释 303 15.7 习题 303 第16章 同步器 307 16.1 问题 307 16.2 局部同步器 309 16.3 安全同步器 313 16.3.1 前端自动机 314 16.3.2 通道自动机 315 16.3.3 安全...

    node-etcd-leader:Node.js 的 Etcd 领导者选举实现

    领导者选举模块建立在强大的选举算法上,并经过彻底的测试。 用法 提供一个配置客户端。 请注意,此包不依赖于 node-etcd。 它与^4.0.0版本的 node-etcd 兼容。 var Etcd = require ( "node-etcd" ) ; var ...

    领导人选举:领导人选举

    欺负算法是君主制领导者选举的一种。 假设条件 系统是同步的。 进程可能会随时失败,包括在算法执行期间失败。 有一个故障检测器,可以检测失败的进程。 进程因停止而失败,并因重新启动而从失败中返回。 进程...

    bully-election:分布式系统的恶霸选举算法

    恶霸选举算法 在Go中实现的用于在Kubernetes集群中部署的分布式系统的恶霸选举算法。 监视器 /metrics使用指标端点获取有关副本状态的信息, ... 当广告连播数量很高(&gt; = 20)时,可能会选择多个领导者。 链接

    分布式共识算法之Raft算法

    领导者通过心跳信息,告诉其他节点我还活着,别进行领导者选举。在正常情况下,选举出来的领导者会一直是领导者。2、跟随者(Follower):默默的接受领导者节点的日志复制与心跳超时RPC。当跟随者在随机的超时时间内,...

    Distributed-System-Algorithms-Implementation:实现时钟同步,一致性,互斥,领导者选举的算法

    分布式系统算法的实现实现时钟同步,一致性,分布式互斥,组长选举的算法时钟同步:在交易系统的4台服务器网络中实现矢量时间戳,其中交易,核对余额,存款或取款等每个过程都是一项工作,并根据网络中请求的到达...

    BullyAlgorithm:实现Bully选举算法的Node程序

    霸凌算法这是 Bully 算法的一个实现。 它假定一个静态组以简化组管理。 它使用矢量时钟来确定事件顺序。 例如,转到 ShiViz 并上传 ShiVizLog.... 该组将选举具有最高节点 ID 的节点作为该组的领导者(对于任何任务)。

    分布式代理技术在网络管理系统中的应用

    者出现故障时,能快速选举出一个正确且唯一的领导者来协调进行分布式检测,提高了 管理系统的可靠性.本文详细阐述了算法的思想、模型和实现步骤,并通过数学证明进 一步验证了算法的正确性和稳定性.

    Raft-LeaderElection:使用 Raft 共识协议进行领导人选举

    为了增强可理解性,Raft 分离了共识的关键要素,例如领导者选举、日志复制和安全性。 在这里,我们的主要重点是在分布式环境中选举一个独特的领导者,同时确保安全和活跃。 ###执行 可以在 Report.pdf 中找到 #...

    论文研究-基于MOFTLBTV的WSNs定位算法.pdf

    在识别过程中利用分布式竞争领导者(DCL)算法产生领导者(leader)节点。通过估计leader节点数实现对目标源的识别。随后定位阶段采用基于网格投票(GBV)机制对目标源进行定位。在条件下将MOFTLBTV与DNLEP算法在对...

    Leader_election:最佳领导者演绎法

    领导人选举 领导者最优算法的演绎。

    node-raft-algorithm:RAFT 共识算法的 node.js 实现

    这个库正在开发中,几乎不可用。 欢迎有质量的贡献。 筏 Raft 是一种类似于 Plaxo 的共识算法,但采用主从方案。... 领导者选举时的领导者无操作承诺(领导者完整性属性,Raft #8) 读取时的多数心跳(Lead

    阅读笔记(六)共识算法2PC

    选举领导者节点用于更高层的协议处理   对于一个共识算法,最重要的是以下三个特性: 达成承诺(Agreement):所有的节点会保持一个相同的值 有效性(Validity):决定采取的值必须是由某个节点提出的 终结性...

    leader-election-in-wireless-environments:在简单的不断增长的无线环境图中找到容量最大的领导者

    无线环境中的领导者选举算法 在简单的 90% 增长的无线环境图表上查找容量最大的领导者。

    Sofa-jraft:RAFT共识算法的生产级Java实现

    SOFAJ筏总览SOFAJRaft是基于一致性算法的生产级高性能Java实现,该算法支持MULTI-RAFT-GROUP用于高负载... 用于重新引导,负载平衡场景等的传输领导者的机制对称的网络分区容限不对称的网络分区容限容错,少数故障不会

    raft算法理论与实践

    前言 我计划写raft的一系列文章,包含从...1、leader:raft中会有一个领导者具有超级权限,可以把自己的log 复制到其他节点中。 2、leader election: raft每隔一段随机的时间就会进行leader的选举 3、raft允许集群配置

Global site tag (gtag.js) - Google Analytics