Home> Blog Archives

Blog Archives

Upload de arquivos remotos usando PHP

novembro 25, 2011 Category :Notícia Off

Eis um problema que eu não imaginava que seria tão simples de resolver.

Esse problema veio da necessidade de puxar um arquivo de um outro servidor (Ex: http://marcosiran.wordpress.com/file/livro.pdf) e criar uma cópia em um servidor destino (Ex: http://www.site.com/arquivos/livro.pdf). Isso sem a intervenção de um usuário para baixar o arquivo e em seguida enviar por um formulário usando move_uploaded_file.

Obs: Meu amigo samuel me deu uma grande ajuda nisso ai!

$origem = "http://marcosiran.wordpress.com/file/livro.pdf";
$destino = "arquivos/livro.pdf";
$orig = fopen($origem, "r");
$dest = fopen($destino, "w");
while (!feof($orig)) {
     $line = fread ($orig, 1024*10);
     fwrite($dest, $line);
}
fclose($orig);
fclose($dest);

Algoritimo Simplex para problemas de Maximização

novembro 25, 2011 Category :Computação| JavaScript| Notícia| PHP| Web Off

Realizado como trabalho na faculdade. Profº mandou ver e ainda faltou o minimizar e o método das duas fazes!!!

<?php
if(!$_POST){
?>
<form id="form1" name="form1" method="post" action="">
<table width="550" border="0" cellspacing="2" cellpadding="0">
<tr>
<td width="127"><label for="foo2">Função Objetivo(Z):</label></td>
<td width="417"><label>
<input name="foo" type="text" id="foo2" value="3x1 +5x2" size="30" />
<input name="tipo" type="radio" id="tipo_0" value="MAX" checked="checked" />
MAX</label>
</td>
</tr>
<tr>
<td valign="top"><label for="restricoes">Restrições:</label></td>
<td><textarea name="restricoes" id="restricoes" cols="45" rows="4">x1 <= 4
x2 <= 6
3x1 +2x2 <= 18</textarea></td>
</tr>
<tr>
<td valign="top"> </td>
<td><input type="submit" name="CALCULAR" id="CALCULAR" value="CALCULAR" /></td>
</tr>
</table>
</form>
<? }else{

echo "<pre>";

class algoritmo_simplex{

public $post;
public $variaveis;
public $restricoes = "";
public $v_basicas_iniciais = "";
public $b;
public $foo;
public $coe_foo;
public $matriz_iteracao;
public $b_foo = 0;

public function __construct($post){
$this->post = $post;
$this->foo = $post[foo];
$this->restricoes = explode("<br />",nl2br($this->post[restricoes]));

//limpando espaços em branco das restrições
for($i=0;$i<count($this->restricoes);$i++){
$this->restricoes[$i] = trim($this->restricoes[$i]);
}

//obeter ultimi indece para a variavel de folga
$num_variaveis_foo = $this->proximo_x()-1;

//tranformado restrições em igualdade (parametros: restrições e ponteiro para as variaveis basicas iniciais)
$this->restricoes = $this->tranforma_igualdade();

//quantidade de varias no problema
$total_num_variaveis = $num_variaveis_foo + count($this->v_basicas_iniciais);

//obtendo todas as variaveis
for($i=1;$i<=$total_num_variaveis;$i++){
$this->variaveis[] = "x$i";
}

$this->get_coeficientes_foo();
}

function remover_x($str){
for($i=1;$i<=20;$i++){
$str = str_replace("x$i","",$str);
$str = str_replace("+","",$str);
if($str=='' or $str=='+' or $str=='-') $str .= "1";
}
return $str;
}

function get_coeficientes(){
$var = $this->variaveis;
$func = $this->restricoes;
$i=0;
foreach($func as $r){
$r = explode(" = ",$r);
$this->b[] = $r[1];
$r = $r[0];
//for para complementar coeficientes das variaveis de folga
for($j=0;$j<count($var);$j++){
if(!stristr($r,$var[$j])){
$r .= " 0".$var[$j];
}
}
$l = "";
//for para montar a função com todas as variaveis de folga
$termos = explode(" ",$r);
foreach($var as $v){
foreach($termos as $t){
if(stristr($t,$v)!='')
$l[] = $t;
}
}
$linhas[$i] = $l;
$i++;
}
//aki motra o vetor das restrições com as variaveis de folga e coeficientes return ($linhas);
for($i=0;$i<count($linhas);$i++){
for($j=0;$j<count($linhas[$i]);$j++){
$linhas[$i][$j] = $this->remover_x($linhas[$i][$j]);
}
}

//returna as linhas da matriz
return $linhas;
}

function get_coeficientes_foo(){
$var = $this->variaveis;
$r = $this->foo;
//for para complementar coeficientes das variaveis de folga
for($j=0;$j<count($var);$j++){
if(!stristr($r,$var[$j])){
$r .= " 0".$var[$j];
}
}

$l = "";
//for para montar a função com todas as variaveis de folga
$termos = explode(" ",$r);
foreach($var as $v){
foreach($termos as $t){
if(stristr($t,$v)!='')
$l[] = $t;
}
}
$linhas = $l;
//aki motra o vetor das restrições com as variaveis de folga e coeficientes return ($linhas);
for($j=0;$j<count($linhas);$j++)
if($this->post[tipo]=='MAX')
$linhas[$j] = (-1)*$this->remover_x($linhas[$j]);
else
$linhas[$j] = $this->remover_x($linhas[$j]);
//returna as linhas da matriz
$this->coe_foo = $linhas;
}

function proximo_x(){
$restr = $this->restricoes;
//obtendo o proximo indice do x
foreach($restr as $r){
$str = explode(" ",$r);
foreach($str as $r1):
for($i=0;$i<10;$i++){
if(strpos($r1,"x".$i)!='')
$xs[] = str_replace("x","",substr($r1,strpos($r1,"x".$i),2));
}
endforeach;
}
//prdena vetor
ksort($xs);
//ultimo indice +1
return end($xs)+1;
}

//metodo de transformação da restrições para igualdade
function tranforma_igualdade(){
$restr = $this->restricoes;
$j = $this->proximo_x($restr);
foreach($restr as $r){
$r = explode(" <= ",$r);
$restricoes[] = $r[0]." +x".$j." = ".$r[1];
$this->v_basicas_iniciais[] = "x".$j;
$j++;
}
return $restricoes;
}

//return o indice do maior negativo dos coe da foo
function maior_negativo(){
$menor = 0;
$j = -1;
for($i=0;$i<count($this->coe_foo);$i++){
if($this->coe_foo[$i]<$menor and $this->coe_foo[$i]!=0){
$menor = $this->coe_foo[$i];
$j = $i;
}
}
return $j;
}

function parar(){
$parar = false;
for($i=0;$i<count($this->coe_foo);$i++){
if($this->coe_foo[$i]<0){
$parar = false;
break;
}else
$parar = true;
}
return $parar;
}

function arredondar_dois_decimal($valor) {
$float_arredondar=round($valor * 100) / 100;
return $float_arredondado;
}

//função main
function main(){
$this->gerar_matriz(-1,-1);
echo '<br />------ ITERAÇÕES ------<br /><br />';
$contt = 1;
$parar = false;
while($contt<4){

if($this->parar())
$parar = true;

$indice = $this->maior_negativo();
//obtendo pivo [indice,j]
$menor = 9999;
for($i=0;$i<count($this->matriz_iteracao);$i++){
$n = $this->matriz_iteracao[$i][$indice];
if($n>0){
if(($this->b[$i]/$n)<$menor){
$menor = ($this->b[$i]/$n);
$linha = $i;
}
}
}
$pivo[$linha][$indice] = $this->matriz_iteracao[$linha][$indice];

$this->gerar_matriz($linha,$indice);

if($parar)
break;
echo "<br />------ ITERÇÃO $contt ------<br /><br />";

//substituindo variavel basica pela variavel nao basica da linha e coluna do pivo
$this->v_basicas_iniciais[$linha] = $this->variaveis[$indice];

//se o pivo não for igual a 1 faz o caluclo sobre a linha para tranformar em 1
if($pivo[$linha][$indice]!=1){
for($i=0;$i<count($this->matriz_iteracao[$linha]);$i++){
$num = "";
if($this->matriz_iteracao[$linha][$i]!=0){
$num = $this->matriz_iteracao[$linha][$i] / $pivo[$linha][$indice];
if(is_float($num))
$num = number_format($num,2);
$this->matriz_iteracao[$linha][$i] = $num;
}
}

//matriz B
$num = $this->b[$linha] /$pivo[$linha][$indice];
if(is_float($num))
$num = number_format($num,2);
$this->b[$linha] = $num;
}

//verifica a coluna do pivo se está na forma canonica, se não, transforma os elementos em ZERO
for($i=0;$i<count($this->matriz_iteracao);$i++){
if($this->matriz_iteracao[$i][$indice]!=0 and $i!=$linha){
//coeficientes das restições
$elemento = $this->matriz_iteracao[$i][$indice];
$elemento = $elemento*-1;

for($j=0;$j<count($this->matriz_iteracao[$i]);$j++){
$this->matriz_iteracao[$i][$j] =
($elemento * $this->matriz_iteracao[$linha][$j]) + $this->matriz_iteracao[$i][$j];
}

$this->b[$i] = ($this->b[$linha] * $elemento) + $this->b[$i];
}
}

//coeficientes da foo
$elemento = $this->coe_foo[$indice];
$elemento = $elemento*-1;

//calculo do termo independente da foo
$num = ($this->b[$linha] * $elemento) + $this->b_foo;
if(is_float($num))
$num = number_format($num,2);
$this->b_foo = $num;

for($j=0;$j<count($this->coe_foo);$j++){
$this->coe_foo[$j] =
($elemento * $this->matriz_iteracao[$linha][$j]) + $this->coe_foo[$j];
}

$contt++;
}
}

function gerar_matriz($pivoi,$pivoj){
echo "____|____";
foreach($this->variaveis as $v):
echo "<u>".$v."</u>____|____";
endforeach;
echo "<u>b</u>__n";

//inicializando matriz de coeficientes
if(!is_array($this->matriz_iteracao))
$this->matriz_iteracao = $matriz = $this->get_coeficientes();
else
$matriz = $this->matriz_iteracao;

for($i=0;$i<count($matriz);$i++){
echo " ".$this->v_basicas_iniciais[$i]." |";
for($j=0;$j<count($matriz[$i]);$j++){
if($pivoi == $i and $pivoj == $j)
echo "<strong>*".str_pad($matriz[$i][$j],8," ",STR_PAD_BOTH)."*|</strong>";
else
echo str_pad($matriz[$i][$j],10," ",STR_PAD_BOTH)."|";
}
echo str_pad($this->b[$i],10," ",STR_PAD_BOTH)."n";
}

echo "<div style='border-top:1px solid #000; width:550px;'> Z' |";
foreach($this->coe_foo as $v):
echo str_pad($v,10," ",STR_PAD_BOTH)."|";
endforeach;
echo str_pad($this->b_foo,10," ",STR_PAD_BOTH)."</div>";

}
}

$teste = new algoritmo_simplex($_POST);
$teste->main();
}
?>