Given a list of software dependencies and their known vulnerabilities, write an algorithm to determine the optimal upgrade path to resolve all critical security issues.
Input includes critical issue IDs and upgrade actions. Each action has an ID, dependency, cost, issues it resolves, and prerequisite action IDs. Return the minimum-cost sequence of action IDs, or [] if no valid sequence resolves every issue.
Use def optimal_upgrade_path(critical_issues, upgrades):; critical_issues is a list of strings and upgrades is a list of dictionaries. Assume action IDs are unique and there are at most 20 actions.
def optimal_upgrade_path(critical_issues, upgrades):