[model_ILP.mod]

 

param nodes;
param wavelengthes;
param timeslots;
set N := 0 .. nodes-1 circular;
set W := 0 .. wavelengthes-1;
set T:=0 .. timeslots-1 ordered;
set L := 0 .. nodes-1;

#指定各接收端所使用的wavelength
param recW{i in N} := (i mod wavelengthes);

#定義節點i到節點j所經過的link ex: 1->2->3->4 , 則此path會經過的link為1,2,3
set path{i in N,j in N} := (if i<j then i .. j-1 else ( if (i>j) then (i .. nodes-1 union 0 .. j-1) else {}) ) ordered;

#計算節點i到節點j所經過的hop數,ex:1->2->3->4,則hop數為3,等同於計算此path所經過的link數目
param distance{i in N, j in N} := (card(path[i,j]));

# 指定traffic pattern 為AAPC
param traffic{i in N, j in N} := (if i=j then 0 else 1);

param pd;
param TT;
#param LT;
#param WeightOfT{t in T} := 2**t;

#var hy{t in T};
var useResource{i in N, j in N, w in W, l in L, t in T} >= 0 integer;
var useTimeslot{t in T} = sum{i in N, j in N, w in W, l in L} useResource[i,j,w,l,t];
#應該讓越前面的timeslot有越小的weight才對
#n=10,w=2的情形下,若不使用WeightOfT則可順利解出,是否要試著改變計算權重的方式,以免t 太大時要拆成兩部分來解

#minimize period: sum{i in N, j in N, l in L} useResource[i,j,l,LT];
#minimize cost: sum{t in T} WeightOfT[t]*hy[t];
minimize cost: sum{t in T} useTimeslot[t]*t;

subject to Transmitter{i in N, t in T}: sum{j in (N diff {i})} useResource[i,j,recW[j],i,t] <= 1;
subject to Receiver{j in N, t in T}: sum{i in (N diff {j})} useResource[i,j,recW[j],prev(j,N),t] <= 1;
subject to Flow{i in N, j in N}: sum{w in W, l in L, t in T} useResource[i,j,w,l,t] = traffic[i,j]*distance[i,j];
subject to Link{w in W, l in L, t in T}: sum{i in N, j in N} useResource[i,j,w,l,t] <= 1;
subject to TuringTime{i in N, j in N, c in 1 .. TT, t in 0 .. timeslots-1-c}: (useResource[i,j,recW[j],i,t] + (sum{k in (N diff {j}), w in (W diff {recW[j]})} useResource[i,k,w,i,t+c])) <= 1;
subject to PropagationDelay{i in N, j in N, l in (path[i,j] diff {last(path[i,j])}), t in 0 .. timeslots-1-pd}: useResource[i,j,recW[j],l,t]=useResource[i, j, recW[j],(l+1) mod nodes, t+pd];
subject to Source{i in N, j in N}: sum{t in 0 .. timeslots-1-card(path[i,j])} useResource[i,j,recW[j],i,t] = traffic[i,j];

#這是nonlinear constraint
#subject to Timeslot{t in T}: (if (sum{i in N, j in N, w in W, l in L} useResource[i,j,w,l,t])>=1 then 0 else 1) = useTimeslot[t] ;
#subject to Timeslot{i in N, j in N, w in W, l in L, t in T}: useResource[i,j,w,l,t] <= hy[t] ;
 

[回到上一頁]