Разработать этот алгоритм лучше? - PullRequest
10 голосов
/ 03 марта 2010

Я работаю над гораздо более сложной версией этого (с транспортным средством, движущимся в обоих направлениях X и Y)

Я сделал этот пример, чтобы получить идеи о лучших способах достижения этого.

  1. У меня есть транспортное средство, движущееся в направлении X со скоростью (24,5872 м / с)
  2. Я имитирую это, увеличивая значение X каждые 100 мс, используя исполнителя (чтобы сохранить его положение X более точным и в реальном времени)
  3. Через каждую секунду я отправляю сообщение другому процессу со значениями xMin и xMax строки, которую я только что охватил
  4. Другой процесс ответит сообщением JMS (обычно мгновенным), сообщающим мне, что нужно остановиться, если в предыдущей X-области была «дыра» (сообщение обратного вызова msg для связанной очереди блокировки).

У меня проблема с «обычно мгновенной» частью. Если я не получу ответ достаточно быстро, я думаю, что он потеряет все время моего алгоритма. Как лучше справиться с этой ситуацией?

Вот некоторый основной код того, что я пытаюсь сделать:

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

    }

}

Ответы [ 13 ]

0 голосов
/ 05 марта 2010

Есть ли у вас большой опыт в моделировании дискретных событий? Концепция заключается в том, что вы заранее планируете события в календаре, отслеживаете время, в которое эти события происходят в списке, и обновляете состояние системы по прибытии на любое событие с набором правил. Вместо того, чтобы беспокоиться о времени, необходимом для запуска вызываемой подпрограммы, вы фактически планируете будущее в списке. Имеет ли это смысл? Дайте мне знать, если вам нужно больше информации / ссылок.

0 голосов
/ 05 марта 2010

Разве нельзя было бы использовать Параллелизм или какую-то Технику чтения ?

Я имею в виду, что ваша проблема ждет сообщения. Если бы вы могли Async это, не поможет ли это? Возможно использовать обратный вызов?

Возможно, вы могли бы сохранить состояние при вызове процесса B и продолжить процесс A. Если процесс B отвечает с некоторой ошибкой, то остановите и верните состояние к сохраненным значениям.

0 голосов
/ 03 марта 2010

Пусть компьютер B отправит обратно информацию о месте выбоины, когда он его обнаружит, тогда компьютер A сможет переместить транспортное средство в это положение. Если транспортное средство на компьютере А делает что-то иное, чем просто сидеть там, когда оно попало в выбоину, то, возможно, эта статья поможет вам уменьшить внезапное изменение положения / направления / скорости: http://www.gamedev.net/reference/programming/features/cubicsplines/

  • Компьютер A: это компьютер отправив свою позицию
  • Компьютер B: компьютер, который проверяет наличие выбоин
...