3D Visualization of Items Arrangement
5 次查看(过去 30 天)
显示 更早的评论
How do I get the 3D visualization of items in the bin from this algorithm?
%
% Copyright (c) 2015, Yarpiz (www.yarpiz.com)
% All rights reserved. Please read the "license.txt" for license terms.
%
% Project Code: YPAP105
% Project Title: Solving Bin Packing Problem using PSO, FA and IWO
% Publisher: Yarpiz (www.yarpiz.com)
%
% Developer: S. Mostapha Kalami Heris (Member of Yarpiz Team)
%
% Contact Info: sm.kalami@gmail.com, info@yarpiz.com
%
clc;
clear;
close all;
%% Problem Definition
model = CreateModel(); % Create Bin Packing Model
CostFunction = @(x) BinPackingCost(x, model); % Objective Function
nVar = 2*model.n-1; % Number of Decision Variables
VarSize = [1 nVar]; % Decision Variables Matrix Size
VarMin = 0; % Lower Bound of Decision Variables
VarMax = 1; % Upper Bound of Decision Variables
%% PSO Parameters
MaxIt=50; % Maximum Number of Iterations
nPop=20; % Population Size (Swarm Size)
% PSO Parameters
w=1; % Inertia Weight
wdamp=0.99; % Inertia Weight Damping Ratio
c1=1.5; % Personal Learning Coefficient
c2=2.0; % Global Learning Coefficient
% If you would like to use Constriction Coefficients for PSO,
% uncomment the following block and comment the above set of parameters.
% % Constriction Coefficients
% phi1=2.05;
% phi2=2.05;
% phi=phi1+phi2;
% chi=2/(phi-2+sqrt(phi^2-4*phi));
% w=chi; % Inertia Weight
% wdamp=1; % Inertia Weight Damping Ratio
% c1=chi*phi1; % Personal Learning Coefficient
% c2=chi*phi2; % Global Learning Coefficient
% Velocity Limits
VelMax=0.1*(VarMax-VarMin);
VelMin=-VelMax;
nParticleMutation = 2; % Number of Mutations Performed on Each Particle
nGlobalBestMutation = 5; % Number of Mutations Performed on Global Best
%% Initialization
empty_particle.Position=[];
empty_particle.Cost=[];
empty_particle.Sol=[];
empty_particle.Velocity=[];
empty_particle.Best.Position=[];
empty_particle.Best.Cost=[];
empty_particle.Best.Sol=[];
particle=repmat(empty_particle,nPop,1);
GlobalBest.Cost=inf;
for i=1:nPop
% Initialize Position
particle(i).Position=unifrnd(VarMin,VarMax,VarSize);
% Initialize Velocity
particle(i).Velocity=zeros(VarSize);
% Evaluation
[particle(i).Cost, particle(i).Sol]=CostFunction(particle(i).Position);
% Update Personal Best
particle(i).Best.Position=particle(i).Position;
particle(i).Best.Cost=particle(i).Cost;
particle(i).Best.Sol=particle(i).Sol;
% Update Global Best
if particle(i).Best.Cost<GlobalBest.Cost
GlobalBest=particle(i).Best;
end
end
BestCost=zeros(MaxIt,1);
%% PSO Main Loop
for it=1:MaxIt
for i=1:nPop
% Update Velocity
particle(i).Velocity = w*particle(i).Velocity ...
+c1*rand(VarSize).*(particle(i).Best.Position-particle(i).Position) ...
+c2*rand(VarSize).*(GlobalBest.Position-particle(i).Position);
% Apply Velocity Limits
particle(i).Velocity = max(particle(i).Velocity,VelMin);
particle(i).Velocity = min(particle(i).Velocity,VelMax);
% Update Position
particle(i).Position = particle(i).Position + particle(i).Velocity;
% Velocity Mirror Effect
IsOutside=(particle(i).Position<VarMin | particle(i).Position>VarMax);
particle(i).Velocity(IsOutside)=-particle(i).Velocity(IsOutside);
% Apply Position Limits
particle(i).Position = max(particle(i).Position,VarMin);
particle(i).Position = min(particle(i).Position,VarMax);
% Evaluation
[particle(i).Cost, particle(i).Sol] = CostFunction(particle(i).Position);
% Perform Mutation
for j=1:nParticleMutation
NewParticle = particle(i);
NewParticle.Position = Mutate(particle(i).Position);
[NewParticle.Cost, NewParticle.Sol] = CostFunction(NewParticle.Position);
if NewParticle.Cost <= particle(i).Cost
particle(i) = NewParticle;
end
end
% Update Personal Best
if particle(i).Cost<particle(i).Best.Cost
particle(i).Best.Position=particle(i).Position;
particle(i).Best.Cost=particle(i).Cost;
particle(i).Best.Sol=particle(i).Sol;
% Update Global Best
if particle(i).Best.Cost<GlobalBest.Cost
GlobalBest=particle(i).Best;
end
end
end
% Perform Mutation on Global Best
for i=1:nGlobalBestMutation
NewParticle = GlobalBest;
NewParticle.Position = Mutate(GlobalBest.Position);
[NewParticle.Cost, NewParticle.Sol] = CostFunction(NewParticle.Position);
if NewParticle.Cost <= GlobalBest.Cost
GlobalBest = NewParticle;
end
end
BestCost(it)=GlobalBest.Cost;
disp(['Iteration ' num2str(it) ': Best Cost = ' num2str(BestCost(it))]);
w=w*wdamp;
end
BestSol = GlobalBest;
%% Results
figure;
plot(BestCost,'LineWidth',2);
xlabel('Iteration');
ylabel('Best Cost');
grid on;
i got this algorithm from https://www.mathworks.com/matlabcentral/fileexchange/53111-bin-packing-problem-using-ga-pso-fa-and-iwo
0 个评论
回答(1 个)
Yatharth
2024-5-2
Hi Thulasy,
You can use the "patch" function to draw each item as a 3D box. You'll need to calculate the vertices of each box based on it's position and dimensions.
Initial step to extract item positions and dimensions : You need to have coordinates of bottom-left-corner and dimensions (length , width, height) of each item. This information you'll need to extract from the solution structure.
Here is a basic framework on how to implement the visualization.
Note: that you'll need to adapt this code to fit the structure of your solution.
Code for defining vertices and using patch function
items = [2, 2, 1, 0, 0, 0;
2, 1, 2, 0, 0, 0;
1, 2, 2, 0, 0, 0;
1, 1, 1, 0, 0, 0;
3, 2, 1, 0, 0, 0;
2, 2, 2, 0, 0, 0;
1, 3, 2, 0, 0, 0;
2, 1, 1, 0, 0, 0;
1, 2, 1, 0, 0, 0;
1, 1, 2, 0, 0, 0];
figure;
hold on;
for i = 1:size(items, 1)
% Extract position and dimensions here I am using items matrix but you
% will have to extract it from your solution structure.
l = items(i, 1);
w = items(i, 2);
h = items(i, 3);
x = items(i, 4);
y = items(i, 5);
z = items(i, 6);
% Define vertices of the 3D box
vertices = [x, y, z;
x+l, y, z;
x+l, y+w, z;
x, y+w, z;
x, y, z+h;
x+l, y, z+h;
x+l, y+w, z+h;
x, y+w, z+h];
% Define faces of the box
faces = [1, 2, 3, 4; % Bottom
5, 6, 7, 8; % Top
1, 2, 6, 5; % Side 1
2, 3, 7, 6; % Side 2
3, 4, 8, 7; % Side 3
4, 1, 5, 8];% Side 4
% Plot the box
patch('Vertices', vertices, 'Faces', faces, 'FaceColor', rand(1,3), 'EdgeColor', 'k', 'FaceAlpha', 0.5);
end
xlabel('X');
ylabel('Y');
zlabel('Z');
title('3D Visualization of Bin Packing');
axis equal;
grid on;
view(3); % Set the view to 3D
hold off;
Here is the documentation for the patch function : https://www.mathworks.com/help/matlab/ref/patch.html#:~:text=example-,patch(%27Faces%27%2CF%2C%27Vertices%27%2CV),-creates%20one%20or
3 个评论
Yatharth
2024-5-7
You can plot the bounding box using this custom function
function plotBoxes(boxPosition, boxSize)
% figure;
hold on;
axis equal;
xlabel('X');
ylabel('Y');
zlabel('Z');
view(3); % Set the view to 3D
numBoxes = size(boxPosition, 2);
for i = 1:numBoxes
pos = boxPosition(:, i);
sz = boxSize(:, i);
% Calculate the vertices of the box
vertices = [pos(1), pos(2), pos(3);
pos(1) + sz(1), pos(2), pos(3);
pos(1) + sz(1), pos(2) + sz(2), pos(3);
pos(1), pos(2) + sz(2), pos(3);
pos(1), pos(2), pos(3) + sz(3);
pos(1) + sz(1), pos(2), pos(3) + sz(3);
pos(1) + sz(1), pos(2) + sz(2), pos(3) + sz(3);
pos(1), pos(2) + sz(2), pos(3) + sz(3)];
% Define the faces of the box
faces = [1, 2, 3, 4; % bottom
5, 6, 7, 8; % top
1, 2, 6, 5; % front
2, 3, 7, 6; % right
3, 4, 8, 7; % back
4, 1, 5, 8]; % left
% Plot the box
patch('Vertices', vertices, 'Faces', faces, 'FaceColor', 'none', 'EdgeColor', 'r');
end
hold off;
end
Here is how you can use this function at the end of your code.
clear;
items = [2, 2, 1, 0, 0, 0;
2, 1, 2, 0, 0, 0;
1, 2, 2, 0, 0, 0;
1, 1, 1, 0, 0, 0;
3, 2, 1, 0, 0, 0;
2, 2, 2, 0, 0, 0;
1, 3, 2, 0, 0, 0;
2, 1, 1, 0, 0, 0;
1, 2, 1, 0, 0, 0;
1, 1, 2, 0, 0, 0];
figure;
hold on;
for i = 1:size(items, 1)
% Extract position and dimensions here I am using items matrix but you
% will have to extract it from your solution structure.
l = items(i, 1);
w = items(i, 2);
h = items(i, 3);
x = items(i, 4);
y = items(i, 5);
z = items(i, 6);
% Define vertices of the 3D box
vertices = [x, y, z;
x+l, y, z;
x+l, y+w, z;
x, y+w, z;
x, y, z+h;
x+l, y, z+h;
x+l, y+w, z+h;
x, y+w, z+h];
% Define faces of the box
faces = [1, 2, 3, 4; % Bottom
5, 6, 7, 8; % Top
1, 2, 6, 5; % Side 1
2, 3, 7, 6; % Side 2
3, 4, 8, 7; % Side 3
4, 1, 5, 8];% Side 4
% Plot the box
patch('Vertices', vertices, 'Faces', faces, 'FaceColor', rand(1,3), 'EdgeColor', 'k', 'FaceAlpha', 0.5);
end
xlabel('X');
ylabel('Y');
zlabel('Z');
title('3D Visualization of Bin Packing');
axis equal;
grid on;
view(3); % Set the view to 3D
boxPosition = [0, 0, 0; 2, 0, 0; 0, 2, 0]; % 3 boxes positioned at the origin
boxSize = [1, 1, 3; 1, 1, 3; 1, 1, 3]; % All boxes are 1x1x1 cubes
% Plot the boxes
plotBoxes(boxPosition, boxSize); %calling the custom function here
hold off;
另请参阅
类别
在 Help Center 和 File Exchange 中查找有关 Particle Swarm 的更多信息
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!