有人能把哲学家吃饭问题,改为哲学家喝酒问题吗?

duanran 2004-05-06 04:40:36
吃饭问题原码如下

我吃是想把fork改成瓶子,但是不同是瓶子有一个就可以喝,fork要有两个才可以吃



import java.awt.*;
import java.applet.*;

public class Diners extends Applet {

PhilCanvas display;
Thread[] phil= new Thread[PhilCanvas.NUMPHILS];
Fork[] fork = new Fork[PhilCanvas.NUMPHILS];
Scrollbar slider;
Button restart;
Button freeze;
boolean fixed = false;

public void init() {
setLayout(new BorderLayout());
String s = getParameter("Version");
fixed = s.equals("FIXED");
display = new PhilCanvas(this);
display.setSize(300,320);
add("Center",display);
slider = new Scrollbar(Scrollbar.HORIZONTAL, 50, 5, 0, 100);
restart = new Button("Restart");
freeze = new Button("Freeze");
Panel p1 = new Panel();
p1.setLayout(new BorderLayout());
p1.add("Center",slider);
p1.add("East",restart);
p1.add("West",freeze);
add("South",p1);
}

Thread makePhilosopher(Diners d, int id, Fork left, Fork right) {
if (fixed)
return new FixedPhilosopher(d,id,left,right);
else
return new Philosopher(d,id,left,right);
}

public int sleepTime() {
return (slider.getValue()*(int)(100*Math.random()));
}

public int eatTime() {
return (slider.getValue()*(int)(50*Math.random()));
}

public void start() {
for (int i =0; i<display.NUMPHILS; ++i)
fork[i] = new Fork(display,i);
for (int i =0; i<display.NUMPHILS; ++i){
phil[i] = makePhilosopher(this,i,
fork[(i-1+display.NUMPHILS)% display.NUMPHILS],
fork[i]);
phil[i].start();
}
}

public void stop() {
for (int i =0; i<display.NUMPHILS; ++i) {
phil[i].interrupt();
phil[i].stop(); //required for java 1.1
}
}

public boolean handleEvent(Event event) {
if (event.id != event.ACTION_EVENT) {
return super.handleEvent(event);
} else if(event.target==restart) {
if (display.deadlocked()) {
stop();
slider.setValue(50);
start();
}
display.thaw();
return true;
} else if (event.target == freeze) {
display.freeze();
return true;
} else
return super.handleEvent(event);
}
}
...全文
158 9 打赏 收藏 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
dlxu 2004-05-07
  • 打赏
  • 举报
回复
不都差不多阿
ai92 2004-05-07
  • 打赏
  • 举报
回复
喝酒问题有什么意义吗??
没有,这个不会有什么意思
规定每个哲学家只要拿起他左边或右边的酒就开始喝,这样最多就一个人不能喝
就等待
一点也不难解决阿
你能不能说的明白点
bbblllyyy 2004-05-07
  • 打赏
  • 举报
回复
20分让大家帮你看那么长的程序..估计很难办...
holy_phoenix 2004-05-07
  • 打赏
  • 举报
回复
应该自己想问题,不要把forum当作分析、设计、实现、维护程序一条龙服务的地方,只有你自己深入理解自己要干什么以后,再来forum咨询你实在无法弄明白的疑难点!
duanran 2004-05-06
  • 打赏
  • 举报
回复
这是我从网上整的程序,,
看明白一点
你要我怎么写注释呀

这个就是很普遍的concurrent 多线程的问题
哎
BigBangBug 2004-05-06
  • 打赏
  • 举报
回复
没有注释的程序没人会帮你的!就算你自己,等过了3个月,你也不知道这程序是怎么运行的
duanran 2004-05-06
  • 打赏
  • 举报
回复
又帮忙的吗?
duanran 2004-05-06
  • 打赏
  • 举报
回复


import java.awt.*;

class Philosopher extends Thread {

int identity;
boolean stopRequested = false;
PhilCanvas view;
Diners controller;
Fork left;
Fork right;

Philosopher(Diners controller, int identity, Fork left, Fork right) {
this.controller = controller;
this.view = controller.display;
this.identity = identity;
this.left = left;
this.right = right;
}

public void run() {
while (!stopRequested) {
try {
//thinking
view.setPhil(identity,view.THINKING);
sleep(controller.sleepTime());
//hungry
view.setPhil(identity,view.HUNGRY);
//get forks
if (identity%2 == 0) {
left.get();
view.setPhil(identity,view.GOTLEFT);
} else {
right.get();
view.setPhil(identity,view.GOTRIGHT);
}
sleep(500);
//if (identity%2 == 0)
// right.get();
//else
// left.get();
//eating
view.setPhil(identity,view.EATING);
sleep(controller.eatTime());
right.put();
left.put();
} catch (java.lang.InterruptedException e) {}
}
}


public void stopRequested() {
stopRequested = true;
}
}
duanran 2004-05-06
  • 打赏
  • 举报
回复


import java.awt.*;

class Fork {

private boolean taken=false;
private PhilCanvas display;
private int identity;

Fork(PhilCanvas disp, int id)
{ display = disp; identity = id;}

synchronized void put() {
taken=false;
display.setFork(identity,taken);
notify();
}

synchronized void get()
throws java.lang.InterruptedException {
while (taken) wait();
taken=true;
display.setFork(identity,taken);
}
}







import java.awt.*;

class PhilCanvas extends Canvas {

Diners controller;

static final int NUMPHILS = 5;
static final int THINKING = 0;
static final int HUNGRY = 1;
static final int GOTRIGHT = 2;
static final int EATING =3;
static final int GOTLEFT = 4;

Image[] imgs = new Image[5];


double [] philX = new double[NUMPHILS];
double [] philY = new double[NUMPHILS];
int [] state = new int [NUMPHILS];
boolean[] redraw = new boolean[NUMPHILS];

double [] chopX = new double[NUMPHILS];
double [] chopY = new double[NUMPHILS];
boolean[] untable= new boolean[NUMPHILS];

boolean wasdeadlocked = false;

boolean frozen = false;

PhilCanvas(Diners controller) {
super();
this.controller = controller;

MediaTracker mt;
mt = new MediaTracker(this);

imgs[0] = controller.getImage(controller.getDocumentBase(), "image/thinking.gif");
mt.addImage(imgs[0], 0);
imgs[1] = controller.getImage(controller.getDocumentBase(), "image/hungry.gif");
mt.addImage(imgs[1], 1);
imgs[2] = controller.getImage(controller.getDocumentBase(), "image/gotright.gif");
mt.addImage(imgs[2], 2);
imgs[3] = controller.getImage(controller.getDocumentBase(), "image/eating.gif");
mt.addImage(imgs[3], 3);
imgs[4] = controller.getImage(controller.getDocumentBase(), "image/gotleft.gif");
mt.addImage(imgs[4], 4);

try {
mt.waitForID(0);
mt.waitForID(1);
mt.waitForID(2);
mt.waitForID(3);
mt.waitForID(4);
} catch (java.lang.InterruptedException e) {
System.out.println("Couldn't load one of the images");
}
initPlacing();
}

Image offscreen;
Dimension offscreensize;
Graphics offgraphics;

void backdrop() {
Dimension d = size();
if ((offscreen == null) || (d.width != offscreensize.width)
|| (d.height != offscreensize.height)) {
offscreen = createImage(d.width, d.height);
offscreensize = d;
offgraphics = offscreen.getGraphics();
offgraphics.setFont(new Font("Helvetica",Font.BOLD,18));
}
offgraphics.setColor(Color.lightGray);
offgraphics.fillRect(0, 0, size().width, size().height);
for (int i = 0; i < NUMPHILS; i++) {
redraw[i] = true;
}
}

void drawtable() {
offgraphics.setColor(Color.red);
offgraphics.fillOval(105,105,90,90);
offgraphics.setColor(Color.black);
for(int i=0; i<NUMPHILS; i++) {
if(untable[i]) offgraphics.fillOval((int)chopX[i],(int)chopY[i],10,10);
//offgraphics.drawString(String.valueOf(i),(int)chopX[i],(int)chopY[i]);
}
}


public void paint(Graphics g) {
backdrop();
update(g);
}

public void update(Graphics g) {
if (wasdeadlocked) {
backdrop();
wasdeadlocked=false;
}
for (int i = 0; i < NUMPHILS; i++) {
if (redraw[i]) {
philPaint(offgraphics,i);
redraw[i] = false;
}
}
drawtable();
if (deadlocked()) {
offgraphics.setColor(Color.black);
offgraphics.drawString("DEADLOCKED",90,130);
wasdeadlocked=true;
}
g.drawImage(offscreen, 0, 0, null);
}

void philPaint(Graphics g,int i) {
g.setColor(Color.lightGray);
g.fillRect((int)philX[i], (int)philY[i],imgs[0].getWidth(this),imgs[0].getHeight(this));
g.drawImage(imgs[state[i]], (int)philX[i], (int)philY[i], this);
// g.setColor(Color.black);
// g.drawString(String.valueOf(i),(int)philX[i]+10, (int)philY[i]+10);
}


synchronized void setPhil(int id,int s) throws java.lang.InterruptedException{
while (frozen) wait();
state[id] = s;
redraw[id] = true;
repaint();
}

synchronized void freeze(){
frozen = true;
}

synchronized void thaw() {
frozen = false;
notifyAll();
}

synchronized void setFork(int id, boolean taken) {
untable[id]= !taken;
}

boolean deadlocked(){
int i=0;
while(i<NUMPHILS && state[i]==GOTRIGHT) ++i;
return i==NUMPHILS;
}

void initPlacing() {
double x, y;
double radius = 105.0;
double centerAdj = 100.0;
double radians;

for (int i = 0; i < NUMPHILS; i++) {
radians = i*(2.0 * Math.PI /(double)NUMPHILS);
philX[i] = Math.sin(radians) * radius + centerAdj;
philY[i] = Math.cos(radians) * radius + centerAdj;
}

radius = 35;
centerAdj = 145;

for (int i = 0; i < NUMPHILS; i++) {
radians = i*(2 * Math.PI /(double)NUMPHILS) + Math.PI/5;
chopX[i] = Math.sin(radians) * radius + centerAdj;
chopY[i] = Math.cos(radians) * radius + centerAdj;
untable[i] = true;
}
}
}
内容概要:本文介绍了一个基于Python的无人机三维路径规划项目,采用差分进化算法(DE)在复杂三维环境中自动生成安全、高效的飞行路径。项目构建了包含起点、终点和多个长方体障碍物的三维空间模型,通过将路径编码为中间航点向量,利用差分进化进行全局优化。适应度函数综合考量路径长度、碰撞惩罚、安全距离、转弯代价、爬升能耗和高度约束,确保生成的路径在安全性、平滑性和可行性之间取得平衡。优化后还引入路径简化机制,删除冗余航点并检测直连安全性,以减少航点数量并提升可执行性。程序输出包括三维路径图、障碍物可视化、适应度收敛曲线及各项性能指标,支持后续扩展至真实地图、地形模型和动力学仿真。; 适合人群:具备Python编程基础,熟悉NumPy、matplotlib等库,从事无人机、智能优化、路径规划相关研究或开发的科研人员、研究生及工程师(工作年限1-3年或有相关项目经验者); 使用场景及目标:①解决城市、山区、工业区等复杂三维环境下的无人机避障路径规划问题;②学习差分进化算法在连续空间优化中的应用;③为低空物流、应急救援、巡检监测等实际场景提供算法原型与二次开发基础; 阅读建议:建议结合提供的完整代码与可视化结果进行实践,重点关注环境建模、适应度函数设计、差分进化实现与路径后处理逻辑,可通过调整参数(如种群规模、权重系数)观察优化效果变化,深入理解多目标权衡与算法调参策略。
内容概要:本文围绕2026年高教社杯全国大学生数学建模竞赛B题“无线电干扰源的快速自动定位与清除”提供了一套完整的数学建模、算法实现与论文撰写的免费资源。该资源由“荔枝科研社”出品,依托一个涵盖智能优化算法、机器学习、深度学习、信号处理、通信技术、电力系统管理等多个前沿领域的综合性科研资源共享平台。文档以MATLAB和Python为主要工具,聚焦于复杂工程问题的建模与求解,尤其在干扰源定位、状态估计、路径规划及优化调度等方面具有突出的应用价值。资源不仅包含竞赛题目解析,还提供了大量可复现的代码实例与技术文档,旨在帮助用户深入理解算法原理并提升科研实践能力。; 适合人群:具备一定编程基础,特别是熟练掌握MATLAB或Python语言的本科生、研究生,正在备战数学建模竞赛的学生,以及从事通信、信号处理、电力系统等相关领域研究的科研人员和技术开发者。; 使用场景及目标:①为参赛学生提供B题的完整解题思路、模型构建方法与代码实现路径,加速竞赛准备进程;②为科研工作者提供高质量、可复现的算法代码与技术参考,推动智能算法在无线通信、应急响应、环境监测等实际场景中的应用研究;③促进跨学科技术融合,支持教学、科研与工程实践的协同发展。; 阅读建议:建议读者结合文中提供的网盘链接与《荔枝科研社资源整理目录》系统性地查阅资料,优先选择与自身研究方向契合的技术模块进行深入学习,并动手运行代码以验证算法效果。同时推荐关注微信公众号“荔枝科研社”以获取持续更新的技术内容与社群支持。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧