1

对于我的硕士论文,我必须为放射学开发很多尺寸模型。我用 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);
}

很抱歉这么长的表述。如果有人知道该怎么做,我会很高兴!

4

1 回答 1

0

现在我猜你已经毕业了,所以这不再相关了,但是对于未来=如果你想让某人重现错误,你必须提供一个可运行的东西:

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...

于 2019-02-27T10:53:06.377 回答