在关于时间的约束条件中,设置了关于时间的决策变量Tik大于等于0,但在求解完成后,发现该变量的取值仍然会出现负数的情况,还有的取值为极大值,但最终的车辆服务时间的连续性不受影响,求助该怎么解决这个问题?关于时间变量的取值有图片示例:
程序的代码也附上,未经允许代码禁止传播:`clear
clc
tic
%% 小规模数据
qip=[randi([10,20],3,12)]'; %第一种产品需求量
qip(1,:)=0;
qip(end,:)=0;
s=[randi([10,20],1,12)]; %服务时间
s(1)=0;
s(end)=0;
x=[randi([0,100],1,11)]; %横坐标
y=[randi([0,100],1,11)]; %纵坐标
x=[x,x(1)]; %体现出数学模型中的第n+1个节点,也就是配送中心
y=[y,y(1)]; %体现出数学模型中的第n+1个节点,也就是配送中心
%% 配送车辆和顾客数据
axis=[x' y']; %顾客坐标
h=pdist(axis); %计算几何距离
Dij=squareform(h); %距离矩阵
%% 配送车辆和顾客数据
vNum=3; %车辆数量
pNum=3; %产品种类数量
nodeNum=numel(s); %配送网络中总节点数量
C=350; %车辆最大装载量
%% 成本设置及其他参数
c1=50; %车辆固定成本
c2=10; %单位运输成本
c3=2; %产品的单位平均成本
c4=3e-2; %单位碳排放成本
alpha1=2; %运输过程中的单位时间制冷成本,单位为元/小时
alpha2=2; %卸货过程中的单位时间制冷成本,单位为元/小时
beta1=2e-3; %运输过程中的平均货损系数
beta2=1e-3; %卸货过程中的平均货损系数
gamma1=5e-3; %计算油耗系数,其1
gamma2=3e-3; %计算油耗系数,其2
gamma3=1e-3; %计算油耗系数,其3
G=10; %重力系数
E=2; %碳排放因子
v=10; %车辆固定行驶速度
M=1e6; %足够大的常数
qu=5; %基本单元大小
%% 决策变量
Xijk=binvar(nodeNum,nodeNum,vNum,'full'); %0-1变量,i、j节点之间是否由第k辆车进行配送
Yipk=binvar(nodeNum,pNum,vNum,'full'); %0-1变量,i节点的第p种产品是否由第k辆车进行配送
Tik=sdpvar(nodeNum,vNum,'full'); %实数变量,表示车辆k到达i点的时间
Upk=intvar(pNum,vNum,'full'); %整数变量,表示车辆k分配给产品p的基本单元个数
Qijpk=sdpvar(nodeNum,nodeNum,pNum,vNum,'full'); %实数变量,车辆从节点i到节点j的第p类产品的装载量
tol=1e-6; %决策变量精确度
%% 目标函数,总成本最小
%各部分成本初始化
z1=0; %固定成本
z2=0; %运输成本
z3=0; %制冷成本
z4=0; %货损成本
z5=0; %碳排放成本
%固定成本计算
for k=1:vNum
z1=z1+c1*sum(Xijk(1,2:end-1,k));
end
%运输成本计算
for k=1:vNum
for i=1:nodeNum
for j=1:nodeNum
z2=z2+c2Dij(i,j)Xijk(i,j,k);
end
end
end
%制冷成本计算
for k=1:vNum
for i=1:nodeNum
for j=1:nodeNum
z3=z3+alpha1(Dij(i,j)/v)Xijk(i,j,k); %运输过程制冷成本
z3=z3+alpha2s(j)Xijk(i,j,k); %卸货过程制冷成本
end
end
end
%货损成本计算:运输时的货损成本
for k=1:vNum
for i=1:nodeNum
for j=1:nodeNum
for p=1:pNum
%线性化处理
z4=z4+Yipk(i,p,k)qip(i,p)beta1*Tik(i,k);
end
end
end
end
%货损成本计算:卸货时的货损成本
for k=1:vNum
for i=1:nodeNum
for j=1:nodeNum
for p=1:pNum
%线性化
z4=z4+Yipk(i,p,k)Qijpk(i,j,p,k)beta2*s(i);
end
end
end
end
%碳排放成本计算
for k=1:vNum
for i=1:nodeNum
for j=1:nodeNum
Fij=gamma1Dij(i,j)/v+gamma2(sum(Qijpk(i,j,:,k))+G)Dij(i,j)+gamma3Dij(i,j)v^2;
% 计算碳排放量 Eij
Eij=EFij;
% 累加碳排放成本
z5=z5+c4EijXijk(i,j,k);
end
end
end
%总目标函数
total_cost=z1+z2+z3+z4+z5;
f=total_cost;
%% 约束条件
F=[];
%变量的下限约束
F=[F;(0<=Qijpk)];
F=[F;(0<=Tik)];
F=[F;Upk>=0]; %添加非负约束
F=[F;Upk<=floor(C/qu)]; %Upk上限
%约束1,每辆车只能从配送中心出发,完成任务后回到配送中心。
for k=1:vNum
F=[F;Xijk(1,1,k)0;sum(Xijk(1,:,k))1];
F=[F;Xijk(nodeNum,nodeNum,k)0;sum(Xijk(:,nodeNum,k))1];
end
%约束2,流量平衡:车辆服务完客户点后,要从该客户点离开。
for j=2:nodeNum-1
for k=1:vNum
F=[F;sum(Xijk(j,:,k))==sum(Xijk(:,j,k))];
end
end
% 约束3,每个需求点的每种产品只能由一辆车满足。
for i=2:nodeNum-1
for p=1:pNum
F=[F;sum(Yipk(i,p,:))==1];
end
end
%约束10,决策变量X和Y的关系。
for i=2:nodeNum
for k=1:vNum
for p=1:pNum
F=[F;sum(Xijk(i,:,k))>=Yipk(i,p,k)];
end
end
end
%约束4,车舱容量约束,车辆k中所有种类的装载量之和不超过车辆最大容量。
for k=1:vNum
F=[F;sum(Upk(:,k)*qu)<=C];
end
%约束5,车辆k分配给产品p的空间不超过最大载重
for k=1:vNum
for p=1:pNum
F=[F;Upk(p,k)*qu<=C];
end
end
%约束6,当车辆k装载的p产品不超过分配给该产品的空间。
for k=1:vNum
for p=1:pNum
F=[F;sum(qip(:,p).Yipk(:,p,k))<=Upk(p,k)qu];
end
end
%约束7,装载量约束:车辆出发时的装载量=访问节点的需求之和。(松弛约束)
for i=2:nodeNum
for p=1:pNum
for k=1:vNum
F=[F;sum(Qijpk(i,:,p,k))<=sum(Yipk(i,p,k)*qip(i,p))];
end
end
end
%约束8,装载流量平衡:车辆在行驶过程中的载重和节点需求递推关系。
for i=2:nodeNum
for p=1:pNum
for k=1:vNum
F=[F;sum(Qijpk(:,i,p,k))==sum(Qijpk(i,:,p,k))+qip(i,p)];
end
end
end
%约束9,时间连续性约束。
for k=1:vNum
F=[F;Tik(1,k)==0];%车辆出发时间为0
for i=1:nodeNum
for j=1:nodeNum
F=[F;Tik(i,k)+s(i)+Dij(i,j)/v-(M*(1-Xijk(i,j,k)))<=Tik(j,k)];
end
end
end
%% 参数配置 'solver','cplex' 'verbose',0,'solver','cplex'
ops=sdpsettings('solver','cplex');
%% 求解问题
sol=solvesdp(F,f,ops);
f=double(f);
Xijk=round(double(Xijk));
Yipk=round(double(Yipk));
Tik=double(Tik);
Upk=double(Upk);
%% 画出配送路线图
plot(axis(2:nodeNum-1,1),axis(2:nodeNum-1,2),'ro');
hold on;
plot(axis(1,1),axis(1,2),'pm');hold on;
%在各个节点上标出对应的节点编号
for i=1:nodeNum
if i~=nodeNum
text(axis(i,1)-0.1,axis(i,2)+0.5,num2str(i-1));
else
text(axis(i,1)-0.1,axis(i,2)-0.5,num2str(i-1));
end
end
%根据Xijk的值,将对应节点连接
color=hsv(vNum);
for i=1:nodeNum
for j=1:nodeNum
for k=1:vNum
if abs(Xijk(i,j,k)-1)<1e-5
plot([axis(i,1),axis(j,1)],[axis(i,2),axis(j,2)],'-','color',color(k,:),'linewidth',1);
title(sprintf('nodeNum: %d', nodeNum));
end
end
end
end
%% 将最终的决策变量Xijk转换为具体的配送方案
VC=cell(vNum,1); %配送方案
used_vehicles=0; %记录使用的车辆数
total_cost=0; %记录车辆总成本
for k=1:vNum
[row,col]=find(abs(Xijk(:,:,k)-1)<tol);
n=numel(row);
route=zeros(1,n+1);
route(1)=0; %起点为配送中心
route(end)=0; %终点为配送中心
for i=1:n
if i1
next_index=find(row1);
else
next=col(next_index);
next_index=find(row==next);
route(i)=next-1;
end
end
%排除未使用的车辆(路径为0-0)
if numel(route)>2used_vehicles=used_vehicles+1;total_cost=total_cost+c1; %车辆固定成本for i=1:numel(route)-1total_cost=total_cost+Dij(route(i)+1,route(i+1)+1)*c2; %车辆行驶成本end% 显示路径及配送的产品种类disp(['车辆',num2str(k),'的路径如下:']);path_str='0';for i=2:numel(route)-1node=route(i);products=[];for p=1:pNumif Yipk(node+1,p,k)==1products=[products,p];endendpath_str=[path_str,'-',num2str(node),'(',num2str(products),')'];endpath_str=[path_str,'-0'];disp(path_str);end
end
%输出目标函数值
disp(['使用的车辆数为:',num2str(used_vehicles)]);
%输出每辆车的车舱空间分配情况
Upk_value=Upk*qu;
Upk_value=double(Upk_value);
% 输出每辆车的车舱空间分配情况
for k=1:vNum
%检查车辆k是否被使用
[row,col]=find(abs(Xijk(:,:,k)-1)<tol);
if isempty(row)||(numel(row)1&&row(1)1&&col(1)==nodeNum)
%如果车辆k未被使用(路径为0-0),跳过该车辆
continue;
end
%获取车辆k的分配情况
allocation=round(Upk(:,k)*qu); %车辆k分配给每种产品的空间,计算为 Upk * qu%计算车辆k的实际装载量
actual_load=0;
for i=2:nodeNum-1for p=1:pNumif Yipk(i,p,k)==1actual_load=actual_load+qip(i,p);endend
end% 计算装载率
load_rate=actual_load/C;% 输出车辆k的分配情况
fprintf('车辆%d的分配情况为:',k);
for p=1:pNumfprintf('%d ',allocation(p));
end
fprintf('\n');% 输出车辆k的实际装载量和装载率
fprintf('车辆%d的实际装载量: %.2f\n',k,actual_load);
fprintf('车辆%d的装载率: %.2f%%\n',k,load_rate * 100);
end
% 计算每种成本的值
z1 = double(z1);
z2 = double(z2);
z3 = double(z3);
z4 = double(z4);
z5 = double(z5);
% 输出结果
fprintf('总成本: %.2f\n', double(f));
fprintf('固定成本: %.2f\n', z1);
fprintf('运输成本: %.2f\n', z2);
fprintf('制冷成本: %.2f\n', z3);
fprintf('货损成本: %.2f\n', z4);
fprintf('碳排放成本: %.2f\n', z5);
toc`