Несовместимые типы для оператора с Мозелем - PullRequest
1 голос
/ 25 апреля 2020

Я начинаю использовать верстак Xpress Fico. Я пытался определить простую модель в файле model следующим образом:

model ModelName
  options noimplicit
  uses "mmxprs"
  ! uses "mminsight" ! uncomment this line for an Xpress Insight model

  declarations
    ! indici
    indexes = 1..4
    contraints = 1..2

    x: array(indexes) of mpvar
    c: array(indexes) of integer

    A: array(contraints, indexes) of real
    B: array(contraints) of real

    ! Objective:linctr
    profit: linctr
  end-declarations

  !profit:=250*x1+230*x2+110*x3+350*x4
  c::[250, 230, 110, 350]
  profit:=sum(i in indexes) c(i)*x(i)

  ! 2*x1+1.5*x2+0.5*x3+2.5*x4<=100
  ! 0.5*x1+0.25*x2+0.25*x3+x4<=50
  A::[  2,  1.5,  0.5, 2.5,
      0.5, 0.25, 0.25,   1]
  B::[  100,
         50]

  forall(r in contraints) do
    sum(c in indexes) A(r, c) * x(c) <= B(r)! body...
  end-do

  writeln("Begin running model")
    maximise(profit)
    writeln("profit: ", getobjval)

    forall(i in indexes) do
      writeln("x( ", i, ")", getsol(x(i)))
    end-do
  writeln("End running model")
end-model

Когда я пытаюсь построить файл, я получаю следующую ошибку

Mosel: E-101 at (33,21) of `studio/esL01_01.1.mos': Incompatible types for operator (`array of integer' in `range' not defined).
Mosel: E-151 at (33,31) of `studio/esL01_01.1.mos': Incompatible type for subscript 2 of `A'.

Любое предложение чтобы решить это?

1 Ответ

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

В вашем коде есть две проблемы:

Сначала вы используете c в качестве итератора в своей сумме, но он объявлен как массив выше. Поэтому Мозель жалуется, говоря, что вы используете массив в диапазоне, что вы не можете сделать. Вы не должны использовать уже объявленную переменную в качестве итератора в Mosel. Поэтому я изменил ваш итератор на cc.

Во-вторых, вы стремитесь взять сумму за A (r, c) * x (c). Вам нужно заключить их в скобки, чтобы Мозель знал, где заканчивается ваша сумма. В противном случае он будет предполагать, что вы берете сумму только по первому элементу A (r, cc).

Таким образом, ваш l oop должен быть таким:

forall(r in contraints) do
   sum(cc in indexes) (A(r, cc) * x(cc)) <= B(r)! body...
end-do
...