设计这种算法更好的方法?

mai*_*rgs 10 java algorithm ipc

我正在研究一个更复杂的版本(车辆在X和Y方向上移动)

我做了这个例子来获得有关实现这一目标的更好方法的想法.

  1. 我有一辆车在X方向以一定的速度移动(24.5872 mps)
  2. 我通过使用执行器每100毫秒递增X值来模拟这一点(保持其X位置更准确和实时)
  3. 在每一秒之后,我向另一个进程发送一条消息,其中包含我刚刚介绍的行的xMin和xMax值
  4. 另一个进程将响应JMS消息(通常是立即),告诉我如果前一个X区域中存在"Pothole"(消息回调消息到一个linkedblockingqueue)则停止.

我遇到的问题是"通常是即时"部分.如果我没有足够快地得到响应,我认为它会摒弃我的算法的整个时间.处理这种情况的更好方法是什么?

以下是我要做的一些基本代码:

public class Mover implements MessageHandler {

    private static final long CAR_UPDATE_RATE_IN_MS = 100;
    private static double currX = 0;
    private static double CONSTANT_SPEED_IN_MPS = 24.5872; // 55 mph
    private static double increment = CONSTANT_SPEED_IN_MPS / (1000 / CAR_UPDATE_RATE_IN_MS);
    static LinkedBlockingQueue<BaseMessage> messageQueue = new LinkedBlockingQueue<BaseMessage>(); // ms

    private static int incrementor = 0;

    public static void main(String[] args) {
        startMoverExecutor();
    }

    private static void startMoverExecutor() {

        ScheduledExecutorService mover = Executors.newSingleThreadScheduledExecutor();
        mover.scheduleAtFixedRate((new Runnable() {

            @Override
            public void run() {
                currX = incrementor * increment;

                if (incrementor % (1000 / CAR_UPDATE_RATE_IN_MS) == 0) {
                    System.out.println(currX);

                    sendMessage(currX - CONSTANT_SPEED_IN_MPS, currX);

                    // do something
                    try {
                        messageQueue.poll(1000, TimeUnit.MILLISECONDS);

                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }

                }
                incrementor++;
            }

        }), 0, CAR_UPDATE_RATE_IN_MS, TimeUnit.MILLISECONDS);

    }

    @Override
    public void handleMessage(BaseMessage msg) {
        messageQueue.add(msg);

    }

    protected static void sendMessage(double firstX, double secondX) {
        // sendMessage here

    }

}
Run Code Online (Sandbox Code Playgroud)

Gla*_*boz 6

我建议对上面的算法进行更改,如下面的步骤所示.

JMS调用其他进程


1A.首先发送车辆的当前位置.

1B.另一个过程将使用JMS消息进行响应,该消息包含车辆位置可见区域中所有"Pot hole位置"的列表.在客户端保留此"可见的坑洞位置"列表,以供以下步骤使用.

1C.我们将可见区域定义为车辆的邻近区域,使得即使使用JMS调用其他过程的(1秒延迟+网络滞后),车辆的移动也不应越过该区域.

1D.每隔一秒后,重复步骤1a和1b,并在客户端替换相对于您车辆当前位置的坑洞位置列表.

.

车辆运动观察员


2A.实现观察者模式,可以接收车辆运动的通知.

2B.每次生成事件时,观察者将检查车辆的位置是否与步骤1b中获取的可见坑洞列表中的一个条目相匹配.

2C.如果找到匹配,宾果游戏!你必须停止车辆.

.

车辆运动


3A.注册步骤2a观察者观察车辆的运动

3B.等到你从步骤1b得到至少第一个可见的坑洞列表.

3C.通过每100毫秒递增X值开始移动车辆.每次移动时,都应通知步骤2a观察者.

.

下图的传说:


o - Instance of each pot hole somewhere on map 
X - Moving vehical
. - Path followed by vehical
Circle - Visible area of the vehical driver
+---------------------------------------------+
|                                             |
|                    o                o       |
|    o                                        |
|                                             |
|                                             |
|                _.-''''`-._                  |
|    o         ,'           `.             o  |
|            ,'  o            `.              |
|           .'    .            `.             |
|           |      . .          |             |
|           |         .         |   o         |
|           |         X         |             |
|   o       \                o  /             |
|            \                 /              |
|             `.             ,'               |
|               `-._     _.-'                 |
|                   `''''                     |
|                                             |
|                  o                          |
|                                    o        |
|                                             |
|                                             |
|     o                        o              |
+---------------------------------------------+
Run Code Online (Sandbox Code Playgroud)