The result seems interesting and finally i knew there would be some guy doing code stuffs.
Just a small reminder, while look into your code, the shield in attack should be calculated by int%(i believe?) for example when gs shot ds ds would only lose 1000 shield(rather than 1100 as I think). It doesn't that matter but still need to point that out. ( also I'm not sure but might be the edge case the explode happens only when <70% rather than <= 70%? It might matter when LL shoting heavy ships and one more hit on 70% border might matter the ratios a lot).
Anyway, why gradient Ascent lul( I personally dont think the problem is near-convex but anyway it might be a good way to approx) (but since you have already use the GA on attackers, why not on defenders as well 0 .0)
Anyway GJ!