mp6: Screwy implementation of ex2

This commit is contained in:
Claudio Maggioni 2020-12-18 15:43:56 +01:00
parent 34dc22c5b0
commit cbc8fbfd84
11 changed files with 782 additions and 0 deletions

15
mp6/Makefile Normal file
View file

@ -0,0 +1,15 @@
filename=template
pdf:
pdflatex ${filename}
#bibtex ${filename}
pdflatex ${filename}
pdflatex ${filename}
make clean
read:
evince ${filename}.pdf &
clean:
rm -f *.out *.log *.bbl *.blg *.aux ${filename}.log ${filename}.ps ${filename}.aux ${filename}.out ${filename}.dvi ${filename}.bbl ${filename}.blg

View file

@ -0,0 +1,106 @@
function [B,D,c_B,c_D,x_B,x_D,index_B,index_D] = auxiliary (A_aug,c_aug,h,m,n)
% The auxiliary problem is always a minimization problem
% The output will be: B and D (basic and nonbasic matrices), c_B and c_D
% (subdivision of the coefficient vector in basic and nonbasic parts), x_B
% and x_D (basic and nonbasic variables) and index_B and index_D (to keep
% track of the variables indices)
% Redefine the problem by introducing the artificial variables required by
% the auxiliary problem (the objective function has to reach value 0)
A_aug = [A_aug, eye(m)];
c_aug = [c_aug, zeros(1,m)]; % original objective function coefficients
c_aux = [zeros(1,n+m), ones(1,m)]; % auxiliary c of minimization problem
index = 1:n+2*m; % index to keep track of the different variables
% Defining the basic elements and the nonbasic elements
B = A_aug(:,(n+m+1):(n+2*m)); % basic variables
D = A_aug(:,1:(n+m)); % nonbasic variables
c_Baux = c_aux(1,(n+m+1):(n+2*m));
c_Daux = c_aux(1,1:(n+m));
c_B = c_aug(1,(n+m+1):(n+2*m));
c_D = c_aug(1,1:(n+m));
x_B = h;
x_D = zeros((n+m),1);
index_B = index(1,(n+m+1):(n+2*m));
index_D = index(1,1:(n+m));
nIter = 0;
z = c_Baux*x_B;
itMax = factorial(2*m+n)/(factorial(n+m)*factorial(m));
% Compute B^{-1}*D and B^{-1}*h
BiD = B\D;
Bih = B\h;
% Compute reduced cost coefficients
r_D = c_Daux - c_Baux*BiD;
while(z~=0)
% Find nonnegative index
idxIN = find(r_D == min(r_D));
% Using Bland's rule to avoid cycling
if(size(idxIN,2)>1)
idxIN = min(idxIN);
end
in = D(:,idxIN);
c_inaux = c_Daux(1,idxIN);
c_in = c_D(1,idxIN);
index_in = index_D(1,idxIN);
% Evaluating the coefficients ratio
inRatio = BiD(:,idxIN);
ratio = Bih./inRatio;
% Find the smallest ratio
for i = 1:size(ratio,1) % Eliminating negative ratios
if(ratio(i,1)<0)
ratio(i,1) = Inf;
end
end
idxOUT = find(ratio==min(ratio));
% Using Bland's rule to avoid cycling
if(size(idxOUT,1)>1)
idxOUT = min(idxOUT);
end
out = B(:,idxOUT);
c_outaux = c_Baux(1,idxOUT);
c_out = c_B(1,idxOUT);
index_out = index_B(1,idxOUT);
% Update the matrices by exchanging the columns
B(:,idxOUT) = in;
D(:,idxIN) = out;
c_Baux(1,idxOUT) = c_inaux;
c_Daux(1,idxIN) = c_outaux;
c_B(1,idxOUT) = c_in;
c_D(1,idxIN) = c_out;
index_B(1,idxOUT) = index_in;
index_D(1,idxIN) = index_out;
% Compute B^{-1}*D and B^{-1}*h
BiD = B\D;
Bih = B\h;
% Compute reduced cost coefficients
r_D = c_Daux - (c_Baux * BiD);
% Detect inefficient loop if nIter > total number of basic solutions
nIter = nIter + 1;
if nIter > itMax
error('The original LP problem does not admit a feasible solution.');
end
x_B = Bih - BiD * x_D;
z = c_Baux * x_B;
end
check = index_D<(n+m+1);
D = D(:,check);
index_D = index_D(1,check);
c_D = c_D(1,check);
x_D = x_D(check,1);
end

View file

@ -0,0 +1,18 @@
function [x_B,index_B] = printSol (z,x_B,index_B,m,n)
% this function prints the solution while distinguishing between original variables and slack variables
[sorted, index] = sort(index_B);
x_B = x_B(index);
index_B = sorted;
fprintf('Variables and optimal solution:\n\n');
for i = 1:m
if(index_B(i)<n+1)
fprintf('x%d = %f\n', sorted(i), x_B(i));
else
fprintf('s%d = %f\n', sorted(i)-n, x_B(i));
end
end
fprintf('\nOptimal value of z = %d\n\n', z);
end

View file

@ -0,0 +1,33 @@
function [z,x_B,index_B] = simplex (type,A,h,c,sign)
% Simplex method solver for a linear programming problem
% Input arguments:
% type = 'max' for maximization, 'min' for minimization
% A = matrix holding the constraints coefficients
% h = coefficients of the constraints inequalities (rhs vector)
% c = coefficients of the objective function
% sign = vector holding information about the constraints if the system
% needs to be standardized (-1: less or equal, 0: equal, 1:vgreater or equal)
m = size(A,1);
n = size(A,2);
% Compute the maximum number of basic solutions of the original
% problem (i.e., the maximum number of iterations necessary to solve the problem)
itMax = factorial(2*m+n)/(factorial(n+m)*factorial(m));
% Writing the problem in standard form
[A_aug,h,c_aug] = standardize(type,A,h,c,m,sign);
% Determining a starting feasible initial basic solution
[B,D,c_B,c_D,x_B,x_D,index_B,index_D] = auxiliary(A_aug,c_aug,h,m,n);
% Solving the linear programming problem with the Simplex method
[x_B,c_B,index_B] = simplexSolve(type,B,D,c_B,c_D,h,x_B,x_D,index_B,index_D,itMax);
% Compute the value of the objective function
z = sum(c_B' .* x_B) + sum(c_D' .* x_D);
% Output of the solution
[x_B,index_B] = printSol(z,x_B,index_B,m,n);
end

View file

@ -0,0 +1,82 @@
function [x_B,c_B,index_B] = simplexSolve(type, B, D, c_B, c_D, h, x_B, ...
x_D, index_B, index_D, itMax)
% Solving a maximization problem with the simplex method
% Initialize the number of iterations
nIter = 0;
% Compute B^{-1}*D and B^{-1}*h
BiD = B\D;
Bih = B\h;
% Compute the reduced cost coefficients
r_D = c_D - (c_B * BiD);
% the optimality condition is satisfied if all
% reduced cost coefficients are positive or negative (depending on the
% problem)
tol = max(size(r_D));
% Check the optimality condition, in order to skip the loop if the
% solution is already optimal
optCheck = typeCond(type, sum(r_D <= 0), sum(r_D >= 0));
while optCheck ~= tol
% Find the index of the entering variable
idxIN = find(r_D == typeCond(type, max(r_D), min(r_D)), 1, 'first');
in = D(:,idxIN);
c_in = c_D(1,idxIN);
index_in = index_D(1,idxIN);
% Evaluate the coefficients ratio for the column corresponding to
% the entering variable
ratio = Bih / BiD;
% Find the smallest positive ratio
idxOUT = find(ratio == min(ratio(ratio > 0)), 1, 'first');
out = B(:,idxOUT);
c_out = c_B(1,idxOUT);
index_out = index_B(1,idxOUT);
% TODO: Update the matrices by exchanging the columns
B(:,idxOUT) = in;
D(:,idxIN) = out;
c_B(1,idxOUT) = c_in;
c_D(1,idxIN) = c_out;
index_B(1,idxOUT) = index_in;
index_D(1,idxIN) = index_out;
% Compute B^{-1}*D and B^{-1}*h
BiD = B\D;
Bih = B\h;
% Compute the reduced cost coefficients
r_D = c_D - (c_B * BiD);
% Check the optimality condition, in order to exit the loop if the
% solution is already optimal
optCheck = typeCond(type, sum(r_D <= 0), sum(r_D >= 0));
% Detect inefficient looping if nIter > total number of basic solutions
nIter = nIter + 1;
if nIter > itMax
error('Incorrect loop, more iterations than the number of basic solutions');
end
% Compute the new x_B
x_B = Bih - BiD * x_D;
end
end
function x = typeCond(type, ifMaximum, ifMinimum)
if strcmp(type, 'max')
x = ifMaximum;
elseif strcmp(type, 'min')
x = ifMinimum;
else
error('Incorrect type specified. Choose either a maximisation (max) or minimisation (min) problem.')
end
end

View file

@ -0,0 +1,56 @@
function [A_aug,h,c_aug] = standardize(type,A,h,c,m,sign)
% Input arguments:
% type = 'max' for maximization, 'min' for minimization
% A = matrix holding the constraints coefficients
% h = coefficients of the constraints inequalities (rhs vector)
% c = coefficients of the objective function
% m = size(A, 1)
% sign = vector holding information about the constraints if the system
% needs to be standardized (-1: less or equal, 0: equal, 1:vgreater or equal)
% return arguments are:
% (1) A_aug = augmented matrix A, containing also the surplus and slack variables
% (2) c_aug = augmented coefficients vector c (check compatibility of dimensions with A)
% (3) h, right hand side vector (remember to flip the signs when changing the inequalities)
aug_matrix = eye(m); % matrix corresponding to the slack/surplus variables
if strcmp(type, 'max')
for i = 1:m
if sign(i) == 1
% Using a surplus instead of a slack variable
aug_matrix(i,:) = -aug_matrix(i,:);
end
end
elseif strcmp(type, 'min')
for i = 1:m
if sign(i) == -1
% Using a slack instead of a surplus variable
aug_matrix(i,:) = -aug_matrix(i,:);
end
end
else
error('Incorrect type specified. Choose either a maximisation (max) or minimisation (min) problem.')
end
% Correction on the sign of h for auxiliary problem (we want to
% ensure that h>=0, but we need to flip all the signs)
for i = 1:m
if h(i) < 0
A(i,:) = -A(i,:);
h(i,:) = -h(i,:);
aug_matrix(i,:) = -aug_matrix(i,:);
end
end
c_aug = [c, zeros(1,m)];
if strcmp(type,'max')
% Extend matrix A by adding the slack variables
A_aug = [A (+1 * full(aug_matrix == +1))];
elseif strcmp(type,'min')
% Extend matrix A by adding the surplus variables
A_aug = [A (-1 * full(aug_matrix == -1))];
else
error('Incorrect type specified. Choose either a maximisation (max) or minimisation (min) problem.')
end
end

View file

@ -0,0 +1,115 @@
% This script has the purpose of testing your implementation of the Simplex Method. In case there should be any issue with your solution, you will
% get an error and the code will stop. If your proposed solution passes all the tests, you can happily move to the next part of the assignment.
close all;
clear;
clc;
runTests = [0 0 1 0 0 0];
%% Test 1 (example page 86)
if runTests(1)
type = 'max';
A = [2 1; 1 3; 1 1];
h = [360;480;220];
c = [14,18];
sign = [0,0,0];
[z,x_B,index_B] = simplex (type,A,h,c,sign);
if(z==3600 && sum(uint32(x_B)-uint32([90;130;50]))==0 && sum(index_B==[1,2,3])==3)
fprintf('Test 1 has given the expected results. Proceding with the next one.\n\n');
else
error('Test 1 has given a wrong result. Interrupting the testing phase.');
end
pause
end
%% Test 2 (example page 114)
if runTests(2)
type = 'min';
A = [2,1,3; 3,4,2];
h = [210;360];
c = [9,11,8];
sign = [0,0];
[z,x_B,index_B] = simplex (type,A,h,c,sign);
if(z==1062 && sum(uint32(x_B)-uint32([96;18]))==0 && sum(index_B==[1,2])==2)
fprintf('Test 2 has given the expected results. Proceding with the next one.\n\n');
else
error('Test 2 has given a wrong result. Interrupting the testing phase.');
end
pause
end
%% Test 3 (example page 126)
if runTests(3)
type = 'max';
A = [1,2,1; 2,1,0; 1,-2,-1];
h = [5;8;1];
c = [3,-2,5];
sign = [0,1,1];
[z,x_B,index_B] = simplex (type,A,h,c,sign);
if(z==17 && sum(uint32(x_B)-uint32([4;1;2]))==0 && sum(index_B==[1,3,6])==3)
fprintf('Test 3 has given the expected results. Proceding with the next one.\n\n');
else
error('Test 3 has given a wrong result. Interrupting the testing phase.');
end
pause
end
%% Test 4 (TED)
if runTests(4)
type = 'min';
A = [-10,-5,-8; -10,-2,-10; -5,-5,-4; 10,5,8; 10,2,10; 5,5,4];
h = [-110,-60,-90,78,43,70]';
c = [20000,30000,25000];
sign = [0,0,0,0,0,0];
[z,x_B,index_B] = simplex (type,A,h,c,sign);
if(z==380000 && sum(uint32(x_B)-uint32([4;10;20;20;12;17]))==0 && sum(index_B==[1,2,4,6,7,8])==6)
fprintf('Test 4 has given the expected results. Proceding with the next one.\n\n');
else
error('Test 4 has given a wrong result. Interrupting the testing phase.');
end
pause
end
%% Test 5 (LP Exercise 2)
if runTests(5)
type = 'max';
A = [1,1,2; 5,3,1; 2,1,0];
h = [1200;2000;600];
c = [5,20,28];
sign = [0,0,0];
[z,x_B,index_B] = simplex (type,A,h,c,sign);
if(z==20160 && sum(uint32(x_B)-uint32([560;320;40]))==0 && sum(index_B==[2,3,6])==3)
fprintf('Test 5 has given the expected results. Proceding with the next one.\n\n');
else
error('Test 5 has given a wrong result. Interrupting the testing phase.');
end
pause
end
%% Test 6 (Vinitaly page 171)
if runTests(6)
type = 'max';
A = [1,1,1,0,0,0,0,0,0; 0,0,0,1,1,1,0,0,0; 0,0,0,0,0,0,1,1,1; 0,1,0,0,1,0,0,1,0; 0,0,1,0,0,1,0,0,1];
h = [4800;4000;2300;2500;4200];
c = [2,3,4,4,7,12,4,9,13];
sign = [0,0,0,0,0];
[z,x_B,index_B] = simplex (type,A,h,c,sign);
if(z==79500 && sum(uint32(x_B)-uint32([4400;400;4000;2100;200]))==0 && sum(index_B==[1,2,6,8,9])==5)
fprintf('Test 6 has given the expected results. Congratulations!!!\n\n');
else
error('Test 6 has given a wrong result. Interrupting the testing phase.');
end
end

96
mp6/assignment.sty Normal file
View file

@ -0,0 +1,96 @@
\usepackage{ifthen}
\usepackage[utf8]{inputenc}
\usepackage{graphics}
\usepackage{graphicx}
\usepackage{hyperref}
\usepackage{amsmath}
\pagestyle{plain}
\voffset -5mm
\oddsidemargin 0mm
\evensidemargin -11mm
\marginparwidth 2cm
\marginparsep 0pt
\topmargin 0mm
\headheight 0pt
\headsep 0pt
\topskip 0pt
\textheight 255mm
\textwidth 165mm
\newcommand{\duedate} {}
\newcommand{\setduedate}[1]{%
\renewcommand\duedate {Due date:~ #1}}
\newcommand\isassignment {false}
\newcommand{\setassignment}{\renewcommand\isassignment {true}}
\newcommand{\ifassignment}[1]{\ifthenelse{\boolean{\isassignment}}{#1}{}}
\newcommand{\ifnotassignment}[1]{\ifthenelse{\boolean{\isassignment}}{}{#1}}
\newcommand{\assignmentpolicy}{
\begin{table}[h]
\begin{center}
\scalebox{0.8} {%
\begin{tabular}{|p{0.02cm}p{16cm}|}
\hline
&\\
\multicolumn{2}{|c|}{\Large\textbf{Numerical Computing 2020 --- Submission Instructions}}\\
\multicolumn{2}{|c|}{\large\textbf{(Please, notice that following instructions are mandatory: }}\\
\multicolumn{2}{|c|}{\large\textbf{submissions that don't comply with, won't be considered)}}\\
&\\
\textbullet & Assignments must be submitted to \href{https://www.icorsi.ch/course/view.php?id=10018}{iCorsi} (i.e. in electronic format).\\
\textbullet & Provide both executable package and sources (e.g. C/C++ files, Matlab).
If you are using libraries, please add them in the file. Sources must be organized in directories called:\\
\multicolumn{2}{|c|}{\textit{Project\_number\_lastname\_firstname}}\\
& and the file must be called:\\
\multicolumn{2}{|c|}{\textit{project\_number\_lastname\_firstname.zip}}\\
\multicolumn{2}{|c|}{\textit{project\_number\_lastname\_firstname.pdf}}\\
\textbullet & The TAs will grade your project by reviewing your project write-up, and looking at the implementation
you attempted, and benchmarking your code's performance.\\
\textbullet & You are allowed to discuss all questions with anyone you like; however: (i) your submission must list anyone you discussed problems with and (ii) you must write up your submission independently.\\
\hline
\end{tabular}
}
\end{center}
\end{table}
}
\newcommand{\punkte}[1]{\hspace{1ex}\emph{\mdseries\hfill(#1~\ifcase#1{Points}\or{Points}\else{Points}\fi)}}
\newcommand\serieheader[6]{
\thispagestyle{empty}%
\begin{flushleft}
\includegraphics[width=0.4\textwidth]{usi_inf}
\end{flushleft}
\noindent%
{\large\ignorespaces{\textbf{#1}}\hspace{\fill}\ignorespaces{ \textbf{#2}}}\\ \\%
{\large\ignorespaces #3 \hspace{\fill}\ignorespaces #4}\\
\noindent%
\bigskip
\hrule\par\bigskip\noindent%
\bigskip {\ignorespaces {\Large{\textbf{#5}}}
\hspace{\fill}\ignorespaces \large \ifthenelse{\boolean{\isassignment}}{\duedate}{#6}}
\hrule\par\bigskip\noindent% \linebreak
}
\makeatletter
\def\enumerateMod{\ifnum \@enumdepth >3 \@toodeep\else
\advance\@enumdepth \@ne
\edef\@enumctr{enum\romannumeral\the\@enumdepth}\list
{\csname label\@enumctr\endcsname}{\usecounter
{\@enumctr}%%%? the following differs from "enumerate"
\topsep0pt%
\partopsep0pt%
\itemsep0pt%
\def\makelabel##1{\hss\llap{##1}}}\fi}
\let\endenumerateMod =\endlist
\makeatother
\usepackage{textcomp}

Binary file not shown.

View file

@ -0,0 +1,261 @@
% vim: set ts=2 sw=2 et tw=80:
\documentclass[unicode,11pt,a4paper,oneside,numbers=endperiod,openany]{scrartcl}
\usepackage{pgfplots}
\pgfplotsset{compat=1.17}
\usepackage{mathrsfs}
\usetikzlibrary{arrows}
\input{assignment.sty}
\definecolor{zzttqq}{rgb}{0.6,0.2,0}
\definecolor{uuuuuu}{rgb}{0.26666666666666666,0.26666666666666666,0.26666666666666666}
\definecolor{ccqqqq}{rgb}{0.8,0,0}
\definecolor{qqqqff}{rgb}{0,0,1}
\begin{document}
\setassignment
\setduedate{Friday, December 18, 2020, 11:59 PM}
\serieheader{Numerical Computing}{2020}{Student: Claudio Maggioni}{Discussed
with: --}{Solution for Project 6}{}
\newline
\assignmentpolicy
The purpose of this mini-project is to implement the Simplex Method to find the
solution of linear programs, involving both the minimisation and the maximisation
of the objective function.
\section{Graphical Solution of Linear Programming Problems [25 points]}
Please consider the following two problems:
\begin{enumerate}
\item[(1)] \begin{equation*}
\begin{aligned}
& \text{min} & z=4x&+y\\
& \text{ s.t.} & x+2y &\leq 40 \\
& & x+y &\geq 30\\
& & 2x+3y &\geq 72 \\
& & x,\,y &\geq0 \\
\end{aligned}
\end{equation*}
\item[(2)] A tailor plans to sell two types of trousers, with production costs
of 25 CHF and 40 CHF, respectively. The former type can be sold for 85 CHF,
while the latter for 110 CHF. The tailor estimates a total monthly demand
of 265 trousers. Find the number of units of each type of trousers that
should be produced in order to maximise the net profit of the tailor, if we
assume that the he cannot spend more than 7000 CHF in raw materials.
\end{enumerate}
Start by writing problem (2) as a linear programming problem. Then complete the
following tasks:
\begin{itemize}
\item Solve the system of inequalities.
\item Plot the feasible region identified by the constraints.
\item Find the optimal solution and the value of the objective function in
that point.
\end{itemize}
\subsection{Solving problem 1}
We first solve the system of inequalities for y:
\[\begin{cases}
y \leq 20 - \frac{1}{2} x \\
y \geq 30 - x \\
y \geq 24 - \frac{2}{3} x \\
x, y \geq 0 \\
\end{cases}
\]
Here is the feasability region plot, which was derived geometrically by plotting
the inequalities above.
\begin{center}
\begin{tikzpicture}[line cap=round,line join=round,>=triangle 45,x=1cm,y=1cm]
\begin{axis}[
x=0.3cm,y=0.3cm,
xmin=-1, ymin=-1, xmax=40,ymax=32,
axis lines=middle,
ymajorgrids=true,xmajorgrids=true]
\draw [line width=2pt,color=qqqqff,domain=-11.510887860744262:56.37536226673365] plot(\x,{(--20-0.5*\x)/1});
\draw [line width=2pt,color=ccqqqq,domain=-11.510887860744262:56.37536226673365] plot(\x,{(--30-1*\x)/1});
\draw [line width=2pt,color=ccqqqq,domain=-11.510887860744262:56.37536226673365] plot(\x,{(--24-0.6666666666666666*\x)/1});
\draw [line width=2pt,domain=-11.510887860744262:56.37536226673365] plot(\x,{(-0-0*\x)/1});
\draw [line width=2pt] (0,-15.596475658682538) -- (0,33.531731670413244);
\draw [line width=2pt,color=zzttqq] (24,8)-- (36,0);
\draw [line width=2pt,color=zzttqq] (36,0)-- (40,0);
\draw [line width=2pt,color=zzttqq] (40,0)-- (24,8);
\fill[line width=2pt,color=zzttqq,fill=zzttqq,fill opacity=0.10000000149011612] (24,8) -- (36,0) -- (40,0) -- cycle;
\end{axis}
\end{tikzpicture}
\end{center}
Red lines represent feasibility constraints keeping the upper part of the graph,
while blue lines keep the low part. The resulting region is the area in brown.
We therefore identify the verticies $(24,8)$, $(36,0)$ and $(40,0)$ as candidate
solutions, and therefore we evaluate the minimization function in these points:
\[ m(x, y) = 4x + y \]
\[\begin{aligned}
m(24,8) = 104 \\
m(36,0) = 144 \\
m(40,0) = 160 \\
\end{aligned}\]
And therefore we have as a solution $(x, y) = (40, 0)$, with $z = 160$.
\subsection{Problem 2 as linear programming problem}
The following is the linear programming formulation of problem 2:
\begin{equation*}
\begin{aligned}
\text{max} &\; 85x + 110y \\
\text{s.t.} & \begin{cases}
25 x + 40 y \leq 7000 \\
x + y \leq 265 \\
x, y \geq 0 \\
\end{cases}
\end{aligned}
\end{equation*}
\subsection{Solving problem 2}
We first solve the system of inequalities for y:
\[
\begin{cases}
25 x + 40 y \leq 7000 \\
x + y \leq 265 \\
x, y \geq 0 \\
\end{cases}
=
\begin{cases}
y < 280 - x \\
x \leq 265 - x \\
x, y \geq 0
\end{cases}
\]
From this solution it is clear that the region of satisfactory $x$s and $y$s is
bounded by $x = 0$, $y = 0$, and $y = 265 - x$.
Here is a plot of the feasability region:
\begin{center}
\begin{tikzpicture}[line cap=round,line join=round,>=triangle 45,x=1cm,y=1cm]
\begin{axis}[
x=0.03cm,y=0.03cm,
axis lines=middle,
xmin=-10,ymin=-10,xmax=275,ymax=275]
\fill[line width=2pt,color=zzttqq,fill=zzttqq,fill opacity=0.10000000149011612]
(0,265) -- (0,0) -- (265,0) -- cycle;
\draw [line width=2pt,color=zzttqq] (0,265)-- (0,0);
\draw [line width=2pt,color=zzttqq] (0,0)-- (265,0);
\draw [line width=2pt,color=zzttqq] (265,0)-- (0,265);
\end{axis}
\end{tikzpicture}
\end{center}
We then proceed to evaluate the maximization function at all verticies of the
feasability region, i.e. $\{ (0, 0), (0, 265), (265, 0) \}$.
\[ m(x, y) = 85x + 110y \]
\[\begin{aligned}
m(0,0) = 0 \\
m(0,265) = 29150 \\
m(265,0) = 22525 \\
\end{aligned}\]
We then conclude the tailor should produce 265 trousers of the second type, for
a revenue of 29,150.-- Fr.
\section{Implementation of the Simplex Method [35 points]}
In this first part of the assignment, you are required to complete 2 functions
which are part of a dummy implementation of the simplex method. Specifically you
have to complete the TODOs in:
\begin{itemize}
\item \emph{standardise.m}, which writes a maximisation or minimisation input
problem in standard form;
\item \emph{simplexSolve.m}, which solves a maximisation or minimisation
problem using the simplex method.
\end{itemize}
You are given also some already-implemented functions to help you in your task:
\emph{simplex.m} is a wrapper which calls all the functions necessary to find a
solution to the linear program; \emph{auxiliary.m} solves the auxiliary problem
to find a feasible starting basic solution of the linear program;
\emph{printSol.m} is a function which prints the optimal solution found by the
simplex algorithm. Finally, \emph{testSimplex.m} presents a series of 6
problems to check if your implementation is correct, before moving to the next
part of the assignment. Additional details to aid you in your implementation
can be found in the comments inside the code.
\section{Applications to Real-Life Example: Cargo Aircraft [25 points]}
In this second part of the assignment, you are required to use the simplex
method implementation to solve a real-life problem taken from economics
(constrained profit maximisation).
A cargo aircraft has 4 compartments (indicated simply as $S_1,\dots,S_4$) used
to store the goods to be transported. Details about the weight capacity and
storage capacity of the different compartments can be inferred from the data
reported in the following table:
\begin{center}
\begin{tabular}{||c | c | c ||}
\hline
Compartment & Weight Capacity ($t$) & Storage Capacity ($m^3$) \\ [0.5ex]
\hline\hline
$S_1$ & 18 & 11930\\
\hline
$S_2$ & 32 & 22552\\
\hline
$S_3$ & 25 & 11209\\
\hline
$S_4$ & 17 & 5870\\
\hline
\end{tabular}
\end{center}
The following four cargos are available for shipment during the next flight:
\begin{center}
\begin{tabular}{|| c | c | c | c ||}
\hline
Cargo & Weight ($t$) & Volume ($m^3/t$) & Profit ($\text{CHF}/t$) \\ [0.5ex]
\hline\hline
$C_1$ & 16 & 320 & 135 \\
\hline
$C_2$ & 32 & 510 & 200 \\
\hline
$C_3$ & 40 & 630 & 410 \\
\hline
$C_4$ & 28 & 125 & 520 \\
\hline
\end{tabular}
\end{center}
Any proportion of the four cargos can be accepted, and the profit obtained for each cargo is increased by $10\%$ if it is put in $S_2$, by $20\%$ if it is put in $S_3$ and by $30\%$ if it is put in $S_4$, due to the better storage conditions. The objective of this problem is to determine which amount of the different cargos will be transported and how to allocate it among the different compartments, while maximising the profit of the owner of the cargo plane. Specifically you have to:
\begin{enumerate}
\item Formulate the problem above as a linear program: what is the objective function? What are the constraints? Write down all equations, with comments explaining what you are doing.
\item Create a script \emph{exercise2.m} which uses the simplex method implemented in the previous exercise to solve the problem. What is the optimal solution? Visualise it graphically and briefly comment the results obtained (are you surprised of this outcome on the basis of your data?).
\end{enumerate}
\section{Cycling and Degeneracy [15 points]}
Consider now the following simple problem:
\begin{alignat*}{2}
&\text{max}\;\, && z = 3x_1+4x_2,\\
&\text{s.t.} && 4x_1+3x_2\leq 12\\
& && 4x_1+x_2\leq 8\\
& && 4x_1+2x_2\leq 8\\
& && x_1, x_2 \geq 0.
\end{alignat*}
\begin{enumerate}
\item Create a script \emph{exercise3.m} which uses the simplex method implemented above to solve this problem. Do you achieve convergence within the maximum number of iterations (given by the maximum number of possible basic solutions)? Do you notice any strange behaviour? (\emph{hint:} check, e.g., the indices of the entering and departing variables)
\item Look at the number of constraints and at the number of unknowns: what can you notice about the underlying system of equations? Represent them graphically and try to use this information to explain the behaviour of your solver in the previous point.
\end{enumerate}
\end{document}

BIN
mp6/usi_inf.pdf Normal file

Binary file not shown.