X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~yarrgweb/git?p=ypp-sc-tools.db-live.git;a=blobdiff_plain;f=yarrg%2Fweb%2Froutetrade;h=397e3854372787170afe7e1861de55150aa6495a;hp=7e1a06e6b90fd5cd872bb5ca78048667a3018a6e;hb=991427d6209887f957d818367cf7643352093f1f;hpb=9493637c44b0e22b2b9f72cf9e2748585064be56 diff --git a/yarrg/web/routetrade b/yarrg/web/routetrade index 7e1a06e..397e385 100644 --- a/yarrg/web/routetrade +++ b/yarrg/web/routetrade @@ -40,20 +40,17 @@ $dbh $qa $max_mass $max_volume +$lossperleaguepct <&| script &> 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; + my $now= time; -my $loss_per_league= 1e-7; my @flow_conds; my @query_params; @@ -372,7 +369,7 @@ die "$cmpu $uue ?" if length $cmpu > 20;

% if (@islandids<=1) { -Route is trivial. +Route contains only one location. % } % if (!$specific) { Route contains archipelago(es), not just specific islands. @@ -390,9 +387,9 @@ my $cplex= " Maximize totalprofit: - ".(join " + + ".(join " ", map { - sprintf "%.20f %s", $_->{ExpectedUnitProfit}, $_->{Var} + sprintf "%+.20f %s", $_->{ExpectedUnitProfit}, $_->{Var} } @flows)." Subject To @@ -423,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 "; @@ -455,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; @@ -479,7 +510,14 @@ if ($qa->{'debug'}) { die $prerr unless $found_section; }; -$addcols->({ DoReverse => 1 }, qw( +$addcols->({ DoReverse => 1, Special => sub { + my ($flow,$col,$v,$spec) = @_; + if ($flow->{ExpectedUnitProfit} < 0) { + $spec->{Span}= 3; + $spec->{String}= '(Small margin)'; + $spec->{Align}= 'align=center'; + } +} }, qw( OptQty )); $addcols->({ Total => 0, DoReverse => 1 }, qw( @@ -558,16 +596,25 @@ $addcols->({ Total => 0, DoReverse => 1 }, qw( {UidShort} %> value=""> {UidShort} %> value="" <% $flow->{Suppress} ? '' : 'checked' %> > -% foreach my $ci (1..$#cols) { +% my $ci= 1; +% while ($ci < @cols) { % my $col= $cols[$ci]; +% my $spec= { +% Span => 1, +% Align => ($col->{Text} ? '' : 'align=right') +% }; % my $v= $flow->{$col->{Name}}; +% if ($col->{Special}) { $col->{Special}($flow,$col,$v,$spec); } % $col->{Total} += $v % if defined $col->{Total} and not $flow->{Suppress}; % $v='' if !$col->{Text} && !$v; % my $sortkey= $col->{SortColKey} ? % $flow->{$col->{SortColKey}} : $v; % $ts_sortkeys{$ci}{$rowid}= $sortkey; -{Text} ? '' : 'align=right' %>><% $v |h %> +{Span} ? "colspan=$spec->{Span}" : '' + %> <% $spec->{Align} + %>><% exists $spec->{String} ? $spec->{String} : $v |h %> +% $ci += $spec->{Span}; % } % }