private void optimize(float HL) {
			MakeTopo();					// establish temporary neighbouring through a modified delaunay algorithm
			boolean[] deletion = new boolean[N];
			for (int i=N-1;i>-1;i--)
				{
				int rem = 0;
				double xi = (double)((Balloon)(BallList.get(i))).x0;
				double yi = (double)((Balloon)(BallList.get(i))).y0;
				deletion[i] = false;
				for (int j=0;j<N;j++)
					{
					if (topo[i][j] & i!=j){
						for (int k=0;k<8;k++)
							{
							double angle = k*360./8.*3.14159/180.;
							int xx = (int)(xi + 4.5*Math.cos(angle));
							int yy = (int)(yi + 4.5*Math.sin(angle));
							xx = (int)Math.max(Math.min((double)xx,wmax),wmin);
							yy = (int)Math.max(Math.min((double)yy,hmax),hmin);
							float crit = couple(j,xx,yy);
							if ((crit<HL && deletion[j] == false) | IMB[(int)xx][(int)yy][2]>50)
								{
								deletion[i] = true;
								rem = 1;
								break;
								}
							}
						}
						if (rem == 1){break;}
					}
				}
		for (int i=N-1;i>-1;i--)
				{
				if(deletion[i] == true) { remove(i); }
				}
		}