--------------------------------------------------------------------------- g1: [2.0] ------------------- O programa de vocês tem muitos erros sintáticos e em nenhum sequer é feito o "pivoteamento" de alguma coluna. main: - porque só quando matriz A é quadrada ? - o programa principal deveria, a partir de qualquer PL canônico, resolvê-lo, - qual a idéia da função de nome "table" ? ep: - o que a função "table" deveria fazer ? não é necessário montar o "tableu" explicitamente (revejam o algoritmo que discutimos) - erros sintáticos "[X]function = esc(T,l)" -> seria "function [X] = esc(T,l)" ? "nl", de "for lin=1:(1 + nl)", indefinido na função "esc" - só tentam "pivotar" nas linhas 1 e 2 ? "if T(lin,1) ~= 0", "T(lin,2) ~= 0" e "T(lin,2) == 0" - qual o significado de "if T(j,k)/b(j) < T(lpivo,k)/b(lpivo)" testes: - não está num formato que o "exec" funcione, p.e., "1) A=[1 1; 1 -1] //maximizar" => "!--error 40" - poderiam ter substituido o "pause" por "input" ou "getf": "x=input("Tecle ENTER para continuar");" ou "printf("Tecle ENTER para continuar"); scanf("%c");" - "sendo:" e "2.5 <= x1" (dentre outros), NÃO são comandos válidos Scilab --------------------------------------------------------------------------- g2: [8.5] ------------------- simplex.sci: - ruim inverter sinal de "c" ("c = -c"), se for para testar gamma >= 0, melhor deixar a forma gamma <= 0 preservando-se o sinal de c - erro na construção da base inicial "//Montagem da base inicial I = zeros(A);" "A" em geral NÃO é quadrada !!! Trocar por "I=zeros( size(A,1),size(A,1) );" - estão perdendo os valores originais (da matriz...): "A = [A I]" e "c = [c zeros(1,nlin)];" - não fizeram a fase zero do Simplex (achar a primeira base) nesta fase decide-se se o problema é inviável - no laço "while j <=ncol & encontrou==0" é muito melhor usar um "break" no lugar do "if ...encontrou = 1" - não imprimiram a solução na forma original, isto é, no R^n (imprimira apenas o "b" que é do R^m, mas NÃO se sabe em que posição está b(1), b(2) e assim por diante --------------------------------------------------------------------------- g3: [6.0] ------------------- - dentro de "ep1" vocês fazem uma inversão explícita da base, "bbarra = Ainv*b;", no método Simplex isso NÃO é necessário !!!! este é o papel do "pivoteamento" - a base inicial (B) deveria ser construida pela fase zero do programa - no ex. (3), "// Exemplo (3)", vocês usam 14 variáveis articiais. Por que ? (10 bastariam) - tentei acertar o programa de vocês, arrumei as entradas, mas ainda assim a resposta está errada (pára antes do ótimo) tive bastante trabalho para fazer esta "arrumação" - após "arrumações", o ex. (1) respondeu certo mas o (2) não (respondeu (0,0))!! --------------------------------------------------------------------------- g4: [9.0] ------------------- - vocês deveriam ter implementado uma FUNÇÃO simplex => recebe parâmetros ! (vocês fizeram a entrada de dados dentro da função!!) - erros de dimensionamento na fç "simplex" como estave certo lambda = invAb' * caux(base)'; -> lambda = invAb' * caux(base); gama = lambda' * Aaux - caux; -> gama = lambda' * Aaux - caux'; - com arrumação (1) => reponde certo vo= 7 e x=[3,1(,0,0)] (2) => reponde certo vo= 7 e x=[1.5,0.5(,0,0)] (3) => reponde certo vo=158 e x=[ 1.25, 0.5, 0.3, 0.5, 0.4, 4.05, 0.0, 2.0, 0.55, 0.0, 1.75, 2.3, 0.0, 0.0, 0.0 ] x1 = [ 1.4; 0.5; 0.0; 0.5; 0.4] x2 = [ 2.8; 8.0; 1.0; 1.9; 0.9] (4) => reponde vo=3.236842 e x=[2.5 1.05 0 2.525 1 4 4.3916666666667 0 0 0 3.2 0 0 12 0 3.05 .5 3 4.3] --------------------------------------------------------------------------- g5: [2.0] ------------------- - vocês não conseguiram fazer o programa funcionar... - primeiro erro que notei foi que p/ o Scilab é obrigatório colocar o protótipo da fç na primeira linha do arquivo ("function [v1,v2,v0]=simplex(A,b,B,c)") e vocês a colocarm após vários comentários! - outro erro, o identificador "cond" é palavra reservada do Scilab. Se vocês tivessem rodado teriam recebido a msg de erro "bad call to primitive:cond". "Primitive" significa aqui palavra reservada. - Bem, vai ficar complicado dar uma nota deste modo. Tentem trabalhar mais no programa, mas sigam as dicas que dei e olhem os exemplos que coloquei na página - favor documentar o programa, coloquem comentários em todos os laços indicado de que se trata, enfim, coloquem comentários em todos os pontos importantes do algoritmo. - Vou pensar o que fazer com a nota de vocês e outros casos análogos. Mas começem a trabalhar na correção, OK ? --------------------------------------------------------------------------- g6: [7.0] ------------------- - truque para pegar maior número positivo ? "aux(j) = 9999999;" (linha 59) - vocês não preservam a ordem original dos dados, p.e., devolve só a parte básica da solução e nem diz onde ela se encais no espaço original com este problema nem dá para conferir se A*x = b - estão exigindo que o usuário forneça a base inicial!!! era p/ implementar a fase zero para resolver isso - Resposta: (1) 7.0 [1, 3] (2) 7.0 [0.5, 1.5] (3) diz que é inviável!! com meu novo arquivo de entrada a resposta ficou razoável 158 [ 4.2, .5, 2, 1.4, .3, 1.9, 2.3, .5, .4, .4] --------------------------------------------------------------------------- g7: [2.0] ------------------- - seus testes 2 e 3 não estão corretos, pois supões que o problema estivesse na forma canônica, quando os fornece na forma Ax<=b, x>=0 - seu arquivo, mesmo com pequenas correções não está funcionando - não é necessário inverter explicitamente matrizes no Simplex "Binv = inv(B)"