C 具有多时间窗的惩罚约束车辆路径问题
简介: LKH-3是Lin Kernighan旅行商启发式算法的一个实现。 目标是构建能够解决以下问题类型的LKH-3版本: CVRPMTW:具有多时间窗的容量受限车辆路径问题 检查:说明“如何增加等待时间”的注释 我需要做的是: 输出等待时间(最早)以及我们在哪个节点面临等待时间C 具有多时间窗的惩罚约束车辆路径问题,c,time,routes,vehicle-routing,busy-waiting,C,Time,Routes,Vehicle Routing,Busy Waiting,简介: LKH-3是Lin Kernighan旅行商启发式算法的一个实现。 目标是构建能够解决以下问题类型的LKH-3版本: CVRPMTW:具有多时间窗的容量受限车辆路径问题 检查:说明“如何增加等待时间”的注释 我需要做的是: 输出等待时间(最早)以及我们在哪个节点面临等待时间 清晰理解的示例: |--------|____________________|--------| 等待|时间窗口节点N |惩罚 GainType Penalty_CVRPMTW() { static No
清晰理解的示例: |--------|____________________|--------| 等待|时间窗口节点N |惩罚
GainType Penalty_CVRPMTW()
{
static Node *StartRoute = 0;
Node *N, *NextN, *CurrentRoute;
GainType CostSum, DemandSum, P = 0;
int Forward = SUCC(Depot)->Id != Depot->Id + DimensionSaved;
int j;
int RouteCounter = 0;
if (!StartRoute)
StartRoute = Depot;
if (StartRoute->Id > DimensionSaved)
StartRoute -= DimensionSaved;
N = StartRoute;
do {
CurrentRoute = N;
CostSum = DemandSum = 0;
do {
if (N->Id <= Dim && N != Depot) {
if ((DemandSum += N->Demand) > Capacity)
P += DemandSum - Capacity;
if (MultipleTimeWindowPenaltyMode == PENALTY_ON_EARLIEST || MultipleTimeWindowPenaltyMode == NO) {
// Loop over the earliest values of the node's time windows and find the appropriate time window
if (CostSum > N->Latest)
P += CostSum - N->Latest;
else {
for (j = 0; j < N->NumberTimeWindows; j++){
if (CostSum < N->EarliestList[j]){
if (MultipleTimeWindowPenaltyMode == NO) {
*CostSum = N->EarliestList[j]*; //how can i add the waiting time in this line?
}
else if (MultipleTimeWindowPenaltyMode == PENALTY_ON_EARLIEST) {
// CostSum = N->EarliestList[j]; /* Enable this to also add the waiting time to the cost */
P += N->EarliestList[j] - CostSum;
}
break;
} else if (CostSum >= N->EarliestList[j] && CostSum <= N->LatestList[j]){
break;
}
}
}
}
GainType惩罚_CVRPMTW()
{
静态节点*StartRoute=0;
节点*N,*NextN,*CurrentRoute;
收益型成本总额,需求总额,P=0;
int Forward=SUCC(车辆段)->Id!=车辆段->Id+已保存尺寸;
int j;
int RouteCounter=0;
如果(!StartRoute)
StartRoute=仓库;
如果(StartRoute->Id>DimensionSaved)
StartRoute-=已保存的尺寸;
N=星型;
做{
CurrentRoute=N;
成本总和=需求总和=0;
做{
如果(N->Id需求)>容量)
P+=需求量um-容量;
if(MultipleTimeWindowPenaltyMode==惩罚| | | MultipleTimeWindowPenaltyMode==否){
//循环遍历节点时间窗口的最早值,并找到适当的时间窗口
如果(成本总额>N->最新)
P+=成本总和-N->最新;
否则{
对于(j=0;jNumberTimeWindows;j++){
如果(成本总和EarliestList[j]){
如果(MultipleTimeWindowPenaltyMode==否){
*CostSum=N->EarliestList[j]*;//如何在该行中添加等待时间?
}
else if(MultipleTimeWindowPenaltyMode==最早的惩罚){
//CostSum=N->EarliestList[j];/*启用此选项还可以将等待时间添加到成本中*/
P+=N->EarliestList[j]-成本总和;
}
打破
}else if(CostSum>=N->EarliestList[j]&CostSum LatestList[j]){
打破
}
}
}
}
祝你好运!或者你有什么问题吗?我正在打印等待(提前)时间和节点,我被卡住了,不知道如何实现it@Avy请更具体一点,仔细阅读