chiark / gitweb /
Implement capacity limit
authorIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sat, 5 Sep 2009 19:11:07 +0000 (20:11 +0100)
committerIan Jackson <ian@liberator.relativity.greenend.org.uk>
Sat, 5 Sep 2009 19:11:07 +0000 (20:11 +0100)
yarrg/web/routetrade

index 831a1b1a26a2d46f051ec4265f8089cb13fbf7da..e5e59aadc66d64e77bea919b2022f9e2e7593050 100644 (file)
@@ -46,11 +46,6 @@ $lossperleaguepct
   da_pageload= Date.now();
 </&script>
 
-% if (defined $max_mass || defined $max_volume) {
-<strong>WARNING - VESSEL CAPACITY LIMIT NOT YET IMPLEMENTED</strong>
-<p>
-% }
-
 <%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;