你好,欢迎来到电脑编程技巧与维护杂志社! 杂志社简介广告服务读者反馈编程社区  
合订本订阅
 
 
您的位置:技术专栏 / C专栏
一个领导者选举算法
 
[java]  
根据Matrix67的"囚徒与灯泡"文章而写:  
 
根据Matrix67的"囚徒与灯泡"文章而写:
[java]  
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;  
                }  
            }  
  
        }  
    }  
  
}  
 
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:这个算法提供了一种很好的思路,但在实际选举策略中一般都不会用,因为条件不会如文章所假设的那种苛刻的场景。
  推荐精品文章

·2024年9月目录 
·2024年8月目录 
·2024年7月目录 
·2024年6月目录 
·2024年5月目录 
·2024年4月目录 
·2024年3月目录 
·2024年2月目录 
·2024年1月目录
·2023年12月目录
·2023年11月目录
·2023年10月目录
·2023年9月目录 
·2023年8月目录 

  联系方式
TEL:010-82561037
Fax: 010-82561614
QQ: 100164630
Mail:gaojian@comprg.com.cn

  友情链接
 
Copyright 2001-2010, www.comprg.com.cn, All Rights Reserved
京ICP备14022230号-1,电话/传真:010-82561037 82561614 ,Mail:gaojian@comprg.com.cn
地址:北京市海淀区远大路20号宝蓝大厦E座704,邮编:100089