📄 antcolony.java
字号:
for(int j=0;j<height;j++){
if(grid[i][j]>=1){
/*for(int k=0;k<2;k++){
Pheromone_grid[k][i][j]=0;
}
for(int m=0;m<phe.size();m++){
Pheromone p=(Pheromone)phe.elementAt(m);
if(p.x==i&&p.y==j){
phe.removeElement(p);
}
}*/
}
switch (grid[i][j]){
case 1:
//如果grid[][]存的是障碍物
obs_grid[i][j]=obsCount;
obsP[obsCount]=new Point(i,j);
obsCount++;
break;
case 2:
//如果grid[][]存的窝点信息,多余的窝点信息省去了
if(OriginPts<100){
OriginPt[OriginPts]=new Point(i,j);
OriginPts++;
}
break;
case 3:
//如果grid[][]存的食物点信息,多余的食物点信息省去了
if(EndPts<100){
EndPt[EndPts]=new Point(i,j);
EndPts++;
}
break;
}
}
}
//如果没有指定窝,则随机的选择一点
if(OriginPts==0){
for(int i=0;i<width;i++){
int j;
for(j=0;j<height;j++){
if(obs_grid[i][j]<0){
OriginPt[OriginPts]=new Point(i,j);
OriginPts++;
break;
}
}
if(j<height-1){
break;
}
}
}
}
public void reinit(){
//重新初始化整个环境
//先停止程序的运行
running=false;
btnStart.setLabel("开始");
//清空所有信息素Pheromone数组中的值
for(int i=0;i<width;i++){
for(int j=0;j<height;j++){
for(int k=0;k<2;k++){
Pheromone_grid[k][i][j]=0;
}
}
}
//初始化蚂蚁数组,antCount只蚂蚁在不同的窝点之间进行随机的分配
for(int i=0;i<antCount;i++){
int index=(int)(OriginPts*Math.random());
ants[i].OriginPt=new Point(OriginPt[index]);
ants[i].init();
}
//清空信息素向量
phe.removeAllElements();
//在每个食物点和窝点周围分布一定量的按照梯度递减的信息素,分配的是一个点为中心的半径为FoodR的圆,并且信息素按照半径递减
for(int i=0;i<EndPts;i++){
for(int x=-FoodR;x<=FoodR;x++){
int y=(int)(Math.sqrt(FoodR*FoodR-x*x));
for(int yy=-y;yy<=y;yy++){
Pheromone_grid[1][(EndPt[i].x+x+width)%width][(EndPt[i].y+yy+height)%height]=(int)(1000*(1-Math.sqrt(x*x+yy*yy)/FoodR));
}
}
}
for(int i=0;i<OriginPts;i++){
for(int x=-FoodR;x<=FoodR;x++){
int y=(int)(Math.sqrt(FoodR*FoodR-x*x));
for(int yy=-y;yy<=y;yy++){
Pheromone_grid[0][(OriginPt[i].x+x+width)%width][(OriginPt[i].y+yy+height)%height]=(int)(1000*(1-Math.sqrt(x*x+yy*yy)/FoodR));
}
}
}
//重画
canvas.repaint();
//让程序开始运行
//running=true;
}
public void paint(Graphics g) {
canvas.repaint();
}
public static void main(String[] args) {
Antcolony applet = new Antcolony();
applet.isStandalone = true;
Frame frame;
frame = new Frame() {
protected void processWindowEvent(WindowEvent e) {
super.processWindowEvent(e);
if (e.getID() == WindowEvent.WINDOW_CLOSING) {
System.exit(0);
}
}
public synchronized void setTitle(String title) {
super.setTitle(title);
enableEvents(AWTEvent.WINDOW_EVENT_MASK);
}
};
frame.setTitle("Applet Frame");
frame.add(applet, BorderLayout.CENTER);
applet.init();
applet.start();
frame.setSize(300,320);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
frame.setLocation((d.width - frame.getSize().width) / 2, (d.height - frame.getSize().height) / 2);
frame.setVisible(true);
}
public void start()
//下面三个函数是控制线程的
{
if (runner == null)
{
runner= new Thread(this);
runner.start();
//running = true;
}
}
public void stop()
{
if (runner!=null)
{
runner.stop();
runner=null;
running = false;
}
}
public void run() {
int i;
//线程一直运行下去
while (true) {
if(running){
//如果开始动画,就进行canvas的处理
canvas.process();
}
try { Thread.sleep(delay);}
catch (InterruptedException e) {
}
}
}
public boolean action(Event evt, Object o) {
if (evt.target == btnMap) {
//开始编辑地图面板
running=false;
btnStart.setLabel("开始");
MapPad ctl = new MapPad(this);
ctl.setSize(308,380);
ctl.show();
return true;
}else if(evt.target == btnStart){
if(!running){
//如果刚刚按下了重置按钮就重新初始化一下
if(reset)reinit();
btnStart.setLabel("停止");
reset=false;
running=true;
}else{
btnStart.setLabel("开始");
running=false;
}
return true;
}else if(evt.target == btnReset){
running=false;
int j=0;
//表示已经按下了重置按钮,以便下次开始的时候进行重新初始化
reset=true;
repaint();
btnStart.setLabel("开始");
return true;
}else if(evt.target == btnConfig){
running=false;
btnStart.setLabel("开始");
Configer ctl = new Configer(this);
ctl.setSize(300,300);
ctl.show();
return true;
}else if(evt.target == choPDraw){
//选择画信息素的模式
drawPhe=choPDraw.getSelectedIndex();
if(drawPhe!=1){canvas.repaint();}
return true;
}
return false;
}
/**Destroy the applet*/
public void destroy() {
//当结束程序的时候,把线程也结束
if (runner!=null)
{
running = false;
runner.stop();
runner=null;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -