2017-07-17 7 views
0

2つの都市間の脚を表す間隔のdvarと、その間隔のdvarシーケンスを定義します。 rightnow、私は以下の条件を罰したい:区間の目的地の都市が次の区間の出発都市でない場合は、変数に1を数えます。例えば、countVarという名前です。私は目的の中でcountVarを最小限に抑えます。これどうやってするの?シーケンス内の隣接間隔を得る方法

答えて

0

必要な処理を行うにはtypeOfNextを使用できます。あなたに小さな例を教えてください。その方法は、あなたが計算することができ ここ

{<"tia[1]" 0 0 1 0 1 1> 
    <"tia[2]" 1 1 2 1 3 2> 
    <"tia[3]" 2 2 3 3 6 3> 
    <"tia[4]" 3 3 4 6 10 4> 
    <"tia[5]" 4 4 5 10 15 5> 
    <"tia[6]" 5 5 6 15 21 6>} 
<1 0 1 1> 
<1 1 3 2> 
<1 15 21 6> 
loop 
<1 0 1 1> 
<1 1 3 2> 
<1 3 6 3> 
<1 6 10 4> 
<1 10 15 5> 
<1 15 21 6> 
null 
typeOfNextResult= [2 3 4 5 6 -1] 

よろしく

+0

おかげでたくさんです。 :)別の質問:私はあなたがOPLスクリプトの最初の間隔を取得するためにseq.first()を使用していることに気付きました。どのようにOPLスクリプトではなく、OPLの最初の区間を取得できますか? –

+0

こんにちは、 "first(seq、tia [3]);"と書くことができます。 tia [3]がシーケンスseqの最初の間隔であると言うために。 –

+0

first(seq、tia [3])は、インターバル変数をシーケンスの最初のものに制限します。私は、最初の区間にいくつかの特殊な属性があることを確認したい場合(例えば、最初の区間からの旅行は特定の都市から始める必要があります)、最初の区間を取得するにはどうすればいいですか? –

0

//を与えるCOUNTVAR

using CP; 

    range R = 1..6; 

    dvar interval tia[i in R] size i; 
    dvar sequence seq in all(i in R)tia[i] types all(i in R)i; 
    dvar int typeOfNextResult[i in R]; 

    subject to { 
     noOverlap(seq); 

     // computing typeOfNextResult 
     forall(i in R) typeOfNextResult[i]==typeOfNext(seq,tia[i],-1,-2); 
    } 

    execute { 
     writeln(seq); 
     writeln(seq.first()); 
     writeln(seq.next(seq.first())); 
     writeln(seq.last()); 

     writeln("loop"); 
     var s=seq.first(); 
     for(var i in R) 
     { 
     writeln(s); 
     s=seq.next(s) ; 
     } 
     writeln(s); 

     writeln("typeOfNextResult=",typeOfNextResult); 
    } 

はCPLEXプログラムは、あなたの種類の助けを

using CP; 
tuple flightLeg{ 
key int LegID; 
int departurePoint; 
int destinationPoint; 
int aircraftID; 
} 
{flightLeg} Legs=...; 
tuple aircraft{ 
key int aircraftID; 
int aircraftType; 
} 
{aircraft} aircraftSet=...; 
tuple stop{ 
    int LegID1; 
    int LegID2; 
    int stopTime; 
} 
{stop} stopTimes=...; 
dvar interval invFlighttasks[i in Legs][j in aircraftSet] optional 
     size 10; 
dvar sequence seqAircrafts[i in aircraftSet] in 
    all(j in Legs) invFlighttasks[j][i] types 
    all(j in Legs) j.LegID; 
//minize the number of disconnect (means the destinationPoint of a interval 
//is not the departurePoint of it's next interval) 
subject to { 
    forall (i in aircraftSet) 
     noOverlap(seqAircrafts[i],stopTimes); 
} 
関連する問題