Много размерная модель в опл

Для моей магистерской диссертации мне нужно разработать много размерную модель для радиологии. Я реализую это с помощью opl, и я совершенно новичок в opl или программировании в целом. Итак, после долгого программирования и попыток запустить модель, она запускается. Но теперь он говорит мне решение 0 или отрицательного лота. Я сравнил свою модель с другими моделями, которые нашел в Интернете, и не нашел ничего плохого. Единственное, что приходит мне в голову, - это логическое значение dvar, которое мне нужно для настройки между типами обследования на машине MRT. Должен ли я сообщать программе, что dvar должен быть равен 1, когда есть junp для одного экзаменационного типа другому? Если да, то как я могу это сделать, и если нет, может ли кто-нибудь сказать мне, что не так в модели? И даже не знаю, работать ли мне с CP или MIP ...

Модель представляет собой динамическую модель с 9 исследованиями [i] для группирования по размерам партий, 3 машинами MRT [m] и 10 периодами [t].

//Sets
{string} ExaminationTypes = ...;
{string} Machines = ...;
{int} Periods = {1,2,3,4,5,6,7,8,9,10};
{int} PreviousPeriodIncluded = {0,1,2,3,4,5,6,7,8,9,10};

//Parameters
float SetupCosts[Machines][Periods]=...;
float ProductionCosts[ExaminationTypes][Machines][Periods]=...;
float OpportunityCosts[Periods]=...;      //when there are left overs of the prior period
float ScanDuration[ExaminationTypes]=...;
float Capacity[Machines][Periods]= ...;
int Demand[ExaminationTypes][Periods]= ...;

// constants
float Alpha = 0.75;
float SetupBeginTime = 9.50;
float SetupEndTime = 4.50;
int BigNumber = 999999;
float SetUpDuration = 2.00;
float CleaningDuration = 6.00;

Вначале возникла еще одна проблема с описанием невыполненных работ в периоде 0. Вот почему я построил новый набор периодов. Но теперь решение проблемы количества невыполненных заказов начинается уже с периода 0, и этого следует избегать.

//desicion variables
dvar boolean IsSetupNecessary[ExaminationTypes][Machines][Periods];
dvar boolean IsCapacityAvailable[Machines][Periods];
dvar int+ LotSize[ExaminationTypes][Machines][Periods];
dvar int+ BackLogs[ExaminationTypes][PreviousPeriodIncluded];

//objective function
dexpr float K   = sum( i in ExaminationTypes , m in Machines, t in Periods )
(
    SetupCosts[m][t] * IsSetupNecessary[i][m][t] +
    ProductionCosts[i][m][t] * LotSize[i][m][t] +
    OpportunityCosts[t] * BackLogs[i][t]
);
minimize K;


//contraints
subject to {
    forall( t in Periods )
    ctMeetingCapacity:
             (
                ( sum ( i in ExaminationTypes, m in Machines )
                    (ScanDuration[i]*LotSize[i][m][t] + SetUpDuration*IsSetupNecessary[i][m][t] + CleaningDuration*LotSize[i][m][t])
                )
                    <=
                ( Alpha * sum (m in Machines)
                        (
                        IsCapacityAvailable[m][t] *
                        1*
                        (Capacity[m][t] - (2 * SetupBeginTime + 2 * SetupEndTime))
                        )
                )
             );

      forall( i in ExaminationTypes, m in Machines, t in Periods )
      ctProduction:
                 (
                    LotSize[i][m][t] <= BigNumber * IsSetupNecessary[i][m][t]
                  );

     forall( i in ExaminationTypes, m in Machines, t in Periods )
     ctLogical:
                 (
                IsSetupNecessary[i][m][t] <= IsCapacityAvailable[m][t]
                  );

    forall( i in ExaminationTypes)
    ctZeroBackLogWhenT=1:
             (
             // re-check
             BackLogs[i][0] == 0
             );

    forall( i in ExaminationTypes, t in Periods )
    ctMeetingDemand:
             (
                ( sum ( m in Machines )
                    LotSize[i][m][t]
                )
                    <=
                ( Demand[i][t] + BackLogs[i][t-1] )
             );

    forall( i in ExaminationTypes, t in Periods )
    ctCalculationBackLog:
             (
                Demand[i][t] - ( sum ( m in Machines )LotSize[i][m][t]) - BackLogs[i][t-1] == BackLogs[i][t]
             );

     forall( i in ExaminationTypes, t in Periods )
     ctBigNumber:
                 (
                    BigNumber >= Demand[i][t]
                  );

    }

execute DISPLAY_RESULT{
//writeln("Gesamtkosten = ",K);
}

Извините за такую ​​длинную формулировку. Я был бы рад, если бы кто-нибудь знал, что делать!


person CrnD    schedule 29.09.2017    source источник
comment
Всем привет, теперь я устранил проблему и расчет пошел. Но, к сожалению, в качестве модели MIP я получаю ошибку: недостаточно памяти, в модели CP (с командой, использующей CP) вычисления выполнялись более 60 часов, пока мне не пришлось его остановить. Кто-нибудь знает, как запрограммировать более эвристический подход?   -  person CrnD    schedule 10.10.2017


Ответы (1)


arrow_upward
0
arrow_downward

к настоящему моменту, я думаю, вы закончили учебу, так что это больше не актуально, но на будущее = если вы хотите, чтобы кто-то воспроизвел ошибку, вы должны предоставить работоспособный материал:

float SetupCosts[Machines][Periods]=...;
float ProductionCosts[ExaminationTypes][Machines][Periods]=...;
float OpportunityCosts[Periods]=...;      //when there are left overs of the prior period
float ScanDuration[ExaminationTypes]=...;
float Capacity[Machines][Periods]= ...;
int Demand[ExaminationTypes][Periods]= ...;

нет данных для них выше, например, вы используете SetupCost в цели ...

person Laja    schedule 27.02.2019