totalprofit:
";
+my %stall_poe_limits;
+
foreach my $sf (@subflows) {
my $eup= $sf->{Flow}{ExpectedUnitProfit};
$eup *= (1.0-$loss_per_delay_slot) ** $sf->{Org};
$cplex .= sprintf "
%+.20f %s", $eup, $sf->{Var};
+ if ($qa->{ShowStalls}>=2) {
+ my $stall= $sf->{Flow}{'dst_stallid'};
+ push @{ $stall_poe_limits{$stall} }, $sf;
+ }
}
$cplex .= "
$cplex.= "\n";
}
+if ($qa->{ShowStalls}>=2) {
+ my $stallpoe= $dbh->prepare(<<END);
+SELECT max(qty*price) FROM buy WHERE stallid=?
+END
+ foreach my $stallid (sort { $a <=> $b } keys %stall_poe_limits) {
+ $stallpoe->execute($stallid);
+ my ($lim)= $stallpoe->fetchrow_array();
+ $stallpoe->finish();
+ $cplex.= "
+ ". sprintf("%-15s","poe_$stallid:")." ".
+ join(" + ", map {
+ sprintf "%d %s", $_->{Flow}{'dst_price'}, $_->{Var};
+ } @{ $stall_poe_limits{$stallid} }).
+ " <= $lim";
+ }
+ $cplex.= "\n";
+}
+
$cplex.= "
Bounds
".(join "
my $input= pipethrough_prep();
print $input $cplex or die $!;
my $output= pipethrough_run_along($input, undef, 'glpsol',
- qw(glpsol --tmlim 2 --memlim 5 --intopt --cuts --bfs
+ qw(glpsol --tmlim 5 --memlim 5 --intopt --cuts --bfs
--cpxlp /dev/stdin -o /dev/stdout));
print "<pre>\n" if $qa->{'debug'};
my $found_section= 0;
%
% foreach my $i (0..$#islandids) {
<% $tbody->(1) %>
-<tr><td colspan=5>
+<tr>
% $iquery->execute($islandids[$i]);
% my ($islandname) = $iquery->fetchrow_array();
% if (!$i) {
+<td colspan=2>
<strong>Start at <% $islandname |h %></strong>
+<td colspan=2><a href="docs#posinclass">[what are these codes?]</a>
+<td>
% } else {
% my $this_dist= $distance->($islandids[$i-1],$islandids[$i]);
% $total_dist += $this_dist;
+<td colspan=5>
<%perl>
my $total_value= 0;
foreach my $sf (@subflows) {
} unless $$todo;
$$todo->{'commodname'}= $f->{'commodname'};
$$todo->{'posinclass'}= '';
- if ($f->{'posinclass'}) {
- my $findclass= $dbh->prepare(<<END);
+ my $incl= $f->{'posinclass'};
+
+ my $findclass= $dbh->prepare(<<END);
SELECT commodclass, maxposinclass FROM commodclasses WHERE commodclassid = ?
END
- $findclass->execute($f->{'commodclassid'});
- my $classinfo= $findclass->fetchrow_hashref();
- if ($classinfo->{'maxposinclass'} >= 8) {
+ $findclass->execute($f->{'commodclassid'});
+ my $classinfo= $findclass->fetchrow_hashref();
+ if ($classinfo) {
+ my $clname= $classinfo->{'commodclass'};
+ my $desc= encode_entities(sprintf "%s is under %s",
+ $f->{'commodname'}, $clname);
+ my $abbrev= substr($clname,0,1);
+ if ($incl) {
my $maxpic= $classinfo->{'maxposinclass'};
- my $inpic= $f->{'posinclass'};
- my @tmbs= qw(TT T M B BB);
- my @tmbds= ( 'in Top fifth of list',
- 'in 2nd fifth of the list',
- 'in Middle fifth of the list',
- 'in 2nd-bottom fifth of list',
- 'in Bottom fifth of the list');
- my $tmbi= ($inpic+0.5)*$#tmbs/$maxpic;
- my $desc= (sprintf "%s is under %s,".
- " commodity %d of %d;".
- " i.e. %s or %s",
- $f->{'commodname'},
- $classinfo->{'commodclass'},
- $inpic, $maxpic,
- $tmbs[$tmbi], $tmbds[$tmbi]);
- $$todo->{'posinclass'}=
- "<div class=mouseover title=\"$desc\">$tmbs[$tmbi]</div>";
+ $desc.= (sprintf ", commodity %d of %d",
+ $incl, $maxpic);
+ if ($classinfo->{'maxposinclass'} >= 8) {
+ my @tmbs= qw(0 1 2 3 4 5 6 7 8 9);
+ my $tmbi= ($incl+0.5)*$#tmbs/$maxpic;
+ $abbrev.= " ".$tmbs[$tmbi]." ";
+ }
}
+ $$todo->{'posinclass'}=
+ "<div class=mouseover title=\"$desc\">"
+ .$abbrev."</div>";
}
$$todo->{'stallname'}= $stallname;
$$todo->{Price}= $price;