根据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:这个算法提供了一种很好的思路,但在实际选举策略中一般都不会用,因为条件不会如文章所假设的那种苛刻的场景。
分享到:
相关推荐
HS(Hunt-Szymanski)算法和LCR(Lamport's Cluster Membership)算法是两种经典的领导者选举算法,常用于分布式环境中的主节点选择或者一致性维护。本文将深入探讨这两种算法的原理,并以Java语言为例,解析其实现...
Bully算法是一种基于消息传递的选举算法,主要应用在分布式系统中解决领导者选举问题。它的基本思想是通过节点的ID(或某种排序依据)来决定哪个节点成为领导者。 Bully算法的工作流程如下: 1. **初始化**:所有...
领导者选举设计模式对于使系统能够从一组节点中选举出领导者至关重要,确保领导者始终被认可并能够协调任务,而其他节点则保持跟随者的角色。该模式在分布式系统中至关重要,特别是...然而,在运行领导者选举算法之后,
分布式超级节点选举算法是一类在分布式系统中用于从一组节点中选择一个或多个节点来担任特定角色(如超级节点)的算法。超级节点通常在系统中扮演着领导者的角色,负责管理普通节点、提供资源、路由信息等。如果超级...
这个下限基于以下考虑:如果一个算法总能在`的时间内选举出领导者,则在两个独立的环形网络合并成一个大的环形网络时,可能会出现两个领导者的情况,因为它们各自的选举时间不足以让信息传播到合并点。 - **消息...
对IISLE算法进行了分析,IISLE算法的时间复杂度为O(n),针对无线网络环境的高断接概率,改进了IISLE算法,提出了一种适用于无线网络的改进自稳定领导者选举算法( ISLEABWN) .该算法结合移动主机断接概率模型,修改了IISLE...
如果一个节点在一段时间内没有接收到其他节点的心跳,它会认为那个节点可能已经失败,然后启动选举过程来选择新的领导者。 Zookeeper的心跳同步不仅仅用于检测故障,还用于传播信息。当一个节点接收到新的心跳,它...
2. **动态选举**:利用Gossip协议快速发现节点状态变化,辅助Raft的领导者选举过程,提高选举效率。 3. **容错增强**:通过Gossip协议的自我修复能力,配合Raft的领导者选举,提升系统的整体容错性。 4. **负载均衡*...
在这个场景中,我们关注的是在SystemC环境中实现的三种领导者选举算法:LCR(Lamport's Cookie Ring)、HS(Hartman-Schneider)以及Flood算法。 1. **LCR(Lamport's Cookie Ring)算法**: LCR算法基于令牌传递...
在JAVA中实现RAFT算法,可以为分布式系统提供可靠的领导者选举和状态机复制机制。 在RAFT算法中,主要有五个核心角色:领导者(Leader)、候选者(Candidate)、跟随者(Follower)、日志条目(Log Entry)和任期...
1. **问题定义**:领导选举是指在网络中选出一个唯一的节点作为领导者的过程。领导者负责协调网络内的其他节点,并执行特定的任务,如资源分配、通信协调等。 2. **目标**:最终的目标是确保网络中只有一个节点被...
5. 基于领导者选举的算法:为了解决分布式系统中死锁检测的复杂性和提高性能,论文提出了一种基于领导者选举的死锁检测算法。算法的核心思想是通过选举一个领导者来统一管理死锁检测的任务,避免多个算法实例之间的...
恶霸算法的实现欺负算法是一种从一组分布式计算机进程中动态选举协调员或领导者的方法。 此算法适用于每个进程都可以向系统中的每个其他进程发送消息的系统。入门仅使用以下命令为该过程构建映像并创建Docker容器: ...
在匿名的同步环系统中,由于所有处理器具有相同的状态机,根据Lemma3.1,如果存在一个使得某个处理器成为领导者的算法,那么所有处理器都会成为领导者,导致一致性领导者选举算法无法实现。而在异步环系统中,由于...
为了达到可扩展性,本文提出了一个动态系统的分层最终领导者选举算法。在动态系统中,进程的加入和离开会引起系统拓扑的改变。这种动态系统的特点是系统中参与的进程集合是在不断变化的。动态系统的一个关键问题就是...
它模仿了狼群在自然界中的群体协作、领导者选举、追踪猎物等行为,应用于解决多模态优化问题,具有较强的全局搜索能力和收敛速度。在本项目中,我们讨论了一种改进的狼群优化算法,并将其应用于旅行商问题...
标题中的“MPI.rar_leader election_mpi dfs”表明这是一个关于使用Message Passing Interface (MPI) 实现领导者选举算法,并结合深度优先搜索(DFS)技术的教程或项目。在这个场景中,MPI 是一个用于并行计算的库,它...
在Elixir中,我们可以利用其强大的行为模式(Behaviours)和进程通信能力来设计领导者选举算法。这里的关键概念包括GenServer行为、分布式节点管理和进程间的轻量级通信。下面我们将深入探讨这些知识点。 1. **...
首先,Raft算法的核心思想是将一致性问题分解为两个主要部分:领导者选举(Leader Election)和日志复制(Log Replication)。领导者是整个系统的心脏,它负责接收客户端的更新请求,将这些请求复制到追随者...
在分布式环境中,领导者选举是一种算法,用于在一个集群中选择一个节点作为“领导者”,其他节点则成为“跟随者”。领导者负责处理所有的写操作,并向跟随者广播这些变更,确保整个集群的数据一致性。这对于避免竞态...