From: Ian Jackson Date: Sat, 5 Sep 2009 19:11:07 +0000 (+0100) Subject: Implement capacity limit X-Git-Tag: 3.4~7 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.main.git;a=commitdiff_plain;h=59464c798776cdd7f4fffbca4540238ddc5d7cbe Implement capacity limit --- diff --git a/yarrg/web/routetrade b/yarrg/web/routetrade index 831a1b1..e5e59aa 100644 --- a/yarrg/web/routetrade +++ b/yarrg/web/routetrade @@ -46,11 +46,6 @@ $lossperleaguepct da_pageload= Date.now(); -% if (defined $max_mass || defined $max_volume) { -WARNING - VESSEL CAPACITY LIMIT NOT YET IMPLEMENTED -

-% } - <%perl> my $loss_per_league= defined $lossperleaguepct ? $lossperleaguepct*0.01 : 1e-7; @@ -425,16 +420,50 @@ foreach my $flow (@flows) { foreach my $cstname (sort keys %avail_csts) { my $c= $avail_csts{$cstname}; $cplex .= " - ". sprintf("%-30s","$cstname:")." ". + ". sprintf("%-30s","$cstname:")." ". join("+", @{ $c->{Flows} }). " <= ".$c->{Qty}."\n"; } +foreach my $ci (0..($#islandids-1)) { + my @rel_flows; + foreach my $f (@flows) { + next if $f->{Suppress}; + next if $f->{'org_id'} == $f->{'dst_id'}; + next unless grep { $f->{'org_id'} == $_ } + @islandids[0..$ci]; + next unless grep { $f->{'dst_id'} == $_ } + @islandids[$ci+1..@islandids-1]; + push @rel_flows, $f; +print " RELEVANT $ci $f->{Ix} "; + } +print " RELEVANT $ci COUNT ".scalar(@rel_flows)." "; + next unless @rel_flows; + foreach my $mv (qw(mass volume)) { + my $max_vn= "max_$mv"; + my $max= $mv eq 'mass' ? $max_mass : $max_volume; + next unless defined $max; +print " DEFINED MAX $mv $max "; + $cplex .= " + ". sprintf("%-10s","${mv}_$ci:")." ". + join(" + ", map { ($_->{"unit$mv"}*1e-3).' f'.$_->{Ix} } @rel_flows). + " <= $max"; + } + $cplex.= "\n"; +} + $cplex.= " Bounds ".(join " ", map { "$_->{Var} >= 0" } @flows)." +"; + +$cplex.= " +Integer + ".(join " + ", map { "f$_" } (0..$#flows))." + End "; @@ -457,7 +486,7 @@ if ($qa->{'debug'}) { while (<$output>) { $glpsol_out.= $_; print encode_entities($_) if $qa->{'debug'}; - if (m/^\s*No\.\s+Column name\s+St\s+Activity\s/) { + if (m/^\s*No\.\s+Column name\s+(?:St\s+)?Activity\s/) { die if $found_section>0; $found_section= 1; next;