Как напечатать значения переменных в gecode - PullRequest
2 голосов
/ 23 апреля 2020

Я пытаюсь решить линейное уравнение 15 * x + y + 0.4 * z == 100, используя gecode. Я хочу напечатать значения x, y, z. Но когда я запускаю следующий код,

class LinearEq1 : public Space {
protected:
    IntVar x;
    IntVar y;
    IntVar z;
public:
    LinearEq1(void) :x(*this,-100,100), y(*this, -100, 100), z(*this, -100,100) {
        // no leading zeros
        rel(*this, x, IRT_GR, 0);
        rel(*this, y, IRT_GR, 0);
        rel(*this, z, IRT_GR, 0);
        rel(*this, 15 * x + y + 0.4*z == 100);
    }
    // search support
    LinearEq1(LinearEq1& s) : Space(s) {
        x.update(*this, s.x);
        y.update(*this, s.y);
        z.update(*this, s.z);
    }
    virtual Space* copy(void) {
        return new LinearEq1(*this);
    }
    // print solution
    void print(void) const {
        std::cout << x<<"  "<<y<< " "<<z<<std::endl;
    }
};

// main function
int main(int argc, char* argv[]) {
    // create model and search engine
    LinearEq1* m = new LinearEq1;
    DFS<LinearEq1> e(m);
    delete m;
    // search and print all solutions
    LinearEq1* s = e.next();
    s->print();
    return 0;
}

, я получаю вывод как [1..6] [10..85] [1..100]. Но я ожидаю одно правильное решение, такое как 1 83 5 в качестве ответа для значений xyz соответственно. Может кто-нибудь объяснить ??

1 Ответ

1 голос
/ 23 апреля 2020

Вы забыли добавить инструкцию перехода для переменных. Без каких-либо ветвлений выполнение будет остановлено после распространения и предполагается, что оно достигло решения, если ни один из распространителей не завершился неудачей.

Простой пример ответвителя для массива переменных - branch(*this, x, INT_VAR_SIZE_MIN(), INT_VAL_MIN());. Более подробную информацию о филиалах можно найти в MPG .

...