追寻单纯形法的几何直观

先上代码,等忙完年终检查再补上。
require 'pp'
require 'set'

DEBUG = false

class String
	def to_terms() self.gsub("-", "+-").split(/\s*\+/).select{|e| e != ""} end
	
	def to_pair
		r = /
			 ( (\-)? (\d+(\.\d+)?)? )	# e.g. -3.2, 4, -
			 \*?
			 (\w+ (\d+)?)				# e.g. x2
			/x
		if r =~ self.gsub(/\s+/, "")
			c = $3.nil? ? 1 : $3.to_f
			c = -c if not $2.nil?
			return $5.to_sym, c
		else
			p "err!"
		end
	end
end

class Array
	def scalar_mult!(c) self.map! {|e| e*c} end
	def scalar_mult(c) self.map {|e| e*c} end
	def vector_add!(v) self.each_with_index {|_, i| self[i] += v[i]} end
end

class Hash
	def dot_prod
		e = []
		self.each do |k, v|
			if v != 0
				if v == 1
					e << k.to_s
				elsif v == -1
					e << ("-" + k.to_s)
				else
					e << (v.to_s + k.to_s)
				end
			end
		end
		e.join(' + ').gsub("+ -", "- ")
	end
end

class Simplex
	def initialize(path)
		m = /
			 (max|Maximize) \s+ (.+?) \n
			 \s* (s\.t\.|subject \s+ to) \s+ (.+?)\.
			/mx
		
		if m =~ File.read(path)
			@z_equ = {:b => 0}			# objective equation
			$2.to_terms.each do |term|
				k, v = term.to_pair
				@z_equ[k] = -v
			end
	 
			@nonbasic_vars = []
			@basic_vars = []
			@matrix = []
			idx = 1
			$4.split(/[\n,]/).each do |inequalities|
				if / (\w+(\d+)?) \s* >= \s* 0 /x =~ inequalities		# xi >= 0
					@nonbasic_vars << $1.to_sym
				elsif / \s* (.+?) \s* <= \s* (\d+(\.\d+)?) /x =~ inequalities
					lhs, rhs = $1.to_s, $2.to_f
					equ = {:b => rhs, :"$#{idx}" => 1}
					@basic_vars << :"$#{idx}"
					idx += 1
					lhs.to_terms.each do |t|
						k, v = t.to_pair
						equ[k] = v
					end
					@matrix << equ
				else
					p "err!"
				end
			end
		else
			p "err!"
		end
	end
	
	def canonical_form
		@vars = @nonbasic_vars + @basic_vars
		@mtr = [[]]		# coefficient matrix
		@vars.each_with_index do |x, k|
			@mtr[0][k] = @z_equ[x] || 0
		end
		@mtr[0] << @z_equ[:b]
		@matrix.each_with_index do |row, i|
			ary = []
			@vars.each_with_index do |x, j|
				ary[j] = row[x] || 0
			end
			ary << row[:b]
			@mtr << ary
		end
		puts "max " + @z_equ.dot_prod
		print "s.t.\n"
		@matrix.each {|r| print "#{r.select{|k, v| k!=:b}.dot_prod} = #{r[:b]}\n"}
		print "and " + @vars.join(" >= 0, ") + " >= 0.\n"
		
		
	end
	
	def mtr_display()
		@mtr.each do |r|
			puts Hash[*@vars.zip(r).flatten].dot_prod + " = #{r[-1]}"
		end
	end
	
	def solve
		DEBUG && puts("---------------------------------------------------------------")
		DEBUG && mtr_display
		pivot_c = @mtr[0].min
		pivot_var = @mtr[0].index pivot_c
		if pivot_c >= 0
			@z_max = @mtr[0][-1]
		else
			n = @mtr.size - 1
			idx = 1
			_a = @mtr[1][pivot_var]
			_b = @mtr[1][-1]
			(1..n).each do |i|
				idx = i if _a * @mtr[i][-1] < _b * @mtr[i][pivot_var]
			end
			v_i = @vars.index :"$#{idx}"
			c = 1.0/@mtr[idx][pivot_var]
			@mtr[idx].scalar_mult! c
			@mtr.each_with_index do |row, i|
				if i != idx
					row.vector_add!(@mtr[idx].scalar_mult(-@mtr[i][pivot_var])) 
				end
			end
			DEBUG && puts("			...(#{@vars[v_i]} -> #{@vars[pivot_var]})...")
			DEBUG && mtr_display
			self.solve
		end
		@z_max
	end
end

s = Simplex.new("./simplex.data")
s.canonical_form
puts "\nf(z)_max = #{s.solve}"


simplex.data:

max 2x1 + x2
s.t.  	x1 <= 4
		2x1 + 3x2 <= 12
		x1 + x2 <= 5
		x1 >= 0, x2 >= 0.

输出:

max -2.0x1 - x2
s.t.
$1 + x1 = 4.0
$2 + 2.0x1 + 3.0x2 = 12.0
$3 + x1 + x2 = 5.0
and x1 >= 0, x2 >= 0, $1 >= 0, $2 >= 0, $3 >= 0.

f(z)_max = 9.0


### IntelliJ IDEA 操作快捷键列表 以下是一些常用的 IntelliJ IDEA 快捷键,涵盖代码编辑、项目管理、调试等多个方面: #### 代码编辑 - **导入包、自动修正**:`Alt+Enter` 可以快速导入缺失的包或进行代码修正[^1]。 - **生成代码**:`Alt+Insert` 可以生成常见的代码结构,如构造函数、getter 和 setter 方法等[^1]。 - **格式化代码**:`Ctrl+Alt+L` 用于格式化当前文件中的代码[^1]。 - **优化导入的类和包**:`Ctrl+Alt+O` 能够移除未使用的导入项并优化代码结构[^1]。 - **查找类**:`Ctrl+N` 快速定位到指定的类。 - **查找文件**:`Ctrl+Shift+N` 快速查找项目中的文件。 - **复制行**:`Ctrl+D` 将当前行复制到下一行[^2]。 - **删除行**:`Ctrl+X` 删除当前行[^2]。 #### 调试与运行 - **停止程序**:`Ctrl+F2` 停止正在运行的程序[^3]。 - **选择 Debug 配置**:`Alt+Shift+F9` 打开调试配置选择窗口[^3]。 - **选择 Run 配置**:`Alt+Shift+F10` 打开运行配置选择窗口[^3]。 - **编译文件**:`Ctrl+Shift+F9` 编译当前文件或模块。 - **运行至光标处**:`Alt+F9` 运行程序直到光标所在位置[^3]。 - **强制运行至光标处**:`Ctrl+Alt+F9` 强制运行至光标处。 - **步过**:`F8` 执行当前行但不进入方法内部[^3]。 - **步入**:`F7` 进入当前行的方法调用。 - **智能步入**:`Shift+F7` 提供更智能的步入选项[^3]。 - **步出**:`Shift+F8` 从当前方法中跳出并继续执行[^3]。 #### 项目管理 - **切换到项目视图**:`Alt+1` 显示项目结构。 - **切换到收藏视图**:`Alt+2` 查看收藏的文件或目录[^3]。 - **切换到 TODO 视图**:`Alt+6` 显示待办事项列表[^3]。 - **查看结构**:`Alt+7` 显示当前文件的结构概览[^3]。 - **同步项目**:`Ctrl+Alt+Y` 同步项目文件与磁盘上的更改。 #### 其他实用快捷键 - **查找文本**:`Ctrl+F` 在当前文件中查找文本。 - **实现方法**:`Ctrl+I` 自动生成接口或抽象类的方法实现[^2]。 - **复制路径**:`Ctrl+Shift+C` 复制文件的路径或引用[^3]。 - **快速切换方案**:`Ctrl+~` 切换界面外观、代码风格或快捷键映射等配置[^3]。 - **还原默认布局**:`Ctrl+Shift+F12` 恢复 IDE 的默认窗口布局[^3]。 - **隐藏/恢复所有窗口**:`Ctrl+Shift+F12` 隐藏或显示侧边栏和其他工具窗口[^3]。 ```python # 示例:使用快捷键优化代码 class Example: def __init__(self, value): self.value = value # 使用 Alt+Insert 快速生成 getter 和 setter def get_value(self): return self.value def set_value(self, value): self.value = value ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值