I did a similar thing but in Perl because I am oldskool and I hate Python. It's somewhat ugly but it does the job. Passed the number of slots available and optionally a mass and/or power budget it will find the most powerful combination. You can also specify the base shield strength to see how it's modified.Here's a link to the Python code I use for my FdL
Code:
#!/usr/bin/perl
use Algorithm::Combinatorics;
use Getopt::Std;
our %opts;
getopt(':m:p:s:', \%opts);
my $base = $opts{'s'};
my $mounts = shift;
die "Usage: $0 [-m <mass>] [-p <power>] [-s <MJ>] <mounts>\n" unless $mounts;
my %boosters = (
'A' => { 'mass' => 3.5, 'power' => 1.2, 'shield' => 1.2 },
'B' => { 'mass' => 3, 'power' => 1, 'shield' => 1.16 },
'C' => { 'mass' => 2, 'power' => 0.7, 'shield' => 1.12 },
'D' => { 'mass' => 1, 'power' => 0.5, 'shield' => 1.08 },
'E' => { 'mass' => 0.5, 'power' => 0.2, 'shield' => 1.04 }
);
my %candidates;
my @keys = keys %boosters;
foreach my $i (1..$mounts) {
my $p = Algorithm::Combinatorics::variations_with_repetition(\@keys, $i);
while ($r = $p->next) {
my $layout = join "", sort @$r;
my $mass = 0;
my $power = 0;
my $shield = 1;
foreach my $j (@$r) {
my $booster = $boosters{uc $j};
$mass += $$booster{'mass'};
$power += $$booster{'power'};
$shield += $$booster{'shield'} - 1;
}
next if $opts{'m'} && $mass > $opts{'m'};
next if $opts{'p'} && $power > $opts{'p'};
$candidates{$layout} = { 'mass' => $mass, 'power' => $power, 'shield' => $shield }
}
}
foreach my $c (reverse sort { my ($A, $B) = ($candidates{$a}, $candidates{$b}); return length $a <=> length $b if $$A{'shield'} == $$B{'shield'}; return $$A{'shield'} <=> $$B{'shield'}; } keys %candidates) {
my $candidate = $candidates{$c};
printf "%s:\tMass %.1fT power %.1f shield %.2f", $c, $$candidate{'mass'}, $$candidate{'power'}, $$candidate{'shield'};
printf " strength %.2f (%.2f)", $base * $$candidate{'shield'}, $base if $base;
printf "\n";
}
For example on a ship with a 385.1MJ shield, 3 slots available, a mass budget of 3.5T and power budget of 1.2MW:
Code:
DDE: Mass 2.5T power 1.2 shield 1.20 strength 462.12 (385.10)
CEE: Mass 3.0T power 1.1 shield 1.20 strength 462.12 (385.10)
CD: Mass 3.0T power 1.2 shield 1.20 strength 462.12 (385.10)
BE: Mass 3.5T power 1.2 shield 1.20 strength 462.12 (385.10)
A: Mass 3.5T power 1.2 shield 1.20 strength 462.12 (385.10)
DEE: Mass 2.0T power 0.9 shield 1.16 strength 446.72 (385.10)
DD: Mass 2.0T power 1.0 shield 1.16 strength 446.72 (385.10)
CE: Mass 2.5T power 0.9 shield 1.16 strength 446.72 (385.10)
B: Mass 3.0T power 1.0 shield 1.16 strength 446.72 (385.10)
EEE: Mass 1.5T power 0.6 shield 1.12 strength 431.31 (385.10)
DE: Mass 1.5T power 0.7 shield 1.12 strength 431.31 (385.10)
C: Mass 2.0T power 0.7 shield 1.12 strength 431.31 (385.10)
EE: Mass 1.0T power 0.4 shield 1.08 strength 415.91 (385.10)
D: Mass 1.0T power 0.5 shield 1.08 strength 415.91 (385.10)
E: Mass 0.5T power 0.2 shield 1.04 strength 400.50 (385.10)